You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:36:03