成绩排序

题目描述

      科大学生成绩表有学号、数学成绩、英语成绩与程序设计成绩4项。按学号次序给定一个班的成绩,要求根据个人总分高低排序输出同学们的成绩。

输入

      第一行是整数N,表示班级学生人数(N<=40)。

      随后有N行,每一行依次有空格分开的学号、数学成绩、英语成绩与程序设计成绩等4项。学号统一都是10位数字,前四位是1705,而且不会有相同学号。成绩是来自区间[0,100]的整数。

输出

根据总分由高到低进行排序。如果总分相同,则数学成绩高者居前,如果数学成绩也相同,则英语成绩高者居前,若英语成绩相同,则学号按字典序(即strcmp的比较规则)小者居前。

        每一个学生输出学号,三门成绩总分,数学成绩,英语成绩,程序设计成绩五项信息。其中学号宽度占15位,其它各数据项宽度占5位,输出格式类如”%-5d”,见样例。

样例输入 Copy

<span style="background-color:#ffffff"><span style="color:#333333"><span style="color:#333333"><span style="background-color:#f5f5f5">6
1705050201 78 65 95
1705050202 81 85 85
1705050203 95 65 78
1705050204 66 65 67
1705050205 56 67 89
1705050206 65 95 80
</span></span></span></span>

样例输出 Copy

<span style="background-color:#ffffff"><span style="color:#333333"><span style="color:#333333"><span style="background-color:#f5f5f5">1705050202     251  81   85   85   
1705050206     240  65   95   80   
1705050203     238  95   65   78   
1705050201     238  78   65   95   
1705050205     212  56   67   89   
1705050204     198  66   65   67   </span></span></span></span>
#include <stdio.h>
#include<string.h>
struct student{                 /*学生信息结构类型定义*/
    char num[10];//要用到strcmp函数所以将学号定义为字符数组                    /*学号*/
    int computer,english,math;  /*三门课程成绩*/
    int sum;
};
int main(void)
{
    int i,j,n,index=0;//注意要将index的初始值设为0
    struct student stu[40],change;
    scanf("%d",&n);
  
    for(i=0;i<n;i++){
    	scanf("%s%d%d%d",stu[i].num,&stu[i].math,&stu[i].english,&stu[i].computer);
	    stu[i].sum=stu[i].computer+stu[i].math+stu[i].english;
    } 

    for(i=0;i<n-1;i++){//选择排序法,只用进行n-1次 
    	index=i;//index用来储存最大值 
		for(j=i+1;j<n;j++){
			if(stu[j].sum>stu[index].sum){
				index=j;
			}
			else if(stu[j].sum==stu[index].sum){
				if(stu[j].math>stu[index].math){
					index=j;
				}
				else if(stu[j].math==stu[index].math){
						if(stu[j].english>stu[index].english){
					    index=j;
				        }
				        else if(stu[j].english==stu[index].english){
				        	if(strcmp(stu[j].num,stu[index].num)<0){
				        		index=j;
							}
						}
				}
			}
		
		} 
		change=stu[index];
		stu[index]=stu[i];
		stu[i]=change;
	}
    
   for(i=0;i<n;i++){
   	printf("%-15s%-5d%-5d%-5d%-5d\n",stu[i].num,stu[i].sum,stu[i].math,stu[i].english,stu[i].computer);
   }
   
    return 0;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值