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编辑过]






