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
相关产品推荐
相关产品推荐

