C语言:生成20个学号姓名和5门成绩的结构体数组,不动其数据,用指针数组按平均成绩由高至低排序,咋写?
1.学号8位,数字字符串,随机生成,不得重复。
2.姓名5位,为方便用STU01~STU20(人数多于20时取最大人数,但不超过99).
3.成绩0~100,整型。
4.最大人数用宏定义,保证在10~99间代码正确运行。 展开
(感觉略有难度) 题目没有要求计算和输出平均值,所以排序可以不求平均值而按五门总分进行,效果与求出平均分是一样的——
代码文本:
#include "stdio.h"
#include <stdlib.h>
#include <string.h>
#include "time.h"
#define N 20
struct stu{
int s[5];
char SN[9],NAME[6];
};
int main(int argc,char *argv[]){
int i,j,k;
struct stu A[N],*p[N],*q;
srand((unsigned)time(NULL));
for(i=0;i<N;i++){//随机生成学生信息
do{//随机生成8位学号且不重复
itoa(10000+rand()%10000,A[i].SN,10);
strcpy(A[i].SN,A[i].SN+1);
itoa(1000+rand()%1000,A[i].SN+4,10);
for(j=0;j<i;j++)
if(strcmp(A[i].SN,A[j].SN)==0)
break;
}while(j<i);
A[i].NAME[0]='S',A[i].NAME[1]='T',A[i].NAME[2]='U';
A[i].NAME[3]=(i+1)/10+'0',A[i].NAME[4]=(i+1)%10+'0';
A[i].NAME[5]='\0';
for(j=0;j<5;A[i].s[j++]=rand()%101);//随机生成成绩
}
for(i=0;i<N;p[i]=A+i++);//为指针数组赋值
for(i=0;i<N;i++){
for(k=i,j=k+1;j<N;j++)
if(p[k]->s[0]+p[k]->s[1]+p[k]->s[2]+p[k]->s[3]+p[k]->s[4]<
p[j]->s[0]+p[j]->s[1]+p[j]->s[2]+p[j]->s[3]+p[j]->s[4])
k=j;
if(i-k)
q=p[i],p[i]=p[k],p[k]=q;//把平均成绩高的向前交换
printf("%s\t%s\t",p[i]->SN,p[i]->NAME);//输出学号姓名
for(j=0;j<5;printf("%4d",p[i]->s[j++]));//输出原始成绩
putchar('\n');
}
return 0;
}