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; }
问题原因
- 连续比较语法错误:C++不支持
69.9 >= averages[0] > 60.0这类写法,编译器会将其解析为(69.9 >= averages[0]) > 60.0。布尔值转整数后为0或1,永远小于60.0,导致这些条件永远不成立。 - 边界值遗漏:判断逻辑没有覆盖刚好等于60、70、80、90的情况,比如平均分正好是60时,没有对应的分支处理,等级会为空。
- 代码冗余:重复写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
相关产品推荐
相关产品推荐

