定义结构体struct stu,编写成绩排名函数:void sort(struct stu *ps,int n),对结构体数组按成绩排名。 程序功能为读入整数N(N<100),再读入N个学生的学号(整型)和成绩(实数)。按样例输出排名。
输入格式:
见样例
输出格式:
第一列是名次,注意并列情况;第二列是学号,第三列是成绩(2位小数)。
输入样例:
5
101 99
102 100
103 50
104 80
105 99
输出样例:
1 102 100.00
2 101 99.00
2 105 99.00
4 104 80.00
5 103 50.00
思路:在题目中就有所涉及,需要在所定义的函数中完成排序任务。再输出即可。
略微麻烦的地方:在于输出排序名次时,遇到相同名次的时候,可能使代码有所繁杂,其他地方输出时没有难点。
解决办法:定义两个新变量,一个用来记录名次(m),一个当作缓冲(buff)。缓冲的意思是,如果存在多个相同成绩的时候,可以输出多个相同的名次,并且在下一个与之不相同的名次,直接跳过原本需要衔接的名次。即在输出样例中,可以输出12245的名次。
#include <stdio.h>
struct stu{
int num;
float score;
};
void sort(struct stu *ps,int n){
struct stu tmp;
int i,j;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(ps[i].score<ps[j].score)
{
tmp=ps[i];
ps[i]=ps[j];
ps[j]=tmp;
}
}
}
}
int main()
{
struct stu s[100];
int n,i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d %f",&s[i].num,&s[i].score);
}
sort(s,n);
i=0;
int buff=1;
int m=1;
while(1){
printf("%d %d %.2f\n",m,s[i].num,s[i].score);
if(s[i].score==s[i+1].score)
{
buff++;
}
else
{
m=m+buff;
buff=1;
}
i++;
if(n==i)
break;
}
}