设计学生成绩管理系统

设计和实现一个“学生成绩管理系统”,满足以下要求:
1.系统以菜单方式工作;
2.使用链表或结构数组对学生成绩进行管理和维护;
3.使用二进制文件在磁盘上保存学生记录信息;
4.链表中各结点或结构数组中各元素包括“学号、姓名、成绩数组(含计算机、数学、
物理、外语四门课程)、总分”基本字段;
5.实现如下基本功能:
(1)查看所有学生信息
(2)计算总分
(3)排序

按学号排序

按总分排序
(4)添加学生(此功能下可实现学生信息的录入)
(5)插入学生(在已按学号有序的提下,将学生插入到合适的位置)
(6)查找学生(查找并显示学生的学号、姓名、四门课程成绩、总分)

按学号查找

按姓名查找

查询每门课成绩都在80分以上的学生信息
(7)删除学生
(删除指定学号的学生)
(8)将学生记录保存到文件存盘(将数据以文件的形式存盘)
(9)从文件中读入学生记录
(将已经存盘的文件数据读入内存)

可以用个结构体来存储数据

typedef struct
{
    char Name[25];         //姓名
    int Number;            //学号
    int score[obj_num];            //计算机成绩//数学成绩//物理成绩//英语成绩//
    int Sum_score;     //总成绩
} Stu;

一定要c++吗?能否用python过java. 如果可以的话,我给你写,不可以的话我就给你提供一个思路,我之前做过一个学生的信息管理程序,和成绩管理类似,你可以参考http://t.csdn.cn/8xYOL

你自己会些和理解不,如果会的话,可以看看下面的这个实例:学生成绩管理系统的设计与实现,链接:https://blog.csdn.net/m0_62953927/article/details/122176914
它是一个拆分的代码编写,需要你在根据你的题目要求重新整合。

按照自己的理解写了一份代码,如果有细节理解错误,可以回复修改,编写不易,望采纳 打赏
因为不知道哪种操作最多,所以采用每次操作平均 O(n logn)的算法,最坏不超过O(n logn)

#include <bits/stdc++.h>
using namespace std;
/* 最多录入 1e5 个学生 */
const int MAX_STUDENT = 1e5, TABLE_SIZE = 10, SUBJECT_NUM = 4;
const string SUBJECT_ODER[SUBJECT_NUM + 5] = {"计算机", "数学", "物理", "外语"};
/* 已录入的学生总数 */
int Student_cnt;
bool Have_Id[MAX_STUDENT + 5];
string SavePath = "";
class Student {
    public:
        Student() {
            tot_score = -1;
            del = false;
            add = false;
            memset(subject, 0, sizeof subject);
            name = "";
            id = 0;
        }
        /* 学号; */
        int id;
        /* 姓名 */
        string name;
        /* 虽然本题只有4课,但是这样更具有扩展性 */
        int subject[SUBJECT_NUM + 5];
        /* 总分 */
        int tot_score;
        /* 标记删除 这样可以将复杂度降为 O(n logn) */
        bool del;
        /* 标记插入 这样可以将复杂度降为 O(n log n)*/
        bool add;

