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

C++学生成绩程序字母等级显示异常问题求助

C++学生成绩等级计算程序问题修复

问题描述

我正在为计算机科学101课程编写一个C++程序,功能是让用户输入5名学生的姓名和4门测试成绩,计算每位学生的平均分并对应字母等级,最后输出姓名、平均分和等级。但现在字母等级偶尔无法正常显示,重写if-else判断也没解决,求帮助。

以下是我的代码:

#include <iostream>
#include <math.h>
using namespace std;


int main(int argc, const char * argv[]) {
    
    //defining variables
    
    float test1 [5];
    float test2 [5];
    float test3 [5];
    float test4 [5];
    float averages[5];
    string lettergrades[5];
    string students [5];
    
    //entering student name and four test scores
    
    cout << "Enter student 1's name: ";
    cin >> students[0];
    cout << "Enter " << students[0] << "'s four test scores: ";
    cin >> test1[0]; cin >> test2[0]; cin >> test3[0]; cin >> test4[0];
    
    cout << "Enter student 2's name: ";
    cin >> students[1];
    cout << "Enter " << students[1] << "'s four test scores: ";
    cin >> test1[1]; cin >> test2[1]; cin >> test3[1]; cin >> test4[1];
    
    cout << "Enter student 3's name: ";
    cin >> students[2];
    cout << "Enter " << students[2] << "'s four test scores: ";
    cin >> test1[2]; cin >> test2[2]; cin >> test3[2]; cin >> test4[2];
    
    cout << "Enter student 4's name: ";
    cin >> students[3];
    cout << "Enter " << students[3] << "'s four test scores: ";
    cin >> test1[3]; cin >> test2[3]; cin >> test3[3]; cin >> test4[3];
    
    cout << "Enter student 5's name: ";
    cin >> students[4];
    cout << "Enter " << students[4] << "'s four test scores: ";
    cin >> test1[4]; cin >> test2[4]; cin >> test3[4]; cin >> test4[4];
    
    //calculating the average for each students' test scores

    averages[0] = (test1[0] + test2[0] + test3 [0] + test4 [0]) / 4;
    averages[1] = (test1[1] + test2[1] + test3 [1] + test4 [1]) / 4;
    averages[2] = (test1[2] + test2[2] + test3 [2] + test4 [2]) / 4;
    averages[3] = (test1[3] + test2[3] + test3 [3] + test4 [3]) / 4;
    averages[4] = (test1[4] + test2[4] + test3 [4] + test4 [4]) / 4;

    
    //calculating the lettergrade for each student
    
    if (averages[0] <= 59.9) {
        lettergrades[0] = " F ";
    } else {
        if (69.9 >= averages[0] > 60.0) {
            lettergrades[0] = " D ";
        } else {
            if (79.9 >= averages[0] > 70.0) {
                lettergrades[0] = " C ";
            } else {
                if (89.9 >= averages[0] > 80.0) {
                    lettergrades[0] = " B ";
                } else {
                    if (averages[0] > 90.0 ) {
                        lettergrades[0] = " A ";
                    }
                }
            }
        }
    }

    if (averages[1] <= 59.9) {
        lettergrades[1] = " F ";
    } else {
        if (69.9 >= averages[1] > 60.0) {
            lettergrades[1] = " D ";
        } else {
            if (79.9 >= averages[1] > 70.0) {
                lettergrades[1] = " C ";
            } else {
                if (89.9 >= averages[1] > 80.0) {
                    lettergrades[1] = " B ";
                } else {
                    if (averages[1] > 90.0 ) {
                        lettergrades[1] = " A ";
                    }
                }
            }
        }
    }
    
    if (averages[2] <= 59.9) {
        lettergrades[2] = " F ";
    } else {
        if (69.9 >= averages[2] > 60.0) {
            lettergrades[2] = " D ";
        } else {
            if (79.9 >= averages[2] > 70.0) {
                lettergrades[2] = " C ";
            } else {
                if (89.9 >= averages[2] > 80.0) {
                    lettergrades[2] = " B ";
                } else {
                    if (averages[2] > 90.0 ) {
                        lettergrades[2] = " A ";
                    }
                }
            }
        }
    }
    
    if (averages[3] <= 59.9) {
        lettergrades[3] = " F ";
    } else {
        if (69.9 >= averages[3] > 60.0) {
            lettergrades[3] = " D ";
        } else {
            if (79.9 >= averages[3] > 70.0) {
                lettergrades[3] = " C ";
            } else {
                if (89.9 >= averages[3] > 80.0) {
                    lettergrades[3] = " B ";
                } else {
                    if (averages[3] > 90.0 ) {
                        lettergrades[3] = " A ";
                    }
                }
            }
        }
    }
    
    if (averages[4] <= 59.9) {
        lettergrades[4] = " F ";
    } else {
        if (69.9 >= averages[4] > 60.0) {
            lettergrades[4] = " D ";
        } else {
            if (79.9 >= averages[4] > 70.0) {
                lettergrades[4] = " C ";
            } else {
                if (89.9 >= averages[4] > 80.0) {
                    lettergrades[4] = " B ";
                } else {
                    if (averages[4] > 90.0 ) {
                        lettergrades[4] = " A ";
                    }
                }
            }
        }
    }

    //displaying the information to the user, in NAME, AVERAGE, LETTERGRADE format
    
    cout << " " << endl;
    cout << students[0] << ": " << averages[0] << "," << lettergrades[0] << endl;
    cout << students[1] << ": " << averages[1] << "," << lettergrades[1] << endl;
    cout << students[2] << ": " << averages[2] << "," << lettergrades[2] << endl;
    cout << students[3] << ": " << averages[3] << "," << lettergrades[3] << endl;
    cout << students[4] << ": " << averages[4] << "," << lettergrades[4] << endl;
    
    return 0;
}

