C语言学生成绩管理系统,出现一些问题,求教各位大佬
本人不变太会C语言,还在学习当中,用C语言写了一个学生成绩管理系统:输入三个学生信息,实现查询学生成绩、学生数据排序、班级成绩分析(各科平均成绩、最高分、最低分、及格率)、修改学生记录、删除学生记录、输出全班学生信息的功能。遇到的问题:学生数据排序模块有错误,删除学生记录模块有缺陷(理论上能删除,但输出的时候有缺陷),希望大佬能帮我指导指导,感激不尽!
(有些地方看起来有点乱,但在VS2017上编译是整齐的)
程序代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> struct student { char Name[20], ID[20]; int Class; float Math, English, Computer; } stu[1000]; void Menu() { printf("\t\t======================================================\n"); printf("\t\t|| 学生成绩管理系统 ||\n"); printf("\t\t|| ********************************* ||\n"); printf("\t\t|| * ★ 功能菜单 ★ * ||\n"); printf("\t\t|| ********************************* ||\n"); printf("\t\t|| 1.添加学生记录 ||\n"); printf("\t\t|| 2.查询学生成绩 ||\n"); printf("\t\t|| 3.学生数据排序 ||\n");//按平均成绩和计算机成绩 printf("\t\t|| 4.班级成绩分析 ||\n");//各科平均成绩 最高分 最低分 及格率 printf("\t\t|| 5.修改学生记录 ||\n"); printf("\t\t|| 6.删除学生记录 ||\n"); printf("\t\t|| 7.输出全班学生信息 ||\n"); printf("\t\t|| 8.退出学生成绩管理系统 ||\n"); printf("\t\t======================================================\n"); } void Input()//1.添加学生记录 { printf("\t\t请按顺序输入学生姓名,学号,班级,学科成绩,不同项之间用空格间隔开:\n"); printf("\t\t姓名 学号 班级 数学成绩 英语成绩 计算机成绩\n"); for(int i=0;i<3;i++) { printf("\t\t"); scanf("%s%s%d%f%f%f", &stu[i].Name, &stu[i].ID, &stu[i].Class, &stu[i].Math, &stu[i].English, &stu[i].Computer); } printf("\t\t提示:成绩存入完毕!\n\n"); } void Find()//2.查询学生成绩 { int a, i; float sum, ave; printf("\t\t======================================================\n"); printf("\t\t|| ※欢迎进入学生信息查询系统※ ||\n"); printf("\t\t|| 1.按学生的姓名查找 ||\n"); printf("\t\t|| 2.按学生学号查找 ||\n"); printf("\t\t======================================================\n"); printf("\t\t>>>请选择1--2:"); scanf("%d", &a); switch (a) { case 1://1.按学生的姓名查找 { char Name[20]; printf("\t\t>>>请输入要查找的学生的姓名:"); scanf("%s", Name); printf("\t\t>>>以下是%s同学的信息:\n\n",Name); for ( i = 0; i< 3; i++) { if (strcmp(Name, stu[i].Name) == 0) { sum = stu[i].Math + stu[i].English + stu[i].Computer; ave = (stu[i].Math + stu[i].English + stu[i].Computer) / 3; printf("\t\t姓名\t学号\t班级\t数学成绩\t英语成绩\t计算机成绩\t平均成绩\t总成绩\n"); printf("\t\t%s\t%s\t %d\t %.2f\t\t %.2f\t\t %.2f\t\t%.2f\t\t%.2f\n\n", stu[i].Name, stu[i].ID, stu[i].Class, stu[i].Math, stu[i].English, stu[i].Computer, ave, sum); } } } break; case 2://2.按学生学号查找 { char Num[20]; printf("\t\t>>>请输入要查找的学生的学号:"); scanf("%s", Num); printf("\t\t>>>以下是%s号同学的信息:\n\n",Num); for ( i = 0; i < 3; i++) { if (0 == strcmp(Num, stu[i].ID)) { sum = stu[i].Math + stu[i].English + stu[i].Computer; ave = (stu[i].Math + stu[i].English + stu[i].Computer) / 3; printf("\t\t姓名\t学号\t班级\t数学成绩\t英语成绩\t计算机成绩\t平均成绩\t总成绩\n"); printf("\t\t%s\t%s\t %d\t %.2f\t\t %.2f\t\t %.2f\t\t%.2f\t\t%.2f\n\n", stu[i].Name, stu[i].ID, stu[i].Class, stu[i].Math, stu[i].English, stu[i].Computer, ave,sum); } } } break; } } void Order()//3.学生数据排序 { int a; printf("\t\t======================================================\n"); printf("\t\t|| ※欢迎进入学生成绩排序系统※ ||\n"); printf("\t\t|| 1.按学生平均成绩排序 ||\n"); printf("\t\t|| 2.按学生计算机成绩排序 ||\n"); printf("\t\t======================================================\n"); printf("\t\t>>>请选择1--2:"); scanf("%d", &a); printf("\t\t>>>排序如下:\n\n"); printf("\t\t姓名\t学号\t班级\t数学成绩\t英语成绩\t计算机成绩\t平均成绩\t总成绩\n"); switch (a) { case 1://1.按学生平均成绩排序 { int m, n; struct student tmp; for (m = 0; m < 3; m++) { for (n = 1; n < 3-m; n++) { if ((stu[n-1].Math+stu[n-1].English+stu[n-1].Computer)/3 > (stu[n].Math+stu[n].English+stu[n].Computer)/3) { tmp = stu[n - 1]; stu[n - 1] = stu[n]; stu[n] = tmp; } printf("\t\t%s\t%s\t%d\t %.2f\t\t %.2f\t\t%.2f\t\t%.2f\t\t%.2f\n", stu[n].Name, stu[n].ID, stu[n].Class, stu[n].Math, stu[n].English, stu[n].Computer, (stu[n].Math + stu[n].English + stu[n].Computer) / 3, stu[n].Math + stu[n].English + stu[n].Computer); } } }break; case 2://2.按学生计算机成绩排序 { int m, n; struct student tmp; for (m = 0; m < 3; m++) { for (n = 1; n < 3 - m; n++) { if (stu[n - 1].Computer > stu[n].Computer) { tmp = stu[n - 1]; stu[n - 1] = stu[n]; stu[n] = tmp; } printf("\t\t%s\t%s\t%d\t %.2f\t\t %.2f\t\t%.2f\t\t%.2f\t\t%.2f\n", stu[n].Name, stu[n].ID, stu[n].Class, stu[n].Math, stu[n].English, stu[n].Computer, (stu[n].Math + stu[n].English + stu[n].Computer) / 3, stu[n].Math + stu[n].English + stu[n].Computer); } } } break; } } void Analyze()//4.班级成绩分析 { float M_sum=0, M_ave, M_max=0, M_min, M_passrate; float E_sum=0, E_ave, E_max=0, E_min, E_passrate; float C_sum=0, C_ave, C_max=0, C_min, C_passrate; float M_people = 0, E_people = 0, C_people = 0; M_min = stu[0].Math; E_min = stu[0].English; C_min = stu[0].Computer; for ( int i = 0; i < 3; i++) { M_sum += stu[i].Math; E_sum += stu[i].English; C_sum += stu[i].Computer; if (stu[i].Math > M_max) M_max = stu[i].Math; if (stu[i].English > E_max) E_max = stu[i].English; if (stu[i].Computer > C_max) C_max = stu[i].Computer; if (stu[i].Math < M_min) M_min = stu[i].Math; if (stu[i].English < E_min) E_min = stu[i].English; if (stu[i].Computer < C_min) C_min = stu[i].Computer; if (stu[i].Math >= 60) M_people++; M_passrate = M_people / 3*100; if (stu[i].English >= 60) E_people++; E_passrate = E_people / 3 * 100; if (stu[i].Computer >= 60) C_people++; C_passrate = C_people / 3 * 100; } M_ave = M_sum / 3; E_ave = E_sum / 3; C_ave = C_sum / 3; printf("\t\t>>>以下是班级成绩分析表:\n\n"); printf("\t\t=============================================================\n"); printf("\t\t|| ★班级成绩分析★ ||\n"); printf("\t\t|| ||\n"); printf("\t\t|| 数学平均成绩 数学最高分 数学最低分 数学及格率 ||\n"); printf("\t\t|| %.2f %.2f %.2f %.2f%% ||\n", M_ave, M_max, M_min, M_passrate); printf("\t\t|| ||\n"); printf("\t\t|| 英语平均成绩 英语最高分 英语最低分 英语及格率 ||\n"); printf("\t\t|| %.2f %.2f %.2f %.2f%% ||\n", E_ave, E_max, E_min, E_passrate); printf("\t\t|| ||\n"); printf("\t\t|| 计算机平均成绩 计算机最高分 计算机最低分 计算机及格率||\n"); printf("\t\t|| %.2f %.2f %.2f %.2f%% ||\n", C_ave, C_max, C_min, C_passrate); printf("\t\t=============================================================\n\n"); } void Modify()//5.修改学生记录 { char id[20]; printf("\t\t>>>请输入要修改的学生的学号:"); scanf("%s", &id); for (int i=0;i<3;i++) if (strcmp(stu[i].ID, id) == 0) { printf("\t\t>>>已查找到学号为%s的学生,请输入新的信息,不同项之间用空格间隔开:\n",id); printf("\t\t姓名 学号 班级 数学成绩 英语成绩 计算机成绩\n"); printf("\t"); scanf("%s%s%d%f%f%f", &stu[i].Name, &stu[i].ID, &stu[i].Class, &stu[i].Math, &stu[i].English, &stu[i].Computer); printf("\t\t>>>提示:学号为%s的学生信息已更新!\n\n", id); } } void Delete()//6.删除学生记录 { int i; char id[20]; printf("\t\t>>>请输入要删除学生的学号:"); scanf("%s", &id); for (i = 0; i<3; i++) if (strcmp(id, stu[i].ID) == 0) { stu[i] = stu[i + 1]; i++; } printf("\t\t>>>提示:%s号学生信息已成功删除!\n\n", id); } void Output()//7.输出全班学生信息 { float sum, ave; printf("\t\t姓名\t学号\t班级\t数学成绩\t英语成绩\t计算机成绩\t平均成绩\t总成绩\n"); for (int i = 0; i < 3; i++) { sum = stu[i].Math + stu[i].English + stu[i].Computer; ave = (stu[i].Math + stu[i].English + stu[i].Computer) / 3; printf("\t\t%s\t%s\t %d\t %.2f\t\t %.2f\t\t %.2f\t\t%.2f\t\t%.2f\n\n", stu[i].Name, stu[i].ID, stu[i].Class, stu[i].Math, stu[i].English, stu[i].Computer, ave, sum); } } int main() { int selection; while (true) { Menu(); printf("\t\t>>>请选择1--8:"); scanf("%d", &selection); printf("\n"); switch (selection) { case 1: Input(); break; case 2: Find(); break; case 3: Order(); break; case 4: Analyze(); break; case 5: Modify(); break; case 6: Delete(); break; case 7: Output(); break; case 8: printf("\n\t\t>>>您已成功退出学生成绩管理系统,感谢使用!\n\n"); exit(0); break; default: printf("\n\t\t>>>输入有误,请重新输入!\n\n"); } } return 0; }
[此贴子已经被作者于2018-5-30 17:53编辑过]