        int Calc_tot_score() { // 计算总分
            if (tot_score != -1) return tot_score;
            tot_score = 0;
            for (int i = 0; i < SUBJECT_NUM; i ++) {
                tot_score += subject[i];
            }
            return tot_score;
        }
        void Del() {
            tot_score = -1;
            del = false;
            add = false;
            Have_Id[id] = false;
            memset(subject, 0, sizeof subject);
            name = "";
            id = 0;
        }
} stu[MAX_STUDENT + 5];
void SaveData(string path) {
    fstream osm(path.c_str(), ios::out | ios::binary);
    osm.write((char*)&Student_cnt, sizeof(Student_cnt));
    osm.write((char*)Have_Id, sizeof(Have_Id));
    for (int i = 1; i <= Student_cnt; i ++) {
        osm.write((char*)&stu[i], sizeof (stu[i]));
    }
    osm.close();
}
void InitData(string path) {
    ifstream ism(path.c_str(), ios::in | ios::binary);
    ism.read((char*)(&Student_cnt), sizeof(Student_cnt));
    ism.read((char*)(Have_Id), sizeof(Have_Id));
    for (int i = 1; i <= Student_cnt; i ++)
        ism.read((char*)(&stu[i]), sizeof(stu[i]));
    ism.close();
}
bool cmp_by_id(Student a, Student b) {
    /* 依次排序后 被删除的学生在列表尾端 */
    if (a.del && !b.del) return 0;
    else if (!a.del && b.del) return 1;
    if (a.id == b.id) return a.add;
    return a.id < b.id;
}
bool cmp_by_score(Student a, Student b) {
    /* 依次排序后 被删除的学生在列表尾端 */
    if (a.del && !b.del) return 0;
    else if (!a.del && b.del) return 1;
    if (a.id == b.id) return a.add;
    return a.tot_score > b.tot_score;
}
int Mex_id() {
    for (int i = 1; i <= MAX_STUDENT; i ++) if (!Have_Id[i]) {
            return i;
        }
}
string Get_Main_Menu_Op() { // 输出操作信息
    cout << "————————————————————命令概览—————————————————————" << endl;
    cout << "| 1  查看学生信息                               |" << endl;
    cout << "| 2  计算学生总分                               |" << endl;
    cout << "| 3_1 按照学号排序(由小到大)                    |" << endl;
    cout << "| 3_2 按照成绩排序(由高到低)                   |" << endl;
    cout << "| 4 添加学生                                    |" << endl;
    cout << "| 5 插入学生                                    |" << endl;
    cout << "| 6_1 按学号查找学生信息                        |" << endl;
    cout << "| 6_2 按姓名查找学生信息                        |" << endl;
    cout << "| 7 删除指定学号的学生                          |" << endl;
    cout << "| 8 保存到指定文件                              |" << endl;
    cout << "| 9 从指定文件读取数据                          |" << endl;
    cout << "| 88 退出程序                                   |" << endl;
    cout << "—————————————————————————————————————————————————" << endl;
    string op;
    cin >> op;
    return op;
}
void Show_All_Header() {
    cout << setw(TABLE_SIZE) << "学号" << setw(TABLE_SIZE) << "姓名";
    for (int i = 0; i < SUBJECT_NUM; i ++) {
        cout << setw(TABLE_SIZE) << SUBJECT_ODER[i];
    }
    cout << setw(TABLE_SIZE) << "总分" << endl;
}
void Show_Student_Info(int index) {
    cout << setw(TABLE_SIZE) << stu[index].id << setw(TABLE_SIZE) << stu[index].name;
    for (int i = 0; i < SUBJECT_NUM; i ++) {
        cout << setw(TABLE_SIZE) << stu[index].subject[i];
    }
    cout << setw(TABLE_SIZE) << stu[index].Calc_tot_score() << endl;
}
void Show_All_Student_Info() {
    Show_All_Header();
    for (int i = 1; i <= Student_cnt; i ++) {
        Show_Student_Info(i);
    }
}
void Show_Tot_Header() {
    cout << setw(TABLE_SIZE) << "学号" << setw(TABLE_SIZE) << "姓名" << setw(TABLE_SIZE) << "总分" << endl;
}
void Show_Student_tot_score(int index) {
    cout << setw(TABLE_SIZE) << stu[index].id << setw(TABLE_SIZE) << stu[index].name << setw(TABLE_SIZE) << stu[index].Calc_tot_score() << endl;
}
void Show_All_Student_tot_score() {
    Show_Tot_Header();
    for (int i = 1; i <= Student_cnt; i ++) {
        Show_Student_tot_score(i);
    }
}
int main() {
    string op;
    while ((op = Get_Main_Menu_Op()) != "88") {
        if (op == "1") {
            Show_All_Student_Info();
        } else if (op == "2") {
            Show_All_Student_tot_score();
        } else if (op == "3_1") {
            stable_sort(stu + 1, stu + 1 + Student_cnt, cmp_by_id);
            for (int i = 1; i <= Student_cnt; i ++) {
                if (stu[i].del) {
                    Student_cnt = i;
                    break;
                }
            }
            Show_All_Student_Info();
        } else if (op == "3_2") {
            stable_sort(stu + 1, stu + 1 + Student_cnt, cmp_by_score);
            int oldStudent_cnt = Student_cnt;
            for (int i = 1; i <= oldStudent_cnt; i ++) {
                if (stu[i].del) {
                    Student_cnt = min(Student_cnt, i - 1);
                    stu[i].Del();
                }
            }
            Show_All_Student_tot_score();
        } else if (op == "4") {
            stable_sort(stu + 1, stu + 1 + Student_cnt, cmp_by_id);
            int oldStudent_cnt = Student_cnt;
            for (int i = 1; i <= oldStudent_cnt; i ++) {
                if (stu[i].del) {
                    Student_cnt = min(Student_cnt, i - 1);
                    stu[i].Del();
                }
            }
            int index = Mex_id(); // 第一个未被使用的id
            Student_cnt ++;
            stu[Student_cnt].id = index;
            cout << "自动生成学号: " << stu[Student_cnt].id << endl;
            cout << "姓名: ";
            cin >> stu[Student_cnt].name;
            cout << "成绩: " << endl;
            for (int i = 0; i < SUBJECT_NUM; i ++) {
                cout << setw(TABLE_SIZE) << SUBJECT_ODER[i];
            }
            cout << endl;
            for (int i = 0; i < SUBJECT_NUM; i ++) {
                int score;
                cin >> score;
                stu[Student_cnt].subject[i] = score;
            }
            cout << "已自动录入信息" << endl;
            Have_Id[stu[Student_cnt].id] = true;
            Show_All_Header();
            Show_Student_Info(Student_cnt);
        } else if (op == "5") {
            stable_sort(stu + 1, stu + 1 + Student_cnt, cmp_by_id);
            int oldStudent_cnt = Student_cnt;
            for (int i = 1; i <= oldStudent_cnt; i ++) {
                if (stu[i].del) {
                    Student_cnt = min(Student_cnt, i - 1);
                    stu[i].Del();
                }
            }
            cout << "学号: ";
            Student_cnt ++;
            cin >> stu[Student_cnt].id;
            cout << "姓名: ";
            cin >> stu[Student_cnt].name;
            cout << "成绩: " << endl;
            for (int i = 0; i < SUBJECT_NUM; i ++) {
                cout << setw(TABLE_SIZE) << SUBJECT_ODER[i];
            }
            cout << endl;
            for (int i = 0; i < SUBJECT_NUM; i ++) {
                int score;
                cin >> score;
                stu[Student_cnt].subject[i] = score;
            }
            stu[Student_cnt].add = true;
            cout << "已自动插入信息" << endl;
            Have_Id[stu[Student_cnt].id] = true;
            stable_sort(stu + 1, stu + 1 + Student_cnt, cmp_by_id);
            int mov = 0;
            for (int i = 1; i <= Student_cnt; i ++) {
                stu[i].id += mov;
                stu[i].add = false;
                if (stu[i].id == stu[i + 1].id) mov = 1;
                else mov = 0;
            }
            Show_All_Student_Info();
        } else if (op == "6_1") {
            int id;
            cout << "学号: ";
            cin >> id;
            for (int i = 1; i <= Student_cnt; i ++) {
                if (stu[i].id == id) {
                    Show_All_Header();
                    Show_Student_Info(i);
                    break;
                }
            }
        } else if (op == "6_2") {
            string nm;
            cout << "姓名: ";
            cin >> nm;
            for (int i = 1; i <= Student_cnt; i ++) {
                if (stu[i].name == nm) {
                    Show_All_Header();
                    Show_Student_Info(i);
                    break;
                }
            }
        } else if (op == "7") {
            int id;
            cout << "学号: ";
            cin >> id;
            for (int i = 1; i <= Student_cnt; i ++) {
                if (stu[i].id == id) {
                    stu[i].del = true;
                    break;
                }
            }
            stable_sort(stu + 1, stu + 1 + Student_cnt, cmp_by_id);
            int oldStudent_cnt = Student_cnt;
            for (int i = 1; i <= oldStudent_cnt; i ++) {
                if (stu[i].del) {
                    Student_cnt = min(Student_cnt, i - 1);
                    stu[i].Del();
                }
            }
            Show_All_Student_Info();
        } else if (op == "8") {
            string path;
            if (SavePath == "") {
                cout << "文件路径: ";
                cin >> path;
            } else {
                cout << "是否沿用上次使用的文件" << SavePath << "(y/n): ";
                string ans;
                cin >> ans;
                if (ans == "y") {
                    path = SavePath;
                } else {
                    cout << "文件路径: ";
                    cin >> path;
                }
            }
            SaveData(path);
            SavePath = path;
        } else if (op == "9") {
            string path;
            if (SavePath == "") {
                cout << "文件路径: ";
                cin >> path;
            } else {
                cout << "是否沿用上次使用的文件" << SavePath << "(y/n): ";
                string ans;
                cin >> ans;
                if (ans == "y") {
                    path = SavePath;
                } else {
                    cout << "文件路径: ";
                    cin >> path;
                }
            }
            InitData(path);
            SavePath = path;
        } else {
            cout << "[!] 无效输入" << endl;
        }
    }
    return 0;
}