例题详解:
1.
在主函数中定义结构体数组,struct student stutable[10];
struct student {
int stunum;//学号
char name[20];//姓名
float examscore;//考试成绩
float labscore;//实验成绩
float totalmark;//总评成绩
};
输入如下十个学生的成绩数据,每个学生信息包括 学号 、姓名 、考试成绩 ,实验成绩。同时计算每个学生的总评成绩( =考试成绩*60% + 实验成绩*40%)并保存至每个结构体的totalmark。
71250 张三 95 82
69753 李四 88 86
12254 王五 87 88
61256 张六 73 85
30258 孙七 25 88
11260 柯八 82 76
33262 谢九 91 85
29263 叶十 80 75
22483 陈一 80 76
71525 王二 71 88
2.
在主函数中定义一个结构体指针数组,struct student *parrray[10] ; 使其每一个指针指向上述结构体数组中的一个元素; 按总评成绩从高到低的顺序,对指针数组parray进行排序,按总评成绩从高到低的顺序输出排序之后的全部学生成绩。
struct student *parray[10],*t;
int main() {
int i,j;
struct student stutable[10],*p;
struct student *parray[10],*t;
for(p=stutable,i=0; p<stutable+10,i<10; p++,i++) {
scanf("%d %s %f %f",&p->stunum,p->name,&p->examscore,&p->labscore);//输入数据
p->totalmark=p->examscore*0.6+p->labscore*0.4;//计算总评
parray[i]=p;//指针数组初始化
}
//冒泡排序,比较总评,交换指针
for(i=0; i<9; i++) {
for(j=0; j<9-i; j++) {
if(parray[j]->totalmark<parray[j+1]->totalmark) {
t=parray[j];
parray[j]=parray[j+1];
parray[j+1]=t;
}
}
}//排序
for(i=0; i<10; i++) {
printf("%d\t%s\t%.2f\t%.2f\t%.2f\n",parray[i]->stunum,parray[i]->name,
parray[i]->examscore,parray[i]->labscore,parray[i]->totalmark);
}//输出信息
}
输入重定向结果: