如何在C++ Student类中实现非1-5分数输入时抛出异常并捕获
原代码问题说明
- 异常捕获范围错误:抛出异常的
CalculateP()方法调用没有被包含在try块内,自然无法捕获异常 - 未实现题目要求的两个构造函数
- 分数校验逻辑错误:
- 要求分数区间为15,原代码用了05不符合需求
- 艺术分数的校验逻辑误写了
eng <=5,校验失效
- 细节错误:输出学生信息重复打印艺术分数、输入分数时提示语序号错误、初始状态下数值属性未初始化导致未定义行为
修正后完整代码
#include <iostream> #include <string> #define MAX 10 using namespace std; class Student { private: string name; string surname; string date_birth; double eng, grm, art, sng, math; double average_mark; double taverage_mark() { return (eng + grm + art + sng + math) / 5; } public: // 无参构造函数 Student() : name(""), surname(""), date_birth(""), eng(0), grm(0), art(0), sng(0), math(0), average_mark(0) {} // 三个string参数的构造函数 Student(string n, string s, string d) : name(n), surname(s), date_birth(d), eng(0), grm(0), art(0), sng(0), math(0), average_mark(0) {} void ChangeP(void); void CalculateP(void); void PasteP(void); }; void Student::ChangeP(void) { cout << "输入姓名: " << endl; cin >> name; cout << "输入姓氏: " << endl; cin >> surname; cout << "输入出生日期: " << endl; cin >> date_birth; } void Student::CalculateP(void) { cout << "输入英语成绩: "; cin >> eng; if (!(eng >= 1 && eng <= 5)) { throw string("英语成绩输入不合法,需在1~5区间内"); } cout << "输入艺术成绩: "; cin >> art; if (!(art >= 1 && art <= 5)) { throw string("艺术成绩输入不合法,需在1~5区间内"); } cout << "输入音乐成绩: "; cin >> sng; if (!(sng >= 1 && sng <= 5)) { throw string("音乐成绩输入不合法,需在1~5区间内"); } cout << "输入德语成绩: "; cin >> grm; if (!(grm >= 1 && grm <= 5)) { throw string("德语成绩输入不合法,需在1~5区间内"); } cout << "输入数学成绩: "; cin >> math; if (!(math >= 1 && math <= 5)) { throw string("数学成绩输入不合法,需在1~5区间内"); } average_mark = taverage_mark(); } void Student::PasteP() { cout << "姓名: " << name << "\n姓氏: " << surname << "\n出生日期: " << date_birth << "\n英语成绩: " << eng << "\n德语成绩: " << grm << "\n艺术成绩: " << art << "\n音乐成绩: " << sng << "\n数学成绩: " << math << "\n平均成绩: " << average_mark << endl << endl; } int main() { Student std[MAX]; int n, loop; cout << "输入学生数量: "; cin >> n; for (loop = 0; loop < n; loop++) { cout << "输入第" << loop + 1 << "个学生的基础信息:\n"; std[loop].ChangeP(); } cout << endl; for (loop = 0; loop < n; loop++) { cout << "输入第" << loop + 1 << "个学生的成绩:\n"; try { std[loop].CalculateP(); } catch (const string& e) { cerr << "错误: " << e << endl; // 若需要输入错误后重新录入当前学生成绩,可在这里补充循环逻辑 continue; } } cout << "\n学生信息汇总:\n"; for (loop = 0; loop < n; loop++) { cout << "第" << (loop + 1) << "个学生的详情:\n"; std[loop].PasteP(); } return 0; }
内容的提问来源于stack exchange,提问作者someone
相关产品推荐
相关产品推荐

