/*有10个学生,每个学生的数据包括学号,姓名,3门课程的成绩,从键盘输入10个学生的成绩,要求打印出3门课程的总平均成绩,以及最高分学生的成绩,包括学号,姓名,3门课程成绩,平均分数*/
#include <stdio.h>
#define N 5
#define M 3
typedef struct student{
int num;
char name[20];
double score[3];
double aver;
}stu;
void Write(stu ss[]);
void Print(stu ss[]);
void CalMax(stu ss[]);
void main(){
stu ss[N];
/*输入数据*/
Write(ss);
printf("num\tname\tscore1\tscore2\tscore3\taverage\n");
Print(ss);
CalMax(ss);
Print(ss);
}
void Write(stu ss[]){
int i,j;
double sum;
for(i=0;i<N;i++){
sum=0;
scanf("%d%s",&ss[i].num ,ss[i].name);
for(j=0;j<M;j++){
scanf("%lf",&ss[i].score[j]);
sum+=ss[i].score[j];
}
ss[i].aver=sum/M;
}
}
void Print(stu ss[]){
int i,j;
for(i=0;i<N;i++){
printf("%d\t%s\t ",ss[i].num ,ss[i].name);
for(j=0;j<M;j++){
printf("%.1lf\t",ss[i].score[j]);
}
printf("%.2lf\n",ss[i].aver);
}
}
/*用选择排序法对学生的平均成绩排序,找出平均成绩最高的学生*/
void CalMax(stu ss[]){
int i,j,max;
stu temp;
for(i=0;i<N-1;i++){//无序区的表头号 ,进行n-1轮选择
max=i;//每一轮无序区首位被假设为无序区的最大数
/*每一轮扫描:从第无序区首位的下一个数到最后一个数 */
for(j=i+1;j<N;j++){
if(ss[j].aver>ss[max].aver){
max=j;//max中保存了这一轮扫描过程中最大元素的下标
}
}
//提高运行效率,即是否需要交换,如果刚好是无序区首位在无序区最大,就不需要交换
if(max!=i){//如果最大元素的下标和无序区首位的下标不相等
temp=ss[max];
ss[max]=ss[i];
ss[i]=temp;
}
}
}
*有10个学生,每个学生的数据包括学号,姓名,3门课程的成绩,从键盘输入10个学生的成绩,要求打印出3门课程的总平均成绩,以及最高分学生的成绩,包括学号,姓名,3门课程成绩,平均分数*/
最新推荐文章于 2022-11-11 09:53:27 发布