【专题训练】成绩统计表

【问题描述】

  中考阅卷结束后学校教导主任拿到了本校的每位考生的成绩表。表中每个考生的信息包括:考号、姓名、语文、数学、外语、物理、化学、总分(未计算)。现在需要你帮助主任编写一个程序完成下列任务:

  任务1、计算每位考生的总分。

  任务2、按总分由高到底排序,排序的标准是:先按总分由高到低排序;如果总分相同,则按语文成绩由高到低排序;如果总分和语文成绩都相同,则按数学成绩由高到低排序;如果总分、语文成绩、数学成绩都相同,则按考号由小到大排序。

  任务3、根据考生提供的考号,查询该考生的总分、各科成绩以及和他的名次(这里的名次是指按任务2排序后的名次)。

【输入格式】

  第一行一个整数N,表示学生个数;
  以下N行,每行表示一个考生信息:考号(9个数字)、姓名(不超过20个英文字母)、语文成绩、数学成绩、外语成绩、物理成绩、化学成绩。每条信息之间用一个空格分开,每科成绩是一个不大于150的正整数。
  接下来一个正整数M,表示有M个学生要查询成绩;
  接下来的M行,每行一个考号(10个数字),表示该考号的考生要查询自己的信息。

【输出格式】

  前N行输出任务2执行的结果,每行一条学生信息一次是:考号、姓名、语文、数学、外语、物理、化学、总分数据之间有一个空格;
  空一行;
  接下来的M行,对应M个查询,每行包含总分、、语文成绩、数学成绩、外语成绩、物理成绩、化学成绩和名次,数据之间有一个空格。如果没有找到该考生,则输出“Can’t found!”。

【输入样例】

5
000000001 Hongchaogang 102 135 140 100 10
000000003 zhuhaijun 125 145 132 89 95
100000002 HeMuYang 130 148 145 100 99
201000210 MaJing 125 145 134 87 83
002190001 Zhoufaming 100 5 150 100 100
2
100000002
201000213

【输出样例】

1 100000002 HeMuYang 130 148 145 100 99 622
2 000000003 zhuhaijun 125 145 132 89 95 586
3 201000210 MaJing 125 145 134 87 83 574
4 000000001 Hongchaogang 102 135 140 100 10 487
5 002190001 Zhoufaming 100 5 150 100 100 455

1 100000002 HeMuYang 130 148 145 100 99 622
Can’t found!

【数据范围】

N,M<=50000

【来源】

Mr_He原创

体力活23333

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cctype>
using namespace std;

struct stu
{
    char no[10],name[25];
    int C,M,E,P,Ch,all,rank;
}a[50005],t; 

bool cmp1(stu m,stu n)
{
    if(m.all==n.all&&m.C!=n.C&&m.M!=n.M) return m.C>n.C;
    if(m.all==n.all&&m.C!=n.C&&m.M==n.M) return m.C>n.C;
    else if(m.all==n.all&&m.C==n.C&&m.M!=n.M) return m.M>n.M;
    else if(m.all==n.all&&m.C==n.C&&m.M==n.M)
    {
        if(strcmp(m.no,n.no)<0) return 1;
        return 0;
    }
    return m.all>n.all;
}
bool cmp2(stu m,stu n)
{
    return strcmp(m.no,n.no)<0;
}

typedef long long LL;
LL ans=0;
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int n,m;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%s%s%d%d%d%d%d",a[i].no,a[i].name,&a[i].C,&a[i].M,&a[i].E,&a[i].P,&a[i].Ch);
        a[i].all=a[i].C+a[i].M+a[i].E+a[i].P+a[i].Ch;
    }               //输入数据,计算总分

    sort(a+1,a+n+1,cmp1);
    for(int i=1;i<=n;i++)
       a[i].rank=i;

    for(int i=1;i<=n;i++)
       printf("%d %s %s %d %d %d %d %d %d\n",a[i].rank,a[i].no,a[i].name,a[i].C,a[i].M,a[i].E,a[i].P,a[i].Ch,a[i].all);
    printf("\n");
    sort(a+1,a+1+n,cmp2); 
    scanf("%d",&m);
    while(m--)
    {
        scanf("%s",t.no);
        int p=lower_bound(a+1,a+1+n,t,cmp2)-a;
        if(strcmp(a[p].no,t.no)==0)
            printf("%d %s %s %d %d %d %d %d %d\n",a[p].rank,a[p].no,a[p].name,a[p].C,a[p].M,a[p].E,a[p].P,a[p].Ch,a[p].all);
        else printf("Can't found!\n");
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值