#include<stdio.h>
#include<string.h>
#include<strings.h>
#include<stdlib.h>
int i;
int m;
struct student
{
int id;
float chinese;
float mach;
float english;
float average;
}stu[32],stu2[32];
void Type()
{
int o;
if(stu[0].id>=1&&stu[0].id<=32)
{
printf("里边存在数据,是否覆盖?输入1表示覆盖,输入2表示取消覆盖\n:");
scanf("%d",&o);getchar();
if(1==o)
o+1;
else
{
return;
}
}
printf("输入学生人数:\n");
scanf("%d",&m);
printf("学号 语文 数学 外语");
for(i=0;i<m;i++)
{
stu[i].id=i+1;
printf("\n%d ",stu[i].id);
scanf("%f %f %f",&stu[i].chinese,&stu[i].mach,&stu[i].english);
getchar();
stu[i].average=0;
// printf("%d %d %d",stu[i].chinese,stu[i].mach,stu[i].english);
}
}
void List()
{
if(stu[0].id<1||stu[0].id>32)
printf("成绩表为空!请先使用命令T录入学生成绩\n");
else if(stu[0].id>=1&&stu[0].id<=32)
{
printf("学号 语文 数学 外语 平均分\n");
for(i=0;i<m;i++)
printf(" %d %.2f %.2f %.2f %.2f\n",stu[i].id,stu[i].chinese,stu[i].mach,stu[i].english,stu[i].average);
}
}
void Average()
{
if(stu[0].id<1||stu[0].id>32)
printf("成绩表为空!请先使用命令T录入学生成绩\n");
else if(stu[0].id>=1&&stu[0].id<=32)
{
for(i=0;i<m;i++)
stu[i].average=(stu[i].chinese+stu[i].mach+stu[i].english)/3.00;
printf("平均分已计算。请使用命令L查看!\n");
}
}
void Sort()
{
if(stu[0].id<1||stu[0].id>32)
printf("成绩表为空!请先使用命令T录入学生成绩\n");
else if(stu[0].id>=1&&stu[0].id<=32)
{
for(i=0;i<m-1;i++)
{
for(int j=0;j<m-1-i;j++)
if(stu[j].average<stu[j+1].average)
{
stu2[0].id=stu[j].id;
stu2[0].average=stu[j].average;
stu2[0].chinese=stu[j].chinese;
stu2[0].english=stu[j].english;
stu2[0].mach=stu[j].mach;
stu[j].id=stu[j+1].id;
stu[j].average=stu[j+1].average;
stu[j].chinese=stu[j+1].chinese;
stu[j].english=stu[j+1].english;
stu[j].mach=stu[j+1].mach;
stu[j+1].id=stu2[0].id;
stu[j+1].average=stu2[0].average;
stu[j+1].chinese=stu2[0].chinese;
stu[j+1].english=stu2[0].english;
stu[j+1].mach=stu2[0].mach;
}
}
printf("完成排序。请使用命令L查看!\n");
}
}
void Search()
{
int o;
if(stu[0].id<1||stu[0].id>32)
printf("成绩表为空!请先使用命令T录入学生成绩\n");
else if(stu[0].id>=1&&stu[0].id<=32)
{
printf("请输入要查询的学生学号\n:");
scanf("%d",&o);getchar();
printf("学号 语文 数学 外语 平均分\n");
printf(" %d %.2f %.2f %.2f %.2f\n",stu[o-1].id,stu[o-1].chinese,stu[o-1].mach,stu[o-1].english,stu[o-1].average);
}
}
void jiemian()
{
printf("*******************************************\n");
printf(" * 学生管理系统--帮助菜单 *\n");
printf("******************************************\n");
printf("* H = 显示帮助菜单 *\n");
printf("* T = 成绩录入 *\n");
printf("* A = 计算学生平均分 *\n");
printf("* L = 列出成绩表 *\n");
printf("* P = 按平均分由高到低排序 *\n");
printf("* S = 按学号查询学生成绩 *\n");
printf("* C = 清屏 *\n");
printf("* Q = 退出系统 *\n");
printf("*****************************************\n");
printf(" * Conyright <C> 2011.06.12 By 姓名 *\n");
printf("******************************************\n");
}
int main(int argc, char const *argv[])
{
jiemian();
char start;
scanf("%c",&start);
getchar();
while('Q'!=start)
{
//printf("%c\n",start);
switch(start)
{
case 'H':jiemian();break;
case 'T':Type();break;
case 'L':List();break;
case 'A':Average();break;
case 'S':Search();break;
case 'P':Sort();break;
case 'C':system("clear");break;
case 'Q':break;
default :printf("错误命令!重新输入!\n");
}
printf("重新输入命令");
scanf("%c",&start);
getchar();
}
return 0;
}
1)系统运行,打开如下界面。列出系统帮助菜单(即命令菜单),提示输入命令。
2)开始时还没有录入成绩,所以输入命令 L 也无法列出成绩。应提示“成绩表为空!请先使用命令 T 录入学生成绩。”
同理,当输入其他的成绩处理命令时也作相应的处理。
3)输入命令 T,调用Type子函数录入成绩。
界面提示输入学生人数
输入3 ¿ 提示输入3名学生的3门课成绩,列出成绩单的表头“学号 语文 数学 英语”,提示学号:1
输入1号学生的3门课成绩,用空格间隔,回车结束。提示学号:2
输入2号学生的3门课成绩,用空格间隔,回车结束。提示学号:3
输入3号学生的3门课成绩,用空格间隔,回车结束。Type子函数调用结束,返回。提示输入命令。
4)输入命令 L ,调用List子函数输出成绩表。List子函数调用结束,返回。提示输入命令。
5)输入命令 A ,调用Average子函数计算平均分,提示“平均分已计算。请使用命令L查看。” Average子函数调用结束,返回。提示输入命令。
输入命令L ,调用List子函数输出成绩表。List子函数调用结束,返回。提示输入命令。
6)输入命令 P ,调用Sort子函数将各学生记录按平均分由高到低排序,提示“完成排序。请使用命令L查看。” Sort子函数调用结束,返回。提示输入命令。
输入命令L ,调用List子函数输出成绩表。List子函数调用结束,返回。提示输入命令。
7)输入命令 S ,调用Search子函数查询学生成绩,提示“输入要查询的学生学号”。
输入2 ¿ 找到2号学生的成绩并输出。Search子函数调用结束,返回。提示输入命令。
8)输入命令C ¿ 执行清屏函数语句system("clear");
清除屏幕的所有内容。提示输入命令。
9)输入命令H ¿ 调用Help子函数显示帮助菜单。Help子函数调用结束,返回。提示输入命令。
10)输入命令Q ¿ 则退出系统。
注意:
1)输出数组元素时,要将学号单独处理,输出为整数(即保留0位小数)。同理,在计算成绩时也要将第1列的学号撇开,只计算第2列之后的。成绩保留1位小数。
2)学生人数n贯穿始终,通过n的值判断当前命令的子函数是否能够调用执行。例如:当n=0时,说明还没有录入成绩。而一旦输入命令T,也即调用Type子函数录入了成绩,则n的值就不再是0。当n!=0时,就可以进行其他的成绩操作,但不能再执行录用成绩的操作。所以当用户输入的命令无法执行时,应当给出提示。