学生成绩管理系统筛选功能异常:部分成绩值显示为空
学生成绩管理系统成绩显示异常问题
我正在开发一个学生成绩管理系统,其余功能均正常,但执行「显示成绩大于X的学生(升序)」和「显示成绩小于等于X的学生(降序)」功能时,部分成绩值显示为空或消失。单独的显示和排序代码片段可正常运行,但组合后出现该异常。
问题复现代码
#include <iostream> #include <cctype> // 需包含此头文件使用toupper using namespace std; int main(){ const int default_size = 100; int stud_roll [default_size] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50}; int class_sec [default_size] = {7, 2, 9, 5, 3, 8, 6, 1, 4, 10, 2, 8, 6, 1, 9, 4, 7, 3, 5, 10, 2, 6, 8, 3, 7, 1, 9, 4, 10, 5, 2, 6, 7, 8, 1, 9, 3, 4, 5, 10, 6, 2, 8, 7, 1, 9, 3, 4, 10, 5}; float mid_term_marks [default_size] = {2, 8, 19.5, 3, 27, 10.5, 35, 7, 14, 4.5, 22, 30, 18.5, 25, 1, 21, 2.5, 38, 15, 17.5, 43, 5, 29, 11, 9.5, 24, 16, 50, 20, 33, 40, 23, 6.5, 41, 28, 39, 13, 45.5, 34, 36, 26, 31, 44, 46, 32, 48, 37, 49, 47, 42.5}; float fin_term_marks [default_size] = {12, 88, 19.5, 3, 72, 41.5, 57, 9, 63, 4.5, 29, 84, 56, 22, 71, 2.5, 49, 35, 67, 18.5, 95, 6, 54, 31, 44.5, 39, 83, 10, 77, 66, 53, 5.5, 80, 13, 23.5, 60, 50, 70, 15, 93, 7, 59, 48.5, 42, 11.5, 28, 74, 26.5, 92, 17}; char final_grades [default_size] = {}; char user_choice[2]; char check_grade; int number_of_entries = 50; // 循环范围 for (int i = 0; i < number_of_entries; i++) { if (fin_term_marks[i] > 85) { final_grades[i] = 'A'; } else if (fin_term_marks[i] < 86 && fin_term_marks[i] > 72) { final_grades[i] = 'B'; } else if (fin_term_marks[i] < 73 && fin_term_marks[i] > 59) { final_grades[i] = 'C'; } else if (fin_term_marks[i] < 60 && fin_term_marks[i] > 49) { final_grades[i] = 'D'; } else if (fin_term_marks[i] < 50 && fin_term_marks[i] >= 0){ final_grades[i] = 'F'; } } do { cout << " 16. 显示成绩大于X的学生(升序)" << endl; cout << " 17. 显示成绩小于等于X的学生(降序)" << endl; cout << " E. 退出" << endl; cout << "\n 请输入要执行的操作: "; cin >> user_choice; else if (user_choice[0] == '1' && user_choice[1] == '6') { cout << " 请输入要筛选的最低成绩: "; cin >> check_grade; check_grade = toupper(check_grade); if (check_grade >= 'A' && check_grade <= 'F' && check_grade != 'E') { for (int i = 0; i < number_of_entries; i++) { for (int j = i + 1; j < number_of_entries; j++) { if (fin_term_marks[i] > fin_term_marks[j]) { swap (stud_roll[i], stud_roll[j]); swap (class_sec[i], class_sec[j]); swap (mid_term_marks[i], mid_term_marks[j]); swap (fin_term_marks[i], fin_term_marks[j]); swap (final_grades[i], final_grades[j]); } } } for (int i = 0; i < number_of_entries; i++) { if (final_grades[i] < check_grade) { cout << " 学号: " << stud_roll[i] << endl; cout << " 最终成绩: " << final_grades[i]; cout << " 期末分数: " << fin_term_marks[i] << endl; cout << " 班级: " << class_sec[i]; cout << " 期中分数: " << mid_term_marks[i] << endl; cout << endl; } } } else { cout << " 无效成绩... " << endl; } } else if (user_choice[0] == '1' && user_choice[1] == '7') { cout << " 请输入要筛选的最低成绩: "; cin >> check_grade; check_grade = toupper(check_grade); if (check_grade >= 'A' && check_grade <= 'F' && check_grade != 'E') { for (int i = 0; i < number_of_entries; i++) { for (int j = i + 1; j < number_of_entries; j++) { if (fin_term_marks[i] < fin_term_marks[j]) { swap (stud_roll[i], stud_roll[j]); swap (class_sec[i], class_sec[j]); swap (mid_term_marks[i], mid_term_marks[j]); swap (fin_term_marks[i], fin_term_marks[j]); swap (final_grades[i], final_grades[j]); } } } for (int i = 0; i < number_of_entries; i++) { if (final_grades[i] >= check_grade) { cout << " 学号: " << stud_roll[i] << endl; cout << " 最终成绩: " << final_grades[i]; cout << " 期末分数: " << fin_term_marks[i] << endl; cout << " 班级: " << class_sec[i]; cout << " 期中分数: " << mid_term_marks[i] << endl; cout << endl; } } } } while (user_choice[0] != 'e' && user_choice[0] != 'E'); return 0; }
问题截图

