学生成绩管理系统问题分析

代码来源:CNDS《学生成绩信息管理系统设计》
运行环境:Visual Studio 2022

学生成绩信息管理系统设计 #include #include using namespace std; const int MAX_STUDENTS = 100; class Student { public: string name; int id; float score; }; class StudentManager { private: Student students[MAX_STUDENTS]; int studentCount;

public:
StudentManager() : studentCount(0) {}

void addStudent() {
    if (studentCount >= MAX_STUDENTS) {
        cout << "学生数量已达到最大值!" << endl;
        return;
    }

    cout << "请输入学生姓名: ";
    cin >> students[studentCount].name;
    cout << "请输入学生学号: ";
    cin >> students[studentCount].id;
    cout << "请输入学生成绩: ";
    cin >> students[studentCount].score;

    studentCount++;
    cout << "学生添加成功!" << endl;
}

void displayAllStudents() {
    if (studentCount == 0) {
        cout << "没有学生信息!" << endl;
        return;
    }

    for (int i = 0; i < studentCount; i++) {
        cout << "姓名: " << students[i].name
             << ", 学号: " << students[i].id
             << ", 成绩: " << students[i].score << endl;
    }
}

void findStudentById() {
    int id;
    cout << "请输入要查找的学生学号: ";
    cin >> id;

    for (int i = 0; i < studentCount; i++) {
        if (students[i].id == id) {
            cout << "找到学生: " << students[i].name
                 << ", 成绩: " << students[i].score << endl;
            return;
        }
    }

    cout << "未找到该学生!" << endl;
}

};

int main() {
StudentManager manager;
int choice;

while (true) {
    cout << "1. 添加学生" << endl;
    cout << "2. 显示所有学生" << endl;
    cout << "3. 查找学生" << endl;
    cout << "0. 退出" << endl;
    cout << "请输入选项: ";
    cin >> choice;

    switch (choice) {
        case 1:
            manager.addStudent();
            break;
        case 2:
            manager.displayAllStudents();
            break;
        case 3:
            manager.findStudentById();
            break;
        case 0:
            cout << "退出程序!" << endl;
            return 0;
        default:
            cout << "无效选项,请重新输入!" << endl;
            break;
    }
}

return 0;

}

代码问题分析
1.没有对输入的成绩、学号等进行有效性检查(如成绩是否在0-100之间,学号是否重复)。
2.功能缺少删除学生、修改学生信息等功能。
学生信息存储只有姓名、学号和成绩。
3.界面交互不够友好,缺少提示信息。
新代码
改正1.void findStudentById() {
int id;
cout << "请输入要查找的学生学号: ";
cin >> id;
int index = findStudentById(id);
if (index != -1) {
cout << "找到学生: ";
students[index].display();
} else {
cout << "未找到该学生!" << endl;
}
}
改正2:// 删除学生
void deleteStudent() {
int id;
cout << "请输入要删除的学生学号: ";
cin >> id;
int index = findStudentById(id);
if (index == -1) {
cout << "未找到该学生!" << endl;
return;
}
// 将后面的学生向前移动
for (int i = index; i < studentCount - 1; i++) {
students[i] = students[i + 1];
}
studentCount--;
cout << "学生删除成功!" << endl;
}
// 修改学生信息
void modifyStudent() {
int id;
cout << "请输入要修改的学生学号: ";
cin >> id;

    int index = findStudentById(id);
    if (index == -1) {
        cout << "未找到该学生!" << endl;
        return;
    }
    cout << "当前学生信息: ";
    students[index].display();
    string name;
    float score;
    cout << "请输入新的姓名: ";
    cin >> name;
    cout << "请输入新的成绩: ";
    score = getValidInput<float>(0, 100);
    students[index].setName(name);
    students[index].setScore(score);
    cout << "学生信息修改成功!" << endl;
}


六、总结:
难点:
1.初始代码没有对用户输入进行验证,容易导致程序崩溃或数据错误(如输入非数字字符、成绩超出范围等)。在直接获取数字之前,需要明白输入的数字未必全是正确的,要运用逆向思维验证数据的正确性。
2.系统虽然可以运行,但是很多地方如:删除学生信息,改学生信息都没有做到,需要在用户的角度去考虑他们。
逆向软件工程的思考
逆向软件工程(Reverse Software Engineering)是指通过分析现有系统的代码、结构和行为,理解其设计意图,并在此基础上进行改进或重构。在这次软件改进中,我也是运用到了这种思维,从用户(最终)角度去逆向改进开发者应用(开始),这种思维一定会帮助未来改进并优化系统。

posted @ 2025-02-21 22:55  张中卿  阅读(58)  评论(0)    收藏  举报