#include<stdio.h>
#include<string.h>
struct student
{ long int num;
char name[8];
double score[3];
};
struct arrayst
{
struct student stu;
double nums;
};
int main()
{
void input(struct arrayst a[],int x);
void output(struct arrayst arr[],int x);
void scoresort(struct arrayst arr[],int x);
arrayst a[100];
int n;
while(1)
{
printf("请输入一个在5到100之间的数:");
scanf("%d",&n);
if(n>=5 && n<=100)
break;
}
printf("NUM MAME SCORE1 SORE2 SCORE3\n");
input(a,n);//建立学生成绩表
printf("Before sort:\n");
printf("NUM MAME SCORE1 SORE2 SCORE3 AVERAGE\n");
output(a,n);//输出学生成绩表
scoresort(a,n);//按平均成绩从高到低排序学生成绩表
printf("After Sort:\n");
printf("NUM MAME SCORE1 SORE2 SCORE3 AVERAGE\n");
output(a,n);//输出学生成绩表
return 0;
}
void input(struct arrayst a[],int x)
{ int i;
for(i=0;i<x;i++)
{
scanf("%d%s%lf%lf%lf",&a[i].stu.num,&a[i].stu.name,&a[i].stu.score[0],&a[i].stu.score[1],&a[i].stu.score[2]);
}
}
void output(struct arrayst arr[],int x)
{ float aver;
int i;
for(i=0;i<x;i++)
{
aver=(arr[i].stu.score[0]+arr[i].stu.score[1]+arr[i].stu.score[2])/3.0;
printf("%-6d%-7s%-9.0lf%-8.0lf%-9.0lf%-.4f\n",arr[i].stu.num,arr[i].stu.name,arr[i].stu.score[0],arr[i].stu.score[1],arr[i].stu.score[2],aver);
}
}
void scoresort(struct arrayst arr[],int x)
{
arrayst temp;
float aver[100];
float temp1;
int i,j,k,r;
for(i=0;i<x;i++)
{
aver[i]=(arr[i].stu.score[0]+arr[i].stu.score[1]+arr[i].stu.score[2])/3.0;
}
for(i=0;i<x-1;i++)
{
for(j=0;j<x-i-1;j++)
if(aver[j]<aver[j+1])
{
temp = arr[j];
temp1 = aver[j];
arr[j] = arr[j + 1];
aver[j] = aver[j+1];
arr[j + 1] = temp;
aver[j+1]=temp1;
}
}
}
通过aver大小把学生信息换位后在output中会再计算一次aver, scoresort函数中的aver不是应该没有交换的必要吗?