问题原因

  1. 连续比较语法错误:C++不支持69.9 >= averages[0] > 60.0这类写法,编译器会将其解析为(69.9 >= averages[0]) > 60.0。布尔值转整数后为0或1,永远小于60.0,导致这些条件永远不成立。
  2. 边界值遗漏:判断逻辑没有覆盖刚好等于60、70、80、90的情况,比如平均分正好是60时,没有对应的分支处理,等级会为空。
  3. 代码冗余:重复写5次相同的输入、计算和判断逻辑,增加出错概率且难以维护。

修复方案

1. 修正条件判断逻辑

使用逻辑与运算符&&连接两个比较条件,同时调整判断顺序,从高分到低分(或反之),确保所有区间和边界值都被覆盖。

2. 封装等级计算为函数

将重复的等级判断逻辑封装成函数,减少代码冗余,提高可读性。

3. 使用循环简化输入与输出

用循环替代重复5次的输入、计算和输出代码,让代码更简洁。

修复后的完整代码

#include <iostream>
#include <string>
using namespace std;

// 封装字母等级计算函数
string getLetterGrade(float average) {
    if (average >= 90.0) {
        return "A";
    } else if (average >= 80.0) {
        return "B";
    } else if (average >= 70.0) {
        return "C";
    } else if (average >= 60.0) {
        return "D";
    } else {
        return "F";
    }
}

int main() {
    const int STUDENT_COUNT = 5;
    float tests[STUDENT_COUNT][4]; // 用二维数组存储成绩,更简洁
    float averages[STUDENT_COUNT];
    string letterGrades[STUDENT_COUNT];
    string students[STUDENT_COUNT];

    // 循环输入学生信息和成绩
    for (int i = 0; i < STUDENT_COUNT; i++) {
        cout << "Enter student " << i + 1 << "'s name: ";
        cin >> students[i];
        cout << "Enter " << students[i] << "'s four test scores: ";
        cin >> tests[i][0] >> tests[i][1] >> tests[i][2] >> tests[i][3];
        
        // 计算平均分
        averages[i] = (tests[i][0] + tests[i][1] + tests[i][2] + tests[i][3]) / 4;
        // 获取字母等级
        letterGrades[i] = getLetterGrade(averages[i]);
    }

    // 循环输出结果
    cout << endl;
    for (int i = 0; i < STUDENT_COUNT; i++) {
        cout << students[i] << ": " << averages[i] << ", " << letterGrades[i] << endl;
    }

    return 0;
}

说明

  • 二维数组tests替代了四个单独的成绩数组,结构更清晰。
  • 函数getLetterGrade的判断顺序从高分到低分,每个区间自动覆盖上一个区间的下限(比如>=80.0包含80.0到89.9的所有值),不会遗漏边界。
  • 循环的使用大幅减少了重复代码,降低了维护成本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:55:23