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; 

}

温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网