基于自定义异常处理的C++学生成绩平均分及等级计算程序问询
完整实现:带自定义异常的学生成绩计算程序
我来帮你把这段不完整的C++程序补全并完善,完全满足你的需求——计算5门课的平均分和等级,同时对非法成绩(小于0或大于100)抛出自定义异常。先看完整的可运行代码:
#include<iostream> #include<exception> #include<string> using namespace std; // 自定义异常:成绩小于0 class lessex : public exception { public: const char* what() const noexcept override { return "Mark less than 0"; } }; // 自定义异常:成绩大于100 class morex : public exception { public: const char* what() const noexcept override { return "Mark greater than 100"; } }; class student { private: string name; string rollno; int marks[5]; double average; char grade; // 计算平均分 void calculateAverage() { int total = 0; for (int i = 0; i < 5; i++) { total += marks[i]; } average = static_cast<double>(total) / 5; } // 确定等级 void determineGrade() { if (average >= 90) { grade = 'A'; } else if (average >= 80) { grade = 'B'; } else if (average >= 70) { grade = 'C'; } else if (average >= 60) { grade = 'D'; } else { grade = 'F'; } } public: // 构造函数初始化姓名和学号 student(string n, string r) : name(n), rollno(r) {} // 输入5门成绩,非法则抛出异常 void inputMarks() { cout << "Enter 5 subject marks:\n"; for (int i = 0; i < 5; i++) { cout << "Mark " << i+1 << ": "; cin >> marks[i]; if (marks[i] < 0) { throw lessex(); } else if (marks[i] > 100) { throw morex(); } } // 输入合法后计算平均分和等级 calculateAverage(); determineGrade(); } // 输出学生信息和成绩结果 void displayResult() { cout << "\nStudent Details:\n"; cout << "Name: " << name << endl; cout << "Roll Number: " << rollno << endl; cout << "Average Marks: " << average << endl; cout << "Grade: " << grade << endl; } }; int main() { string name, rollno; cout << "Enter student name: "; getline(cin, name); cout << "Enter roll number: "; getline(cin, rollno); student s(name, rollno); try { s.inputMarks(); s.displayResult(); } catch (const lessex& e) { cerr << "Error: " << e.what() << endl; } catch (const morex& e) { cerr << "Error: " << e.what() << endl; } catch (...) { cerr << "Unknown error occurred!" << endl; } return 0; }
关键细节说明:
- 自定义异常类修正:原代码的
what()方法缺少const noexcept修饰符,这里补全了,确保符合C++标准库中exception基类的虚函数签名,避免编译警告或错误。 - Student类功能完善:
- 添加了私有成员
average(平均分)和grade(等级) - 新增
calculateAverage()和determineGrade()私有方法,分别处理平均分计算和等级判定 - 构造函数用于初始化学生的姓名和学号
inputMarks()方法负责输入成绩,一旦检测到非法值立即抛出对应异常displayResult()方法输出完整的学生成绩结果
- 添加了私有成员
- 主函数异常处理:通过
try-catch块捕获自定义异常,同时保留了兜底的catch(...)处理未知错误,保证程序的健壮性。
内容的提问来源于stack exchange,提问作者Ayush Pandey
相关产品推荐
相关产品推荐

