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

学生成绩管理系统筛选功能异常:部分成绩值显示为空

学生成绩管理系统成绩显示异常问题

我正在开发一个学生成绩管理系统,其余功能均正常,但执行「显示成绩大于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的成绩消失


问题根源及修复方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 19:20:55