问题根源及修复方案
1. 成绩赋值逻辑遗漏边界值(核心问题)
原代码的成绩判断条件未覆盖等于临界分数的情况,导致部分final_grades元素保持默认的空字符(\0),显示时就会出现空成绩。比如分数等于72、59、49的学生,没有被任何条件匹配,成绩未被赋值。
修复代码:
for (int i = 0; i < number_of_entries; i++) { if (fin_term_marks[i] > 85) { final_grades[i] = 'A'; } else if (fin_term_marks[i] >= 73 && fin_term_marks[i] <= 85) { // 覆盖73-85(含边界) final_grades[i] = 'B'; } else if (fin_term_marks[i] >= 60 && fin_term_marks[i] <= 72) { // 覆盖60-72(含边界) final_grades[i] = 'C'; } else if (fin_term_marks[i] >= 50 && fin_term_marks[i] <= 59) { // 覆盖50-59(含边界) final_grades[i] = 'D'; } else if (fin_term_marks[i] >= 0 && fin_term_marks[i] < 50){ final_grades[i] = 'F'; } }
2. 语法错误:条件判断开头误用else if
原代码中cin >> user_choice;之后直接使用else if,前面没有对应的if,会导致编译错误。需要将第一个判断改为if,后续用else if衔接。
修复代码片段:
cin >> user_choice; if (user_choice[0] == '1' && user_choice[1] == '6') { // 功能16的实现代码 } else if (user_choice[0] == '1' && user_choice[1] == '7') { // 功能17的实现代码 } else { cout << "无效选项,请重新输入。" << endl; }
3. 输入处理存在隐患
user_choice是长度为2的字符数组,当输入单个字符(如'E')时,第二个元素是未初始化的垃圾值,可能导致判断逻辑异常。建议改用string类型处理输入,更安全直观:
优化代码:
string user_choice; // ... cin >> user_choice; if (user_choice == "16") { // 功能16逻辑 } else if (user_choice == "17") { // 功能17逻辑 } else if (user_choice == "E" || user_choice == "e") { // 退出操作(可选,循环条件会自动处理) } else { cout << "无效选项,请重新输入。" << endl; }
4. 可选优化:避免修改原始数据
每次执行排序功能都会直接修改原始数组,多次操作后数据顺序会混乱。如果需要保留原始数据,可以创建临时数组存储排序后的结果,或者在排序前备份原始数据。
内容的提问来源于stack exchange,提问作者Arbitraitor
相关产品推荐
相关产品推荐

