解题思路:
注意事项:
参考代码:
#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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复