要求:输入(可以不从键盘方式,程序内或文件读取都可)一个班学生某5门课程的成绩(全班最多不超过50人,具体人数由键盘输入),试编程按总成绩由高到低排出名次,要求用函数的方式实现,并输出每门课的第一名。
代码:
#include<stdio.h>
#include<string.h>
int main()
{
int M;
int H[5];
char name[50][10];
float score[50][5];
float ad[50];
float max[5];
int i,j;//定义
printf("请输入班级人数:\n");//输入
scanf("%d",&M);
printf("请输入: 姓名 分数1 分数2 分数3 分数4 分数5:\n");
for(i=0;i<M;i++)
{
scanf("%s",&name[i]);
for(j=0;j<5;j++)
scanf("%f",&score[i][j]);
}//输入结束
float sum;//定义和
for(i=0;i<M;i++)//求和
{
sum=0;
for(j=0;j<5;j++)
{
sum+=score[i][j];
}
ad[i]=sum;
}//求和结束
int z,w;
float a[5],d;
char c[10];//定义
for(i=0;i<M;i++)//从大到小排序
{
for(j=0;j<M-i-1;j++)
if(ad[j]<ad[j+1]){
strcpy(c,name[j]);
strcpy(name[j],name[j+1]);
strcpy(name[j+1],c);
d=ad[j];
ad[j]=ad[j+1];
ad[j+1]=d;
for(z=0;z<5;z++)
{
a[z]=score[j][z];
score[j][z]=score[j+1][z];
score[j+1][z]=a[z];
}
}
} //从大到小排序结束
int y=0;//定义
for(i=0;i<5;i++)//选出每课最好的同学
{
max[i]=score[0][i];
H[i]=0;
for(y=0;y<M;y++){
if(score[y][i]>max[i])
{
max[i]=score[y][i];
H[i]=y;
}
}
}//选出每课最好的同学结束
int u;//定义
printf("总成绩排名:\n");//输出
printf("名次 姓名 课一 课二 课三 课四 课五 总成绩\n");
for(i=0;i<M;i++){
printf("NO.%d:%6s",i+1,name[i]);
for(j=0;j<5;j++)
{printf("%7.1f",score[i][j]);}
printf("%7.1f\n",ad[i]);}
printf("每门功课的第一名:\n");
for(i=0;i<5;i++){
u=H[i];
printf("功课%d最大为:%s %7.1f\n",i+1,name[u],max[i]);}
}