求份C语言作业

要求: 学生成绩管理
要求:1 分别输入小组中5位同学的学号、姓名以及以下各科的成绩:
高数Gaoshu 普物Puwu 英语Yingyu 体育Tiyu 哲学Zhexue
2 显示每个同学5科的平均成绩 要求格式如下:
1 10591101 ZhangXX 85
2 10591102 LiXX 79
3 提示用户输入需要查询的科目,显示该科5位同学的平均成绩:
如: Puwu:78
4 提示用户输入需要查询的科目,显示该科的最好成绩,格式如下:
10591101 ZhangXX 87
5 提示用户输入需要查询的某同学的学号,显示该同学的最好的单科成绩: 10591101 ZhangXX Tiyu 97
6 提示用户输入需要查询的某同学的学号,显示该同学的各科成绩方差,如下: 10591101 ZhangXX 87.24
(方差计算方法:各数据平方的平均数减去各数据平均数的平方。)
着急用速度些,谢谢了、、、

#include <stdio.h>
#include <string.h>

struct Student
{
char num[20];
char name[20];
double Gaoshu;
double Puwu;
double Yingyu;
double Tiyu;
double Zhexue;
double average;
double best;
double var;
int flag;
}stu[5];

double grade[5],best[5];
int flag[5];

int main()
{
int i,fun;
double tmp;
char obj[20];
printf("请按照提示输入5位同学的信息...\n\n");
for(i=0;i<5;i++)
{
tmp=0;
printf("请输入第%d位同学的学号:",i+1);
scanf("%s",stu[i].num);
printf("请输入该同学的姓名:");
scanf("%s",stu[i].name);
printf("请输入该同学高数成绩:");
scanf("%lf",&stu[i].Gaoshu);
if(tmp<stu[i].Gaoshu)
{
tmp=stu[i].Gaoshu;
stu[i].flag=0;
}
if(best[0]<stu[i].Gaoshu)
{
best[0]=stu[i].Gaoshu;
flag[0]=i;
}
grade[0]+=stu[i].Gaoshu;
printf("请输入该同学普物成绩:");
scanf("%lf",&stu[i].Puwu);
if(tmp<stu[i].Puwu)
{
tmp=stu[i].Puwu;
stu[i].flag=1;
}
if(best[1]<stu[i].Puwu)
{
best[1]=stu[i].Puwu;
flag[1]=i;
}
grade[1]+=stu[i].Puwu;
printf("请输入该同学英语成绩:");
scanf("%lf",&stu[i].Yingyu);
if(tmp<stu[i].Yingyu)
{
tmp=stu[i].Yingyu;
stu[i].flag=2;
}
if(best[2]<stu[i].Yingyu)
{
best[2]=stu[i].Yingyu;
flag[2]=i;
}
grade[2]+=stu[i].Yingyu;
printf("请输入该同学体育成绩:");
scanf("%lf",&stu[i].Tiyu);
if(tmp<stu[i].Tiyu)
{
tmp=stu[i].Tiyu;
stu[i].flag=3;
}
if(best[3]<stu[i].Tiyu)
{
best[3]=stu[i].Tiyu;
flag[3]=i;
}
grade[3]+=stu[i].Tiyu;
printf("请输入该同学哲学成绩:");
scanf("%lf",&stu[i].Zhexue);
if(tmp<stu[i].Zhexue)
{
tmp=stu[i].Zhexue;
stu[i].flag=4;
}
if(best[4]<stu[i].Zhexue)
{
best[4]=stu[i].Zhexue;
flag[4]=i;
}
grade[4]+=stu[i].Zhexue;
stu[i].average=(stu[i].Gaoshu+stu[i].Puwu+stu[i].Yingyu+stu[i].Tiyu+stu[i].Zhexue)/5.0;
stu[i].var=((stu[i].Gaoshu-stu[i].average)*(stu[i].Gaoshu-stu[i].average)+(stu[i].Puwu-stu[i].average)*(stu[i].Puwu-stu[i].average)+(stu[i].Yingyu-stu[i].average)*(stu[i].Yingyu-stu[i].average)+(stu[i].Tiyu-stu[i].average)*(stu[i].Tiyu-stu[i].average)+(stu[i].Zhexue-stu[i].average)*(stu[i].Zhexue-stu[i].average))/5.0;
putchar('\n');
}
printf("\n信息已录入完毕,请选择操作...\n\n\n");
for(i=0;i<5;i++)
grade[i]/=5.0;
while(1)
{
printf(" 功能菜单\n\n");
printf("1 - 显示每个同学5科的平均成绩\n");
printf("2 - 查询科目平均成绩\n");
printf("3 - 查询科目最优成绩\n");
printf("4 - 查询指定同学的最优单科成绩\n");
printf("5 - 查询指定同学的各科成绩方差\n");
printf("0 - 退出\n\n");
printf("请输入操作指令:");
scanf("%d",&fun);
printf("\n");
if(fun==6)
{
printf("您已安全退出...\n\n");
break;
}
switch(fun)
{
case 1:
{
for(i=0;i<5;i++)
printf("%d %s %s %.2lf\n",i+1,stu[i].num,stu[i].name,stu[i].average);
putchar('\n');
}break;
case 2:
{
printf("请输入所要查询的科目:");
scanf("%s",&obj);
putchar('\n');
if(strcmp(obj,"Gaoshu")==0||strcmp(obj,"高数")==0) printf("Gaoshu:%.2lf\n",grade[0]);
else if(strcmp(obj,"Puwu")==0||strcmp(obj,"普物")==0) printf("Puwu:%.2lf\n",grade[1]);
else if(strcmp(obj,"Yingyu")==0||strcmp(obj,"英语")==0) printf("Yingyu:%.2lf\n",grade[2]);
else if(strcmp(obj,"Tiyu")==0||strcmp(obj,"体育")==0) printf("Tiyu:%.2lf\n",grade[3]);
else printf("Zhexue:%.2lf\n",grade[4]);
putchar('\n');
}break;
case 3:
{
printf("请输入所要查询的科目:");
scanf("%s",&obj);
putchar('\n');
if(strcmp(obj,"Gaoshu")==0||strcmp(obj,"高数")==0) printf("%s %s %.2lf\n",stu[flag[0]].num,stu[flag[0]].name,stu[flag[0]].Gaoshu);
else if(strcmp(obj,"Puwu")==0||strcmp(obj,"普物")==0) printf("%s %s %.2lf\n",stu[flag[1]].num,stu[flag[1]].name,stu[flag[1]].Puwu);
else if(strcmp(obj,"Yingyu")==0||strcmp(obj,"英语")==0) printf("%s %s %.2lf\n",stu[flag[2]].num,stu[flag[2]].name,stu[flag[2]].Yingyu);
else if(strcmp(obj,"Tiyu")==0||strcmp(obj,"体育")==0) printf("%s %s %.2lf\n",stu[flag[3]].num,stu[flag[3]].name,stu[flag[3]].Tiyu);
else printf("%s %s %.2lf\n",stu[flag[4]].num,stu[flag[4]].name,stu[flag[4]].Zhexue);
putchar('\n');
}break;
case 4:
{
printf("请输入所要查询的同学学号:");
scanf("%s",&obj);
putchar('\n');
for(i=0;i<5;i++)
if(strcmp(stu[i].num,obj)==0)
{
printf("%s %s ",stu[i].num,stu[i].name);
switch(stu[i].flag)
{
case 0:printf("Gaoshu %.2lf\n",stu[i].Gaoshu);break;
case 1:printf("Puwu %.2lf\n",stu[i].Puwu);break;
case 2:printf("Yingyu %.2lf\n",stu[i].Yingyu);break;
case 3:printf("Tiyu %.2lf\n",stu[i].Tiyu);break;
case 4:printf("Zhexue %.2lf\n",stu[i].Zhexue);break;
}
break;
}
putchar('\n');
}break;
case 5:
{
printf("请输入所要查询的同学学号:");
scanf("%s",&obj);
putchar('\n');
for(i=0;i<5;i++)
if(strcmp(stu[i].num,obj)==0)
{
printf("%s %s %.2lf\n",stu[i].num,stu[i].name,stu[i].var);
break;
}
putchar('\n');
}break;
}
}
return 0;
}

