【问题4】
期末考试结束了,作为班主任的你,需要根据本班学生的平均分,对学生进行排名,请按照成绩从高到低排名,成绩相同时则排名相同,但输出时先按照姓名字典序从低到高输出,如果姓名还相同,则按照学号从小到大输出。
【输入形式】
第一行为正整数n(0 < n ≤ 100),表示学生数量。
接下来n行,每行为一个学生信息,包括:学号、姓名和平均分,空格分隔;其中:学号是整数,姓名是字符串(只有字母,不存在空白字符等特殊字符,长度不超过20个字符)、平均分为浮点数。学号是唯一的,不会重复,姓名和平均分可能相同。
【输出形式】
输出n行,每行为一个学生信息,依次为名次、学号、姓名和平均分,中间用一个空格分隔,平均分保留小数点后2位。输出的顺序为首先按照成绩从高到低,成绩相同的按照姓名字典序从小到大,成绩和姓名都相同的,则按照学号从小到大。名次从1开始,依次递增;如果成绩相同,则名次相同,但之后的名次不再连续编号,要变成实际的名次,如:排名第1有1位同学,排名第2的有3位同 学,则这3位同学的名次都是2,但下一个名次应该变为5 (即就没有第3、4名)。
【样例输入】
5
2221101 zhangsan 86.5
2221102 lisi 88
2221103 zhangsan 88
2221104 wangwu 90
2221105 maliu 65
【样例输出】
1,2221104 wangwu 90.00
2, 2221102 lisi 88.00
2. 2221103 zhangsan 88.00
4, 2221101 zhangsan 86.50
5, 2221105 maliu 65.00
【样例说明】
22211004号的wangwu的成绩为90分,排名第1; 2021102和2221103的成绩都 是88分,按照姓名拼音lisi排在zhangsan前面,而且他们的排名都是第2; 2221101 的zhangsan成绩为86.50,排名第4 (因为有2个并列第2名,所以就没有第3名), 最后2221105 的 maliu第5。
【评分标准】
#include<stdio.h>
#include<string.h>
struct Student{
int xuhao;//序号
int num;//学号
char name[20];//姓名
double avg;//平均分
};
void stusorrt(struct Student stu[],int n){
for(int i=0;i<n-1;i++){
for(int j=0;j<n-i-1;j++){
if(stu[j].avg<stu[j+1].avg){//交换位置
struct Student temp;
temp=stu[j];
stu[j]=stu[j+1];
stu[j+1]=temp;
}else if(stu[j].avg==stu[j+1].avg){//平均分相同
stu[j+1].xuhao=stu[i].xuhao;
if(stu[j].name>stu[j+1].name){//姓名从低到高排序
struct Student temp;
temp=stu[j];
stu[j]=stu[j+1];
stu[j+1]=temp;
}else if(stu[j].name==stu[j+1].name) {
if(stu[j].num>stu[j+1].num){
struct Student temp;
temp=stu[j];
stu[j]=stu[j+1];
stu[j+1]=temp;
}
}
}
}
}
//初试化数组序号
for(int i=0;i<n;i++){
stu[i].xuhao=i+1;
}
for(int i=0;i<n-1;i++){
if(stu[i+1].avg==stu[i].avg){
stu[i+1].xuhao=stu[i].xuhao;
}
}
}
void stuprintf(struct Student stu[],int n){
for(int i=0;i<n;i++){
printf("%d %d %s %.2f\n",stu[i].xuhao,stu[i].num,stu[i].name,stu[i].avg);
}
}
int main(){
int n;//学生数量
scanf("%d",&n);
struct Student stu[n];
for(int i=0;i<n;i++){
struct Student student;
int num1;
char name1[20];
double avg1=0.00;
scanf("%d %s %lf",&num1,&name1,&avg1);
student.num=num1;
strcpy(student.name,name1);//字符串赋值
student.avg=avg1;
stu[i]=student;
}
stusorrt(stu,n);
stuprintf(stu,n);
}