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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 04:15:37