题面
根据要求编写程序P765.C的指定部分:
程序P765.C已编写部分代码请根据程序中的要求完善程序——注意,**除指定位置外,不能对程序中已有部分作任何修改或重新编写一个程序,否则作0分处理**。
程序的功能是:有五个学生,每个学生的数据包括学号、姓名(最长19字节)、三门课的成绩,从键盘输入五个学生的数据,计算每个学生的平均成绩并按平均成绩由高到低排序,并将排序结果显示。要求用结构体编程,变量数据类型的选择应适当,在保证满足设计要求精度的情况下,养成不浪费内存空间和计算时间的好习惯。编程可用素材:printf("Please input info of students:No Name Math English Computer\n")...。
程序的运行效果应类似地如图1所示,图1中的:
2001 wanghai 78 83 90
2003 zhangzhong 82 80 98
2005 liumei 95 81 90
2006 sunqian 70 77 90
2009 jiansansa 63 87 90
是从键盘输入的内容。
原码
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
STUDENT myclass[5], *pStu = myclass;
int i;
const int N = 5;
printf("\nResult of sort:\n");
printf("Num Name Math English Computer Average\n");
for (i=0; i<N; i++)
{
printf("%-5d %-20s %-8d %-8d %-8d %-.2f\n", (pStu+i)->num, (pStu+i)->name,
(pStu+i)->math, (pStu+i)->english, (pStu+i)->computer, (pStu+i)->average);
}
return 0;
}
修改后
#include <stdio.h>
#include <stdlib.h>
typedef struct student
{
int num;
char name[20];
int math;
int english;
int computer;
float average;
} STUDENT;
void sort(STUDENT myclass[5],int N);
int main(void)
{
STUDENT myclass[5], *pStu = myclass;
int i;
const int N = 5;
printf("Please input info of students:No Name Math English Computer\n");
for(i=0;i<N;i++)
{
printf("%d:",i+1);
scanf("%d%s%d%d%d", &myclass[i].num, myclass[i].name,
&myclass[i].math,&myclass[i].english,&myclass[i].computer);
myclass[i].average = (float)(myclass[i].math+myclass[i].english+myclass[i].computer)/3.0;
}
sort(myclass,N);
printf("\nResult of sort:\n");
printf("Num Name Math English Computer Average\n");
for (i=0; i<N; i++)
{
printf("%-5d %-20s %-8d %-8d %-8d %-.2f\n", (pStu+i)->num, (pStu+i)->name,
(pStu+i)->math, (pStu+i)->english, (pStu+i)->computer, (pStu+i)->average);
}
return 0;
}
void sort(STUDENT myclass[5],int N)
{
int i,j;
STUDENT tmp;
for(i=0;i<N-1;i++)
{
for(j=0;j<N-1-i;j++)
{
if(myclass[j].average<myclass[j+1].average)
{
tmp = myclass[j];
myclass[j] = myclass[j+1];
myclass[j+1] = tmp;
}
}
}
}
知识点
- 结构体的定义,成员变量名的反推命名
- 函数的声明,定义和调用
- 结构体数组当成参数的传参,同时传入元素个数,方便做冒泡排序
- 对结构体数组排序,比较的是平均分,交换的是结构体元素数据
- 基本的要求,节约内存,这就是为何用float不用double的原因,具体问题要具体分析,满足要求即可