C++成绩计算问题:移除最低分后平均值错误求助
代码错误分析与修复:读取成绩计算平均分问题
你的代码能运行但结果错误,核心问题出在两个地方:
1. 循环内重复读取成绩,丢失半数数据
while循环的条件fin >> score已经完成了一次成绩读取,但你在循环体内又执行了一次fin >> score,这会导致每次循环跳过一个成绩。原成绩列表有12个分数,实际只处理了6个(86、95、92、80、100、94),直接导致总分和计数都错,最终平均分偏高。
2. min_score未初始化,存在未定义行为
你定义了double min_score但没初始化,第一次进入循环时虽然会赋值,但如果读取失败会触发未定义行为,规范做法是初始化一个极大值(比如numeric_limits<double>::max())。
修正后的代码
#include <iostream> #include <fstream> #include <string> #include <iomanip> #include <limits> using namespace std; int main() { ifstream fin; fin.open("dat_hw5_prob1.txt"); if (fin.is_open()) { double total_score = 0, min_score = numeric_limits<double>::max(); double score, avg_score = 0; int count = 0; char letter_grade; while (fin >> score) { count++; if (score < min_score) { min_score = score; } total_score += score; } if (count > 0) { total_score -= min_score; count--; avg_score = total_score / count; } if (avg_score >= 90) letter_grade = 'A'; else if (avg_score >= 80) letter_grade = 'B'; else if (avg_score >= 70) letter_grade = 'C'; else letter_grade = 'D'; cout << fixed << setprecision(2); cout << "Average score: " << avg_score << " final grade: " << letter_grade << endl; fin.close(); } else cout << "Unable to open file: dat_hw5_prob1.txt" << endl; return 0; }
验证结果
原成绩总和:96+86+88+95+88+92+77+80+95+64+100+94 = 1055
移除最低分64后总和:1055-64=991
剩余11个成绩,平均分:991/11≈90.09,符合预期。
内容的提问来源于stack exchange,提问作者Damien Torres
相关产品推荐
相关产品推荐

