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

C++ GPA分析器程序数组存储成绩全部为最后输入值的原因

GPA分析器C++程序数组元素全部为最后输入值的问题分析

核心问题原因

1. GetScores函数的循环逻辑错误

在GetScores函数的while循环中,每次输入一个成绩后,你用for循环遍历整个grades数组,把所有元素都赋值为当前输入的score。关键错误代码片段:

while (count != student.size) {
    cout << "Enter a grade: ";
    cin >> score;
    // 错误:每次输入都覆盖整个数组的所有元素
    for (int i = 0; i < student.size; i++) {
        student.grades[i] = score;
    }
    count++;
}

以输入3个成绩为例:

  • 第一次输入99.2,数组3个元素全被赋值为99.2
  • 第二次输入86.4,数组3个元素全被覆盖为86.4
  • 第三次输入90.1,数组3个元素全被替换为90.1
    最终所有元素自然都是最后一次输入的值。

2. 动态数组未根据输入的size重新分配内存

Grade类初始化时,size默认值为0,因此double* grades = new double[size]{0};创建的是一个大小为0的空数组。后续在GetScores中修改了student.size,但没有为grades重新分配对应大小的内存,此时访问grades[i]属于数组越界访问,是C++中的未定义行为——当前表现为全是最后输入值,后续可能导致程序崩溃或其他异常。

修正方案

修正GetScores函数的循环逻辑与内存分配

去掉内部的for循环,直接将输入的score赋值给数组的对应下标,同时在修改size后重新分配数组内存:

void GetScores(Grade &student)
{
    int count = 0;
    double score = 0;
    cout << "How many test scores would you like to enter for ID# "
         << student.studentID << "? ";
    cin >> student.size;
    // 先释放旧内存避免泄漏,再分配新内存
    delete[] student.grades;
    student.grades = new double[student.size]{0};
    
    while (count != student.size) {
        cout << "Enter a grade: ";
        cin >> score;
        // 直接赋值给对应下标的元素
        student.grades[count] = score;
        count++;
    }

    for (int i = 0; i < student.size; i++) {
        cout << student.grades[i] << " ";
    }   
}

额外优化建议

  • 给Grade类添加析构函数,释放动态分配的内存,避免内存泄漏:
class Grade 
{
public:
    string studentID;
    int userChoice = 0;
    int size = 0;
    double* grades = new double[size]{0};
    
    // 析构函数:释放动态数组内存
    ~Grade() {
        delete[] grades;
    }
};
  • 避免用递归实现GetID和GetChoice的输入验证,递归深度过大可能导致栈溢出,改用循环实现更安全。

内容的提问来源于stack exchange,提问作者blueradiance23

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:51:34