完成以下程序,并进行调试
某班期末考试科目为数学、英语和计算机,有最多不超过30人参加考试,考试后要求:1)计算每个学生的总分和平均分;
2)按总分成绩由高到低排出成绩的名次;
3)打印出名次表,表格内包括学生学号、各科分数、总分和平均分;
4)任意输入一个学号,能够查找出该学生在班级中的排名及其考试分数。
【提示】:用二维数组score存放每个学生各门课程的成绩,用一维数组num存放每个学生的学号,用一维数组sum存放每个学生的总分,用一维数组aver存放每个学生的平均分。
程序代码:
#include <stdio.h>
void total(int score[][3],int n,int sum[])//计算总分
{
int i,j;
for (i=0;i<n;i++)
{
sum[i] = 0;
for(j=0;j<3;j++)
sum[i] += score[i][j];
}
}
void averger(int sum[],int n,float aver[])//计算平均分
{
int i;
for(i=0;i<n;i++)
aver[i] = 1.0 * sum[i]/3;
}
void sort(int sum[],int n,int score[][3],float aver[],int num[])//按总分排序
{
int i,j;
int t,k;
float f;
for (i=0;i<n-1;i++)
{
for (j=0;j<n-1-i;j++)
{
if (sum[j] < sum[j+1])
{
t = sum[j];
sum[j] = sum[j+1];
sum[j+1]=t;
f=aver[j];//交换平均分
aver[j+1]=aver[j+1];
aver[j+1]=f;
for(k=0;k<3;k++)//交换score
{
t = score[j][k];
score[j][k]= score[j+1][k];
score[j+1][k] = t;
}
t = num[j];//交换学号
num[j]=num[j+1];
num[j+1]=t;
}
}
}
}
void pm(int sum[],int pm[],int n)//排名,并保存名次
{
int i = 0;
int mc = 1;
pm[0] = 1;
for (i=1;i<n;i++)
{
if(sum[i]== sum[i-1])
pm[i] = mc;
else
{
mc++;
pm[i] = mc;
}
}
}
void printmc(int num[],int n,int mc[])//打印名次表
{
int i;
printf("学号 排名\n");
for (i=0;i<n;i++)
{
printf("%2d %d\n",num[i],mc[i]);
}
}
int find(int num[],int score[][3],int n,int sum[],int mc[],int k)//查找k
{
int i=0;
for (i=0;i<n;i++)
{
if(num[i] == k)
{
printf("学号:%d\n",num[i]);
printf("成绩:%d %d %d\n",score[i][0],score[i][1],score[i][2]);
printf("总成绩:%d\n",sum[i]);
printf("名次:%d\n",mc[i]);
break;
}
}
if(i==n)
{
printf("未找到该学号学员\n");
}
return 0;
}
int main()
{ int score[30][3],sum[30],num[30],mc[30];
float aver[30];
int n,k,i,j;
printf("请输入学员人数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("请输入学员%d的数学、英语、计算机成绩:",i+1);
num[i] = i+1;
for(j=0;j<3;j++)
scanf("%d",&score[i][j]);
}
total(score,n,sum);//计算总成绩
averger(sum,n,aver);//计算平均成绩
sort(sum,n,score,aver,num);//根据总成绩排序
pm(sum,mc,n);//排名
printmc(num,n,mc);//打印排名
printf("请输入要查找的学员学号:");
scanf("%d",&k);
find(num,score,n,sum,mc,k);//查找某个学号学员的信息
return 0;
}