*有10个学生,每个学生的数据包括学号,姓名,3门课程的成绩,从键盘输入10个学生的成绩,要求打印出3门课程的总平均成绩,以及最高分学生的成绩,包括学号,姓名,3门课程成绩,平均分数*/

*有10个学生,每个学生的数据包括学号,姓名,3门课程的成绩,从键盘输入10个学生的成绩,要求打印出3门课程的总平均成绩,以及最高分学生的成绩,包括学号,姓名,3门课程成绩,平均分数*/_第1张图片

/*有10个学生,每个学生的数据包括学号,姓名,3门课程的成绩,从键盘输入10个学生的成绩,要求打印出3门课程的总平均成绩,以及最高分学生的成绩,包括学号,姓名,3门课程成绩,平均分数*/
#include 
#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;
  }
 }
 
}

你可能感兴趣的:(c语言)