gpt4 book ai didi

C++ 家庭作业,遇到一些边缘情况和异常输入

转载 作者:行者123 更新时间:2023-11-30 01:30:53 26 4
gpt4 key购买 nike

我有一个 C++ 作业要在接下来的几周内完成。任务是

  1. 读取一行包含 0 到 89 之间的 3 个分数的输入,并从同一行读取一个名字。
  2. 将这些分数转换为分数,并根据每个学生的分数给他们打分。

我的第一次剪辑已经完成了所有这些(尽管以一种困惑的方式),现在我正在考虑无效输入。我真正纠结的输入是如何处理只输入姓名的用户:即 Smith, B。

或者如果其中一个标记包含字母,即 10 c 20 Smith, B,会怎样

目前我的程序只是将它作为我认为的 int 读取并尝试继续 - 我希望它把它当作一个字符串并输出:“Bad input line: Smith, B.”

有经验的程序员有办法处理这样的事情吗?我不想在我的代码中到处创建一堆 if 语句,因为这会让人难以理解。

#include <iostream>
#include <string>

using namespace std;

//function to check input validity
bool validateInput(int mark1, int mark2, int mark3, string name);
//function to check the scores
int checkScores(int mark1, int mark2, int mark3);

int main()
{
int mark1 = 0, mark2 = 0, mark3 = 0;
string name;

cin >> mark1 >> mark2 >> mark3;
getline (cin, name);
// continue if the input is valid
if (validateInput(mark1, mark2, mark3, name) == true)
{
checkScores(mark1, mark2, mark3);
}
else cout << "Bad Input Line: \t" <<
mark1 << " " << mark2 << " " << mark3
<< " " << name << endl;

return 0;
}

bool validateInput(int mark1, int mark2, int mark3, string name)
{
//return false if the scores are not valid
if (mark1 < 0 || mark1 > 50 || mark2 < 0 || mark2 > 50 || mark3 < 0 || mark3 > 50)
{
return false;
}
return true;
}

int checkScores(int mark1, int mark2, int mark3)
{
int mark1Mark = 0, mark2Mark = 0, mark3Mark = 0;
string candidateType;
//return the mark for the mark1 test
if (mark1 <= 10) mark1Mark = 1;
else if (mark1 <= 20) mark1Mark = 2;
else if (mark1 <= 30) mark1Mark = 3;
else if (mark1 <= 40) mark1Mark = 4;
else if (mark1 <= 50) mark1Mark = 5;
//return the mark for the mark2 test
if (mark2 <= 10) mark2Mark = 1;
else if (mark2 <= 20) mark2Mark = 2;
else if (mark2 <= 30) mark2Mark = 3;
else if (mark2 <= 40) mark2Mark = 4;
else if (mark2 <= 50) mark2Mark = 5;
//return the mark for the mark3 test
if (mark3 <= 10) mark3Mark = 1;
else if (mark3 <= 20) mark3Mark = 2;
else if (mark3 <= 30) mark3Mark = 3;
else if (mark3 <= 40) mark3Mark = 4;
else if (mark3 <= 50) mark3Mark = 5;

if (mark1Mark >= 5 && mark2Mark >= 5 && mark3Mark >= 5)
candidateType = "Exceptional";
else if (mark3Mark >= 2 && mark2Mark >= 2 && mark1Mark >= 2)
candidateType = "Pass";
else candidateType = "Fail";

cout << mark1Mark << " " << mark2Mark << " " << mark3Mark << " " << candidateType;
}

最佳答案

到目前为止,你做得很好。我会建议你不要使用

cin >> mark1 >> mark2 >> mark3; 

cin 因没有错误检查、在输入中留下东西、没有换行等而臭名昭著……

取而代之的是使用 getline 将整行一次性全部放入一个字符串中,然后使用 std::stringstream 通过错误检查将其解析出来

string input = "";
getline(cin, input);
stringstream instream(input);
if (instream >> mark1) {
// number ok do something
}
else {
// not a number in the input
// report it
}

关于C++ 家庭作业,遇到一些边缘情况和异常输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3949504/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com