c++ - 为什么这个程序有逻辑错误
问题描述
这是我为简单的评分考试编写的代码(我仍然是一个非常初学者),但是当我在(成绩)中输入错误时,它不会转到我创建的名为(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;
}
解决方案
您不检查int
此处的提取是否成功:
cin >> Grades;
您可以像这样在提取后检查输入流的状态,它必须是第一个条件,否则程序将与MinGrade
first 进行比较并获得true
on 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;
}
}
}
}
推荐阅读
- laravel - Laravel-admin:多对多关系不起作用
- android - Android,如果用户删除 SD 卡上的 SAF 树 uri(文件夹)。无法创建相同的文件夹
- azure-devops - 当“更改已经存在”时如何修复 YAML 文件转换任务?
- apache-spark-sql - 在 PowerQuery 中更新源:通过 ODBC 提取 Azure 数据
- r - 从 KableExtra 表对象以 R 笔记本格式正确呈现数学符号
- flutter - 如何确定一个偏移量是否包含在另一个偏移量区域中?
- c# - 在 SQL Server 中获取一组值
- google-chrome - 如何将“允许下载”添加到沙盒属性列表
- c++ - 无论如何将 WebView 或任何其他相同的对象包含到 c++ 项目中?
- android - 为 android x86 和 x86_64 架构编译 ijkplayer x264,错误:未知类型名称“v4si”