C语言:生成20个学号姓名和5门成绩的结构体数组,不动其数据,用指针数组按平均成绩由高至低排序,咋写?

要求:1.学号8位,数字字符串,随机生成,不得重复。2.姓名5位,为方便用STU01~STU20(人数多于20时取最大人数,但不超过99).3.成绩0~100,整型。4.... 要求:
1.学号8位,数字字符串,随机生成,不得重复。
2.姓名5位,为方便用STU01~STU20(人数多于20时取最大人数,但不超过99).
3.成绩0~100,整型。
4.最大人数用宏定义,保证在10~99间代码正确运行。
展开
 我来答
White_MouseYBZ
2021-01-19 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6638万
展开全部

(感觉略有难度)  题目没有要求计算和输出平均值,所以排序可以不求平均值而按五门总分进行,效果与求出平均分是一样的——

代码文本:

#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; 

}

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式