设计和实现一个“学生成绩管理系统”,满足以下要求:
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;
}