那个方差没看明白你什么意思,我想的是:先求A同学各科的平均分,然后用他各科的分数减去他的平均分再平方,然后求和,最后除以5。如果不对你自己改改吧。或者把公式告诉我,我再改。
话说,您这10分不好赚啊,花了我老半天呢。

求好评!!!追问

....看不懂。。。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-23
那啥,还是我,上面那个写不开了,这回我加了注释,看看能懂不。如果您觉得我挺辛苦的,要给好评呢,就给上面那个号吧,呵呵。

#include <stdio.h>
#include <string.h>

struct Student //定义一个学生结构体,把学号、姓名、各科成绩等属性放在一起
{
char num[20]; //学号
char name[20]; //姓名
double Gaoshu; //高数成绩
double Puwu; //普物成绩
double Yingyu; //英语成绩
double Tiyu; //体育成绩
double Zhexue; //哲学成绩
double average; //各科平均成绩
double best; //所有科目中的最优成绩
double var; //方差
int flag; //用0到5记录学生的最优状态:如果高数最优,flag=0;如果普物最优,flag=1;如果英语最优,flag=2;如果体育最优,flag=3;如果哲学最优,flag=4;
}stu[5]; //有5个同学,定义结构体数组容量为5

double grade[5],best[5]; //grade数组从0到4依次存储高数、普物、英语、体育、哲学的平均成绩;best数组从0到4依次存储对应的各科最好成绩
int flag[5]; //flag数组从0到4依次存储从高数到哲学各科最好成绩的学生在结构体中的编号

