首页 > 解决方案 > 为什么这个程序有逻辑错误

问题描述

这是我为简单的评分考试编写的代码(我仍然是一个非常初学者),但是当我在(成绩)中输入错误时,它不会转到我创建的名为(FalseInput)的函数,以使用户能够重新-输入(等级)有什么建议怎么解决?以及总体上如何改进?这是问题所在的示例:

请输入您的姓名:rafeeq

Please Insert The Grade : as (这是一个输入错误)

你失败了

谢谢

#include <iostream>
#include <string>
using namespace std;

char Name[30];
int Grades;
const int MinGrade(50);

void FalseInput() {
    cout << "pleae enter the number again : ";
    cin >> Grades;

    if (Grades >= MinGrade) {
        cout << Name << " : " << "you passed\n";
        cout << Grades;
    } else if (Grades < MinGrade and cin.fail() == 0) {
        cout << "you failed\n";
    } else if (cin.fail() == 1) {
        cout << "its not a valid number\n";
        cin.clear();
        cin.ignore(1000, '\n');
        cout << endl;
        FalseInput();
    }
}

int main() {
    cout << "Please Type Your Name : ";
    cin.getline(Name, 30);
    cout << "Please Insert The Grade : ";
    cin >> Grades;
    if (Grades >= MinGrade) {
        cout << Name << " : " << "you passed\n";
        cout << "The Grade Achieved : " << Grades << "%";
    } else if (Grades < MinGrade) {
        cout << "you failed\n";
    } else if (cin.fail() == 1) {
        cout << "its not a valid number\n";
        cin.clear();
        cin.ignore(1000, '\n');
        cout << endl;
        FalseInput();
    }

    return 0;
}

标签: c++

解决方案


您不检查int此处的提取是否成功:

cin >> Grades;

您可以像这样在提取后检查输入流的状态,它必须是第一个条件,否则程序将与MinGradefirst 进行比较并获得trueon Grades < MinGrade

    if(!(cin >> Grades)) {
        if(cin.eof()) {
            // You can't recover the input steam from eof so here you need
            // to handle that. Perhaps by terminating the program.
        }
        cin.clear();
        cin.ignore(1000, '\n');
        cout << endl;
        FalseInput();
    } else if(Grades >= MinGrade) {
        cout << Name << " : " << "you passed\n";
        cout << "The Grade Achieved : " << Grades << "%";
    } else if(Grades < MinGrade) {
        cout << "you failed\n";
    }

您确实有很多不必要的代码重复,并且您还使用数组char来读取名称 - 但您已经包含<string>了,所以我假设您熟悉std::string. 我建议使用它。

简化:

#include <iostream>
#include <limits>
#include <string>

int main() {
    const int MinGrade = 50;
    std::string Name;
    int Grades;

    std::cout << "Please Type Your Name : ";
    if(std::getline(std::cin, Name)) {
        while(true) {
            std::cout << "Please Insert The Grade : ";
            if(!(std::cin >> Grades)) {
                if(std::cin.eof()) {
                    std::cout << "Bye bye\n";
                    break;
                }
                std::cin.clear();
                std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
                std::cout << "That's not a valid number!\nPlease enter the "
                             "number again!\n";
            } else if(Grades >= MinGrade) {
                std::cout << Name << " : " << "you passed\n";
                std::cout << "The Grade Achieved : " << Grades << "%\n";
                break;
            } else {      // no need to check "Grades < MinGrade" here
                std::cout << "you failed\n";
                break;
            }
        }
    }
}

推荐阅读