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

为何C++程序中用户输入的不同科目名打印时重复显示最后一个?

问题:成绩单科目名称全部显示为最后输入的科目

编写C++程序获取用户输入的科目名称及分数以生成成绩单,目前程序其他功能正常,但最终打印成绩单时,所有科目均显示最后输入的科目名称。例如输入Physics(80分)和Chemistry(70分)后,成绩单所有行都显示Chemistry,对应不同分数,已卡在此问题3小时,请求帮助。

原代码

#include <iostream>
using namespace std;

int main() {
    string fname, lname;
    int subjects;
    float totalMarks;
    cout << "Enter your first name: ";
    cin >> fname;
    cout << "Enter your last name: ";
    cin >> lname;
    cout << "Enter total marks: ";
    cin >> totalMarks;
    cout << "Marks of how many subjects: ";
    cin >> subjects;
    float subjectMarks[subjects];
    string subjectNames[subjects];
    for (int i = 0; i < subjects; i++) {
            for (int j = 0; j < subjects; j++) {
                cout << "Enter name of subject: ";
                cin >> subjectNames[j];
                break; // I've used 'break' to exit the inner loop and go to outer loop for
                       // entering the marks obtained in the subject
                };
            cout << "Enter marks obtained in the subject: ";
            cin >> subjectMarks[i];
    };

    cout << "Dear, " << fname << " " << lname << "! The subjects and their marks are shown below: \n";
    cout << "RESULTS IN SUBJECTS\n\n";
    for (int i = 0; i < subjects; i++) {
        for (int j = 0; j < subjects; j++) {
            cout << subjectNames[j] << "\t\t";
            break;
        }
        cout << subjectMarks[i] << endl;
    };

return 0;
}

问题分析

你的代码核心错误在于多余的内层循环导致数组下标使用错误:

  • 输入科目名称时,外层循环i遍历每个科目,但内层循环每次都从j=0开始,把输入的科目名称赋值给subjectNames[0],后续输入的科目会不断覆盖这个位置的值,最终subjectNames[0]存储的是最后一个输入的科目名称。
  • 打印成绩单时,同样用了内层循环只取subjectNames[0]的值,所以所有行都显示最后输入的科目名称。

修正后的代码

去掉不必要的内层循环,直接用外层循环的i作为数组下标,对应每个科目的名称和分数:

#include <iostream>
using namespace std;

int main() {
    string fname, lname;
    int subjects;
    float totalMarks;
    cout << "Enter your first name: ";
    cin >> fname;
    cout << "Enter your last name: ";
    cin >> lname;
    cout << "Enter total marks: ";
    cin >> totalMarks;
    cout << "Marks of how many subjects: ";
    cin >> subjects;
    // 注意:C++标准不支持变长数组(VLA),如果需要可移植性,建议用vector替代
    float subjectMarks[subjects];
    string subjectNames[subjects];
    
    for (int i = 0; i < subjects; i++) {
        cout << "Enter name of subject: ";
        cin >> subjectNames[i]; // 直接用i作为下标,存储到对应位置
        cout << "Enter marks obtained in the subject: ";
        cin >> subjectMarks[i];
    }

    cout << "Dear, " << fname << " " << lname << "! The subjects and their marks are shown below: \n";
    cout << "RESULTS IN SUBJECTS\n\n";
    for (int i = 0; i < subjects; i++) {
        cout << subjectNames[i] << "\t\t" << subjectMarks[i] << endl; // 直接用i对应科目和分数
    }

    return 0;
}

额外提示

C++标准中并不支持变长数组(即float subjectMarks[subjects]这种用变量定义数组大小的写法),虽然部分编译器(如GCC)支持作为扩展,但为了代码的可移植性,建议使用std::vector替代:

#include <vector>
// ...
vector<float> subjectMarks(subjects);
vector<string> subjectNames(subjects);

内容的提问来源于stack exchange,提问作者Muhammad Hasnain Awan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 16:10:25