#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> #include <stdbool.h> #define max 10000 int n=0; struct student { unsigned long long id; // 学号 char name[10]; // 姓名 char xueyaun[30]; // 学院 char ban_j[52]; // 班级 float xxjs; // 信息技术应用基础 float cxsj; // 程序设计基础 float math; // 高等数学 float english; // 大学英语 float sum; // 总分 float pingjunfen; // 平均分 }; //------------------------------------------------------------------------------------------------- void main1(); void main2(); void xuanzhe(int a,struct student s[]); void jia_xx(struct student s[]); void jian_xx(struct student s[]); void bu_kong(struct student s[],int id); void gai_xx(struct student s[]); void cha_cj(struct student s[]); void xuan_id(struct student s[]); void xuan_name(struct student s[]); void xuan_class(struct student s[]); void tong_j(struct student s[]); void dan_pai(struct student s[]); void fen_duan(struct student s[]); void pai_x1(struct student s[],int n,int kemu); void bu_jige1(struct student s[],int kemu); void bu_jige(struct student s[]); void zui_gao(struct student s[]); void shu_chu2(int a,int b,int c,int d,int e); void pai_x(struct student s[],int n,int kemu); void shu_chu(struct student s[],int xun[],int kemu); // 新增:文件操作函数声明(仅新增,不修改原有声明) void saveToFile(struct student s[], const char* filename); void loadFromFile(struct student s[], const char* filename); //-------------------------------------------------------------------------------------------------- void main1() { printf("\n"); printf(" *========================================*\n"); printf(" * 欢迎使用学生成绩管理系统 *\n"); printf(" * 小组成员:黄俊晨 张坤 *\n"); printf(" * 万杰武 吴韩斌 李人欢 *\n"); printf(" * *\n"); printf(" * *\n"); printf(" * *\n"); printf(" *========================================*\n"); printf("请按任意键进入菜单页...\n"); _getch(); system("cls"); } //-------------------------------------------------------------------------------------------------- void main2() { printf("\n"); printf(" *========== 学生成绩管理系统 ============*\n"); printf(" * 1. 创建学生成绩文件 *\n"); printf(" * 2. 增加学生信息 *\n"); printf(" * 3. 删除学生信息 *\n"); printf(" * 4. 修改学生信息 *\n"); printf(" * 5. 查询学生信息 *\n"); printf(" * 6. 成绩统计 *\n"); printf(" * 0. 退出系统 *\n"); printf(" *========================================*\n"); printf("请输入指令(0-6):"); } // 新增:保存数据到文件(二进制模式,不修改原有数据结构) void saveToFile(struct student s[], const char* filename) { FILE *fp = fopen(filename, "wb"); if (fp == NULL) { printf("文件保存失败!\n"); return; } // 先保存学生数量,再保存学生数据 fwrite(&n, sizeof(int), 1, fp); fwrite(s, sizeof(struct student), n, fp); fclose(fp); printf("数据已保存到文件:%s\n", filename); } // 新增:从文件加载数据(二进制模式) void loadFromFile(struct student s[], const char* filename) { FILE *fp = fopen(filename, "rb"); if (fp == NULL) { printf("文件不存在,将创建新文件!\n"); return; } // 先加载学生数量,再加载学生数据 fread(&n, sizeof(int), 1, fp); int readCnt = fread(s, sizeof(struct student), n, fp); fclose(fp); if (readCnt != n) { printf("文件数据异常,实际加载 %d 条数据!\n", readCnt); n = readCnt; } else { printf("成功加载 %d 条学生数据!\n", n); } } //------------------------------------------------------------------------------------------------------ void xuanzhe(int a,struct student s[]) { switch(a) { case 0: // 新增:退出时自动保存数据 saveToFile(s, "students.dat"); printf("\n退出成功"); break; case 1: // 新增:实现“创建学生成绩文件”功能(加载/创建) system("cls"); printf("========== 创建/加载学生成绩文件 ==========\n"); printf("1. 加载已有学生成绩文件\n"); printf("2. 创建新的空白成绩文件\n"); printf("请选择(1/2):"); int choice; scanf("%d", &choice); if (choice == 1) { loadFromFile(s, "students.dat"); } else if (choice == 2) { n = 0; // 清空数据 saveToFile(s, "students.dat"); printf("新的空白成绩文件已创建!\n"); } else { printf("输入错误,返回菜单!\n"); } printf("按任意键返回菜单..."); _getch(); system("cls"); main2(); int i; scanf("%d",&i); xuanzhe(i,s); break; case 2: _getch(); system("cls"); jia_xx(s); break; case 3: system("cls"); jian_xx(s); break; case 4: system("cls"); gai_xx(s); break; case 5: system("cls"); cha_cj(s); break; case 6: system("cls"); tong_j(s); break; } } //-------------------------------------------------------------------------------------------------- // 添加学生信息 void jia_xx(struct student s[]) { int k=0,i; printf("请输入要添加的学生人数:"); while (scanf("%d",&k) != 1 || k <= 0 || n + k > max) { printf("输入错误!请输入1-%d之间的正整数:", max - n); while (getchar() != '\n'); } for(int j=0; j<k; j++) { printf("\n请输入第%d个新增学生信息\n(学号 姓名 学院 班级 信息技术 程序设计 高数 英语):\n",j+1); scanf("%llu %s %s %s %f %f %f %f", &s[n].id, s[n].name, s[n].xueyaun, s[n].ban_j, &s[n].xxjs, &s[n].cxsj, &s[n].math, &s[n].english); s[n].sum = s[n].xxjs + s[n].cxsj + s[n].math + s[n].english; s[n].pingjunfen = s[n].sum / 4.0; n++; } // 新增:添加完成后自动保存数据 saveToFile(s, "students.dat"); printf("添加成功!按任意键返回菜单..."); getch(); system("cls"); main2(); scanf("%d",&i); xuanzhe(i,s); } //-------------------------------------------------------------------------------------------------- void jian_xx(struct student s[]) { //删信息 int i; if (n == 0) { printf("\n当前无学生信息,无法删除!\n"); printf("按任意键返回菜单..."); _getch(); system("cls"); return; } unsigned long long id; int idx = -1; printf("请输入要删除学生的学号:"); scanf("%llu", &id); for (int j=0; j<n; j++) { if (s[j].id == id) { idx = j; break; } } if(idx != -1) { bu_kong(s, idx); // 新增:删除完成后自动保存数据 saveToFile(s, "students.dat"); printf("\n删除成功!当前剩余学生数:%d\n", n); } else { printf("\n删除失败!未找到学号为%llu的学生\n", id); printf("请检查学号是否输入正确\n"); } printf("按任意键返回菜单..."); _getch(); system("cls"); main2(); scanf("%d",&i); xuanzhe(i,s); } //------------------------------------------- void bu_kong(struct student s[],int id) { //向前补齐数据 for (int j = id; j < n-1; j++) { s[j] = s[j+1]; } n--; } //------------------------------------------------------------------------------------------------ void gai_xx(struct student s[]) { //修改学生信息 int i,a,k,b; unsigned long long id; printf("输入你要修改的学生的学号:"); scanf("%llu",&id); int find_idx = -1; for (i=0; i<n; i++ ) { if(s[i].id == id) { find_idx = i; break; } } if (find_idx == -1) { printf("未找到学号为%llu的学生!\n", id); printf("按任意键返回菜单..."); _getch(); system("cls"); main2(); scanf("%d",&k); xuanzhe(k,s); return; } printf("=============================================\n"); printf("*学号%llu \n*姓名%s \n*学院%s \n*班级 %s \n*信息技术%f \n*程序设计%f \n*高数%f \n*英语%f\n" ,s[i].id,s[i].name,s[i].xueyaun, s[i].ban_j, s[i].xxjs, s[i].cxsj, s[i].math, s[i].english); printf("=============================================\n"); printf("需要修改的数据:"); printf("1.学号\n2.姓名\n3.学院\n4.班级\n5.信息技术\n6.程序设计\n7.高数\n8.英语\n"); printf("请输入序号:"); while (1) { scanf("%d",&a); if (0<a&&a<9) { switch(a) { case 1: printf("请输入修改后的数据:"); scanf("%llu",&s[i].id); break; case 2: printf("请输入修改后的数据:"); scanf("%s",s[i].name); break; case 3: printf("请输入修改后的数据:"); scanf("%s",s[i].xueyaun); break; case 4: printf("请输入修改后的数据:"); scanf("%s",s[i].ban_j); break; case 5: printf("请输入修改后的数据:"); scanf("%f",&s[i].xxjs); break; case 6: printf("请输入修改后的数据:"); scanf("%f",&s[i].cxsj); break; case 7: printf("请输入修改后的数据:"); scanf("%f",&s[i].math); break; case 8: printf("请输入修改后的数据:"); scanf("%f",&s[i].english); break; } s[i].sum = s[i].xxjs + s[i].cxsj + s[i].math + s[i].english; s[i].pingjunfen = s[i].sum / 4.0; // 新增:每次修改后自动保存数据 saveToFile(s, "students.dat"); } else { printf("输入有误请重新输入!\n"); continue; } printf("是否继续修改,1继续修改,0返回菜单:"); while (1) { scanf("%d",&b); if (b==1) { printf("请选择需要修改的数据序号:"); break; } else if (b==0) { printf("按任意键返回菜单..."); _getch(); system("cls"); main2(); scanf("%d",&k); xuanzhe(k,s); return; } else { printf("输入错误,请重新输入(1继续/0返回):"); } } } } //------------------------------------------------------------------------------------------------------ void cha_cj(struct student s[]) { int a,i; printf("请选择查询方式\n1.学号\n2.姓名\n3.班级\n0.回到上一页"); scanf("%d",&a); switch(a) { case 1: xuan_id(s); break; case 2: xuan_name(s); break; case 3: xuan_class(s); break; case 0: printf("按任意键返回菜单..."); _getch(); system("cls"); main2(); scanf("%d",&i); xuanzhe(i,s); default: printf("输入有误,请重试!\n"); printf("按任意键回到上一页..."); _getch(); system("cls"); cha_cj(s); return; } } //----------------------------------------------------------- void xuan_id(struct student s[]) { //选id int a=0; unsigned long long id; printf("请输入要查询的学号:"); scanf("%llu",&id); for (int i = 0; i < n; i++) { if (s[i].id==id) { printf("查找成功\n"); printf("学号%llu \n 姓名%s \n学院%s \n班级 %s \n信息技术%.1f \n程序设计%.1f \n高数%.1f \n英语%.1f\n" ,s[i].id,s[i].name,s[i].xueyaun, s[i].ban_j, s[i].xxjs, s[i].cxsj, s[i].math, s[i].english); a++; } } if (a==0) printf("未找到该学生!\n"); printf("按任意键回到上一页..."); _getch(); system("cls"); cha_cj(s); } // --------------------------------------------------------姓名查 void xuan_name(struct student s[]) { //选名字 int type,i=0,a=0; printf("请选择查询类型:1-精确查询 2-模糊查询:"); scanf("%d", &type); if(type!=1&&type!=2) { printf("输入错误请重试!\n"); _getch(); system("cls"); xuan_name(s); return; } char x_name[20]; printf("请输入要查询的姓名:"); scanf("%s", x_name); if(type==1) { for (int i = 0; i < n; i++) { if (strcmp(s[i].name, x_name) == 0) { //精确查找,比对姓名 printf("查找成功\n"); printf("学号%llu \n 姓名%s \n学院%s \n班级%s \n信息技术%.1f \n程序设计%.1f \n高数%.1f \n英语%.1f\n" ,s[i].id,s[i].name,s[i].xueyaun, s[i].ban_j, s[i].xxjs, s[i].cxsj, s[i].math, s[i].english); a++; } } if(a==0) printf("未找到姓名为%s的学生!\n", x_name); } else if (type==2) { bool find = false; printf("模糊查找结果(包含\"%s\"):\n",x_name); for (int i = 0; i < n; i++) { if (strstr(s[i].name,x_name ) != NULL) { printf("学号%llu \n 姓名%s \n学院%s \n班级%s \n信息技术%.1f \n程序设计%.1f \n高数%.1f \n英语%.1f\n" ,s[i].id,s[i].name,s[i].xueyaun, s[i].ban_j, s[i].xxjs, s[i].cxsj, s[i].math, s[i].english); find = true; a++; } } if (!find) { printf(" 未找到匹配的名字\n"); } } printf("按任意键回到上一页..."); _getch(); system("cls"); cha_cj(s); } // -----------------------------------------------------------------按班级查询 void xuan_class(struct student s[]) { char x_class[30]; int a=0; printf("请输入要查询的班级:"); scanf("%s", x_class); for (int i = 0; i < n; i++) { if (strcmp(s[i].ban_j,x_class) == 0) { printf("班级 %s \n 姓名%s \n学院%s \n学号%llu \n信息技术.1%f \n程序设计%.1f \n高数%.1f \n英语%.1f\n" ,s[i].ban_j,s[i].name,s[i].xueyaun, s[i].id, s[i].xxjs, s[i].cxsj, s[i].math, s[i].english); a++; } } if (a==0) printf("未找到该班级的学生!\n"); printf("按任意键回到上一页..."); _getch(); system("cls"); cha_cj(s); } //-------------------------------------------------------------------------------------------------------- void tong_j(struct student s[]) { int a,k; if (n == 0) { printf("\n当前无学生信息,无法统计!\n"); printf("按任意键返回菜单..."); _getch(); system("cls"); return; } for (int i=0; i<n; i++) { s[i].sum = s[i].xxjs + s[i].cxsj + s[i].math + s[i].english; s[i].pingjunfen = s[i].sum / 4.0; } // 统计菜单:一行一个选项(取消并排) printf("^==================================================^\n"); printf("* 成绩统计 - 选择统计类型 *\n"); printf("*==================================================*\n"); printf("* 1. 单科成绩排名 *\n"); printf("* 2. 平均分分段人数 *\n"); printf("* 3. 各科最高分 *\n"); printf("* 4. 不及格人数统计 *\n"); printf("* 5. 返回目录 *\n"); printf("^==================================================^\n"); while (1) { scanf("%d",&a); if (a<=5&&a>0) break; else { printf("输入错误请重试!\n"); } } switch(a) { case 1: system("cls"); dan_pai(s); break; case 2: system("cls"); fen_duan(s); break; case 3: system("cls"); zui_gao(s); break; case 4: system("cls"); bu_jige(s); break; case 5: system("cls"); main2(); scanf("%d",&k); xuanzhe(k,s); } printf("按任意键返回菜单..."); _getch(); system("cls"); main2(); int i; scanf("%d",&i); xuanzhe(i,s); } //------------------------------------------- void dan_pai(struct student s[]) { int a,k; // 单科排名菜单:一行一个选项(取消并排) printf("^==================================================^\n"); printf("* 单科排名 - 选择科目 *\n"); printf("*==================================================*\n"); printf("* 1. 数学 \n"); printf("* 2. 英语 \n"); printf("* 3. 信息技术 \n"); printf("* 4. 程序设计基础 \n"); printf("* 5. 返回上一页 \n"); printf("^==================================================^\n"); while (1) { scanf("%d",&a); if (a<=5&&a>0) break; else { printf("输入错误请重试!\n"); } } switch(a) { case 1: system("cls"); pai_x(s,n,1); break; case 2: system("cls"); pai_x(s,n,2); break; case 3: system("cls"); pai_x(s,n,3); break; case 4: system("cls"); pai_x(s,n,4); break; case 5: system("cls"); scanf("%d",&k); tong_j(s); } } //--------------------------- void pai_x(struct student s[],int n,int kemu) { int a; int xun[max]; for (int i=0; i<n; i++) { xun[i]=i; } for (int i=0; i<n; i++) { for (int j=1; j<n; j++) { if(kemu==1&&s[i].math<s[j].math) { a=xun[i]; xun[i]=xun[j]; xun[j]=a; } if(kemu==2&&s[i].english<s[j].english) { a=xun[i]; xun[i]=xun[j]; xun[j]=a; } if(kemu==3&&s[i].xxjs<s[j].xxjs) { a=xun[i]; xun[i]=xun[j]; xun[j]=a; } if(kemu==4&&s[i].cxsj<s[j].cxsj) { a=xun[i]; xun[i]=xun[j]; xun[j]=a; } } } shu_chu(s,xun,kemu); } void shu_chu(struct student s[],int xun[],int kemu) { char kemu_name[20]; if(kemu==1) strcpy(kemu_name, "数学"); if(kemu==2) strcpy(kemu_name, "英语"); if(kemu==3) strcpy(kemu_name, "信息技术"); if(kemu==4) strcpy(kemu_name, "程序设计基础"); printf("^==================================================^\n"); printf("* %s成绩排名表 *\n", kemu_name); printf("*==================================================*\n"); for(int i=0; i<n; i++) { float score; if(kemu==1) score = s[xun[i]].math; if(kemu==2) score = s[xun[i]].english; if(kemu==3) score = s[xun[i]].xxjs; if(kemu==4) score = s[xun[i]].cxsj; // 每个学生的信息:一行一个栏目 printf("* 第%d名学生信息: *\n", i+1); printf("*==================================================*\n"); printf("* 学号:%llu *\n", s[xun[i]].id); printf("* 学院:%.12s *\n", s[xun[i]].xueyaun); // 截断为12字符 printf("* 班级:%.12s *\n", s[xun[i]].ban_j); // 截断为12字符 printf("* 姓名:%.4s *\n", s[xun[i]].name); // 截断为4字符 printf("* %s成绩:%.1f *\n", kemu_name, score); printf("*==================================================*\n"); } printf("^==================================================^\n"); } //------------------------------------------- void fen_duan(struct student s[]) { int a=0,b=0,c=0,d=0,e=0; for (int i=0; i<n; i++) { if (s[i].pingjunfen < 60.0) a++; if (60.0 <= s[i].pingjunfen && s[i].pingjunfen <= 69.0) b++; if (70.0 <= s[i].pingjunfen && s[i].pingjunfen <= 79.0) c++; if (80.0 <= s[i].pingjunfen && s[i].pingjunfen <= 89.0) d++; if (90.0 <= s[i].pingjunfen && s[i].pingjunfen <= 100.0) e++; } shu_chu2(a,b,c,d,e); } // 分数段统计:一行一个分数段(取消并排) void shu_chu2(int a,int b,int c,int d,int e) { printf("^==================================================^\n"); printf("* 平均分分数段统计 \n"); printf("*==================================================*\n"); printf("* 分数段:<60分 │ 人数:%d \n", a); printf("*==================================================*\n"); printf("* 分数段:60-69分 │ 人数:%d \n", b); printf("*==================================================*\n"); printf("* 分数段:70-79分 │ 人数:%d \n", c); printf("*==================================================*\n"); printf("* 分数段:80-89分 │ 人数:%d \n", d); printf("*==================================================*\n"); printf("* 分数段:90-100分 │ 人数:%d \n", e); printf("^==================================================^\n"); } //------------------------------------- void zui_gao(struct student s[]) { // 最高分统计:一行一个科目 printf("^==================================================^\n"); printf("* 各科最高分统计 *\n"); printf("*==================================================*\n"); pai_x1(s,n,1); printf("*==================================================*\n"); pai_x1(s,n,2); printf("*==================================================*\n"); pai_x1(s,n,3); printf("*==================================================*\n"); pai_x1(s,n,4); printf("^==================================================^\n"); } //--------------------------------------- void bu_jige(struct student s[]) { // 不及格人数统计:一行一个科目 printf("^==================================================^\n"); printf("* 各科目不及格人数统计 *\n"); printf("*==================================================*\n"); bu_jige1(s,1); printf("*==================================================*\n"); bu_jige1(s,2); printf("*==================================================*\n"); bu_jige1(s,3); printf("*==================================================*\n"); bu_jige1(s,4); printf("^==================================================^\n"); } // 不及格人数行:单行显示 void bu_jige1(struct student s[],int kemu) { int count = 0; for (int i=0; i<n; i++) { if(kemu==1 && s[i].math<60) count++; // 高数 if(kemu==2 && s[i].english<60) count++; // 英语 if(kemu==3 && s[i].xxjs<60) count++; // 信息技术 if(kemu==4 && s[i].cxsj<60) count++; // 程序设计基础 } if(kemu==1) printf("* 高数不及格人数:%d 人 \n", count); if(kemu==2) printf("* 英语不及格人数:%d 人 \n", count); if(kemu==3) printf("* 信息技术不及格人数:%d 人 \n", count); if(kemu==4) printf("* 程序设计基础不及格人数:%d 人 \n", count); } // 最高分详情行:单行显示 void pai_x1(struct student s[],int n,int kemu) { int a; int xun[max]; int i=0; for (int i=0; i<n; i++) { xun[i]=i; } for (int i=0; i<n; i++) { for (int j=1; j<n; j++) { if(kemu==1&&s[i].math<s[j].math) { a=xun[i]; xun[i]=xun[j]; xun[j]=a; } if(kemu==2&&s[i].english<s[j].english) { a=xun[i]; xun[i]=xun[j]; xun[j]=a; } if(kemu==3&&s[i].xxjs<s[j].xxjs) { a=xun[i]; xun[i]=xun[j]; xun[j]=a; } if(kemu==4&&s[i].cxsj<s[j].cxsj) { a=xun[i]; xun[i]=xun[j]; xun[j]=a; } } } i=xun[0]; if(kemu==1) { printf("* 数学最高分:%.1f *\n",s[i].math); printf("*姓名:%s,学号:%llu *\n",s[i].name,s[i].id ); } if(kemu==2) { printf("* 英语最高分:%.1f *\n",s[i].english); printf("*姓名:%s,学号:%llu *\n",s[i].name,s[i].id ); } if(kemu==3) { printf("* 信息技术最高分:%.1f *\n",s[i].xxjs); printf("*姓名:%s,学号:%llu *\n",s[i].name,s[i].id ); } if(kemu==4) { printf("* 程序设计基础最高分:%.1f *\n",s[i].cxsj); printf("*姓名:%s,学号:%llu *\n",s[i].name,s[i].id ); } } //---------------------------------------------------------------------------------------------------------- int main () { int i; struct student s[max]; main1(); main2(); while (1) { scanf("%d",&i); if (i==0||i==1||i==2||i==3||i==4||i==5||i==6) { xuanzhe(i,s); if(i != 0) { system("cls"); main2(); } else break; } else printf ("输入错误请重试!\n"); } return 0; }学生成绩管理系统
张小明
前端开发工程师
AssetStudio高效资源管理:Unity资产提取完整实践指南
AssetStudio高效资源管理:Unity资产提取完整实践指南 【免费下载链接】AssetStudio AssetStudio is a tool for exploring, extracting and exporting assets and assetbundles. 项目地址: https://gitcode.com/gh_mirrors/as/AssetStudio AssetStudio作为专…
PyTorch-CUDA-v2.6镜像运行MiniCPM进行端侧推理尝试
PyTorch-CUDA-v2.6镜像运行MiniCPM进行端侧推理尝试 在如今大模型遍地开花的时代,越来越多开发者希望在本地设备上跑通一个“能说会道”的语言模型。但现实往往很骨感:环境配置复杂、CUDA版本错配、显存不足、依赖冲突……光是把PyTorch和GPU打通&#x…
WaveTools终极指南:如何快速解锁鸣潮120帧完整配置
WaveTools终极指南:如何快速解锁鸣潮120帧完整配置 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 鸣潮工具箱WaveTools作为专业的游戏性能优化工具,通过深度技术解析和精准配置操作…
终极鼠标性能测试指南:开源工具MouseTester完全解析
终极鼠标性能测试指南:开源工具MouseTester完全解析 【免费下载链接】MouseTester 项目地址: https://gitcode.com/gh_mirrors/mo/MouseTester 想要了解你的鼠标真实性能吗?MouseTester是一款专业的开源鼠标性能测试工具,能够精准评估…
Qwen3-Coder 30B:免费体验256K长上下文AI编码
导语:阿里达摩院最新发布的Qwen3-Coder 30B模型实现重大突破,以256K超长上下文窗口和免费开源特性,重新定义开发者工具的使用体验。 【免费下载链接】Qwen3-Coder-30B-A3B-Instruct-GGUF 项目地址: https://ai.gitcode.com/hf_mirrors/uns…
如何快速优化魔兽争霸III:老玩家的终极指南
如何快速优化魔兽争霸III:老玩家的终极指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典魔兽争霸III在现代设备上的各种兼容…