oj题目分享3

【问题4

期末考试结束了,作为班主任的你,需要根据本班学生的平均分,对学生进行排名,请按照成绩从高到低排名,成绩相同时则排名相同,但输出时先按照姓名字典序从低到高输出,如果姓名还相同,则按照学号从小到大输出。

【输入形式】

第一行为正整数n0 < n ≤ 100),表示学生数量。

接下来n行,每行为一个学生信息,包括:学号、姓名和平均分,空格分隔;其中:学号是整数,姓名是字符串(只有字母,不存在空白字符等特殊字符,长度不超过20个字符)、平均分为浮点数。学号是唯一的,不会重复,姓名和平均分可能相同。

【输出形式】

输出n行,每行为一个学生信息,依次为名次、学号、姓名和平均分,中间用一个空格分隔,平均分保留小数点后2位。输出的顺序为首先按照成绩从高到低,成绩相同的按照姓名字典序从小到大,成绩和姓名都相同的,则按照学号从小到大。名次从1开始,依次递增;如果成绩相同,则名次相同,但之后的名次不再连续编号,要变成实际的名次,如:排名第11位同学,排名第2的有3位同 学,则这3位同学的名次都是2,但下一个名次应该变为5 (即就没有第34名)。

【样例输入】

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 20211022221103的成绩都 88分,按照姓名拼音lisi排在zhangsan前面,而且他们的排名都是第2 2221101 zhangsan成绩为86.50排名第4 (因为有2个并列第2名,所以就没有第3名), 最后2221105 maliu5

【评分标准】

根据输入要求输出指定的结果,提交程序名为:sort.c

#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);
}

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值