int main()
{
int i,fun; //fun对应功能菜单中的6个选项
double tmp; //暂时变量,无具体意义
char obj[20]; //暂时变量,无具体意义
printf("请按照提示输入5位同学的信息...\n\n");
for(i=0;i<5;i++)
{
tmp=0;
printf("请输入第%d位同学的学号:",i+1);
scanf("%s",stu[i].num);
printf("请输入该同学的姓名:");
scanf("%s",stu[i].name);
printf("请输入该同学高数成绩:");
scanf("%lf",&stu[i].Gaoshu);
if(tmp<stu[i].Gaoshu) //tmp初始化为0,然后把它和第i个学生的各科成绩比较
{
tmp=stu[i].Gaoshu; //如果tmp小于该学生的某科成绩,则把该成绩赋给tmp,这样tmp始终是一读入数据中的最大值
stu[i].flag=0; //最上面说过了,结构体中的flag用来记录该学生哪课的成绩最优
}
if(best[0]<stu[i].Gaoshu) //best数组初始值为0,如果best[0],即最优高数成绩小于新读入的高数成绩
{
best[0]=stu[i].Gaoshu; //则把新的最优高数成绩赋给best[0],这样best[0]始终是一读入数据中的最优解
flag[0]=i; //结构体外的flag保存对应科目最优成绩的学生的结构体编号
}
grade[0]+=stu[i].Gaoshu; //先把各个学生的单科成绩加和,最后除以5求平均值
printf("请输入该同学普物成绩:");
scanf("%lf",&stu[i].Puwu);
if(tmp<stu[i].Puwu)
{
tmp=stu[i].Puwu;
stu[i].flag=1;
}
if(best[1]<stu[i].Puwu)
{
best[1]=stu[i].Puwu;
flag[1]=i;
}
grade[1]+=stu[i].Puwu;
printf("请输入该同学英语成绩:");
scanf("%lf",&stu[i].Yingyu);
if(tmp<stu[i].Yingyu)
{
tmp=stu[i].Yingyu;
stu[i].flag=2;
}
if(best[2]<stu[i].Yingyu)
{
best[2]=stu[i].Yingyu;
flag[2]=i;
}
grade[2]+=stu[i].Yingyu;
printf("请输入该同学体育成绩:");
scanf("%lf",&stu[i].Tiyu);
if(tmp<stu[i].Tiyu)
{
tmp=stu[i].Tiyu;
stu[i].flag=3;
}
if(best[3]<stu[i].Tiyu)
{
best[3]=stu[i].Tiyu;
flag[3]=i;
}
grade[3]+=stu[i].Tiyu;
printf("请输入该同学哲学成绩:");
scanf("%lf",&stu[i].Zhexue);
if(tmp<stu[i].Zhexue)
{
tmp=stu[i].Zhexue;
stu[i].flag=4;
}
if(best[4]<stu[i].Zhexue)
{
best[4]=stu[i].Zhexue;
flag[4]=i;
}
grade[4]+=stu[i].Zhexue;
stu[i].average=(stu[i].Gaoshu+stu[i].Puwu+stu[i].Yingyu+stu[i].Tiyu+stu[i].Zhexue)/5.0; //求第i个学生的平均成绩
stu[i].var=((stu[i].Gaoshu-stu[i].average)*(stu[i].Gaoshu-stu[i].average)+(stu[i].Puwu-stu[i].average)*(stu[i].Puwu-stu[i].average)+(stu[i].Yingyu-stu[i].average)*(stu[i].Yingyu-stu[i].average)+(stu[i].Tiyu-stu[i].average)*(stu[i].Tiyu-stu[i].average)+(stu[i].Zhexue-stu[i].average)*(stu[i].Zhexue-stu[i].average))/5.0; //求第i个学生的方差
putchar('\n');
}
printf("\n信息已录入完毕,请选择操作...\n\n\n");
for(i=0;i<5;i++)
grade[i]/=5.0;
while(1)
{
printf(" 功能菜单\n\n");
printf("1 - 显示每个同学5科的平均成绩\n");
printf("2 - 查询科目平均成绩\n");
printf("3 - 查询科目最优成绩\n");
printf("4 - 查询指定同学的最优单科成绩\n");
printf("5 - 查询指定同学的各科成绩方差\n");
printf("0 - 退出\n\n");
printf("请输入操作指令:");
scanf("%d",&fun); //通过fun的值来控制功能
printf("\n");
if(fun==6) //如果fun=6,就break,跳出while循环,程序结束
{
printf("您已安全退出...\n\n");
break;
}
switch(fun) //用switch循环来控制其它的fun值
{
case 1: //fun=1,则执行功能菜单的第 1 个功能,显示各个同学的平均成绩,下面的一样
{
for(i=0;i<5;i++)
printf("%d %s %s %.2lf\n",i+1,stu[i].num,stu[i].name,stu[i].average);
putchar('\n');
}break;
case 2:
{
printf("请输入所要查询的科目:");
scanf("%s",&obj); //obj保存输入的科目
putchar('\n');
if(strcmp(obj,"Gaoshu")==0||strcmp(obj,"高数")==0) printf("Gaoshu:%.2lf\n",grade[0]); //如果obj是中文或英文的高数,则显示高数的平均成绩,下面的一样
else if(strcmp(obj,"Puwu")==0||strcmp(obj,"普物")==0) printf("Puwu:%.2lf\n",grade[1]);
else if(strcmp(obj,"Yingyu")==0||strcmp(obj,"英语")==0) printf("Yingyu:%.2lf\n",grade[2]);
else if(strcmp(obj,"Tiyu")==0||strcmp(obj,"体育")==0) printf("Tiyu:%.2lf\n",grade[3]);
else printf("Zhexue:%.2lf\n",grade[4]);
putchar('\n');
}break;
case 3:
{
printf("请输入所要查询的科目:");
scanf("%s",&obj);
putchar('\n');
if(strcmp(obj,"Gaoshu")==0||strcmp(obj,"高数")==0) printf("%s %s %.2lf\n",stu[flag[0]].num,stu[flag[0]].name,stu[flag[0]].Gaoshu);
else if(strcmp(obj,"Puwu")==0||strcmp(obj,"普物")==0) printf("%s %s %.2lf\n",stu[flag[1]].num,stu[flag[1]].name,stu[flag[1]].Puwu);
else if(strcmp(obj,"Yingyu")==0||strcmp(obj,"英语")==0) printf("%s %s %.2lf\n",stu[flag[2]].num,stu[flag[2]].name,stu[flag[2]].Yingyu);
else if(strcmp(obj,"Tiyu")==0||strcmp(obj,"体育")==0) printf("%s %s %.2lf\n",stu[flag[3]].num,stu[flag[3]].name,stu[flag[3]].Tiyu);
else printf("%s %s %.2lf\n",stu[flag[4]].num,stu[flag[4]].name,stu[flag[4]].Zhexue);
putchar('\n');
}break;
case 4:
{
printf("请输入所要查询的同学学号:");
scanf("%s",&obj); //这里obj保存输入的学号,反正都是字符型的,不用定义新的
putchar('\n');
for(i=0;i<5;i++)
if(strcmp(stu[i].num,obj)==0)
{
printf("%s %s ",stu[i].num,stu[i].name);
switch(stu[i].flag) //根据结构体中flag的值判断该学生哪科成绩最优,对应规则上面说过了
{
case 0:printf("Gaoshu %.2lf\n",stu[i].Gaoshu);break;
case 1:printf("Puwu %.2lf\n",stu[i].Puwu);break;
case 2:printf("Yingyu %.2lf\n",stu[i].Yingyu);break;
case 3:printf("Tiyu %.2lf\n",stu[i].Tiyu);break;
case 4:printf("Zhexue %.2lf\n",stu[i].Zhexue);break;
}
break;
}
putchar('\n');
}break;
case 5:
{
printf("请输入所要查询的同学学号:");
scanf("%s",&obj);
putchar('\n');
for(i=0;i<5;i++)
if(strcmp(stu[i].num,obj)==0)
{
printf("%s %s %.2lf\n",stu[i].num,stu[i].name,stu[i].var);
break;
}
putchar('\n');
}break;
}
}
return 0;
}