人生亦梦


私信TA

用户名:uq_55161405400

访问量:8861

签 名:

追寻强大且简洁的算法解疑,不会有难题,因而我为此痴迷

等  级
排  名 3060
经  验 2049
参赛次数 1
文章发表 25
年  龄 0
在职情况 学生
学  校
专  业 网络空间安全

  自我简介:

菜,并痴迷着; 爱,并奋斗着

解题思路:

注意事项:

参考代码:


#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分

1 人评分

  评论区

  • «
  • »