解题思路:

注意事项:

参考代码:


#include<stdio.h>

void put_number(int n);//输入参数

void sort(int (*sum)[2],int (*grade)[3],int);//排序

void change(int *x1,int *x2,int *,int *);   //交换


/******************************************/


int main ()

{

int n;

scanf("%d",&n);

    put_number(n);

return 0;

}


/*****************输入参数*************************/

void put_number(int n)   

{

int grade[n][3];

int sumgrade[n][2];

 

for (int i=0;i<n;i++){

scanf("%d %d %d",&grade[i][0],&grade[i][1],&grade[i][2]);

            sumgrade[i][0]=grade[i][0]+grade[i][1]+grade[i][2];

sumgrade[i][1]=i+1;

}

sort(sumgrade,grade,n); 

}


/******************排序************************/

//会出现两类排序,第一类比成绩,第二类各科成绩

void sort(int (*sum)[2],int (*grade)[3],int n)

{

     

for(int i=0;i<n;i++)   //冒泡排序

{

   for (int j=0;j<n;j++)

   {

    if(sum[i][0]>sum[j][0])  //比较总成绩

    {

    change(grade[i],grade[j],sum[i],sum[j]);

   }

    else if(sum[i][0]==sum[j][0])//总成绩同

    {

    if(grade[i][0]>grade[j][0])//比较语文成绩

    {

    change(grade[i],grade[j],sum[i],sum[j]);

   }

   else if(grade[i][0]==grade[j][0])//语文成绩同

   {

   if(sum[i][1]<sum[j][1])   //比较学号

   change(grade[i],grade[j],sum[i],sum[j]);

   }

   }

    }

     }

     if(n>=5)              //多于5人,取前五名

     for(int i=0;i<5;i++)

     printf("%d %d\n",sum[i][1],sum[i][0]);

     else                  //少于五人,每人都有奖

     for(int i=0;i<n;i++)

     printf("%d %d\n",sum[i][1],sum[i][0]);

}

/******************交换************************/

void change(int *x1,int *x2,int *sum,int *sum1)

{

int c;  //中间量

for (int k=0;k<3;k++)//交换各科成绩

{

c=x1[k];

x1[k]=x2[k];

x2[k]=c;

}

for(int k=0;k<2;k++) //交换总成绩,及学号

{

c=sum[k];

sum[k]=sum1[k];

sum1[k]=c; }

}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论