PTA: 确定班级排名

某学年的班级考评中,班名为cn1​的班级获评先进班集体,班名为cn2​的班级获评优秀学风班。经了解,该学年学院所有班级中,按班级考评的总分sc1​排名选前3个班级获评先进班集体,按学风得分sc2​排名选排名前6个班级获评优秀学风班,且每个班最多只能获评一个荣誉。同时担任这两个班的班主任的某老师很自豪,他拿到学院n个班级该学年的班级考评分,请你帮他确定这两个班的总分排名和学风得分排名。

注意:若两个班的sc1​相同则总分排名也相同,否则排名为排序后的序号;若两个班的sc2​相同则学风得分排名也相同,否则排名为排序后的序号。

输入格式:

先输入1个正整数n(n≤100)和两个字符串cn1​、cn2​,分别表示班级总数、两个班的班名。然后输入n行,每行包括1个不含空格的班名字符串cn和2个正实数sc1​、sc2​,表示该班该学年的班级考评总分和学风得分。各个班名字符串仅由英文字母和数字字符构成,且长度都不超过10。

输出格式:

按班名字典序分2行分别输出cn1​、cn2​这两个班的排名信息,分别是班名、总分排名、学风得分排名。每行的每两个数据之间留一个空格。

输入样例:

6 wg201 jk203
jd201 67.6 44.4
jz201 58.4 40.6
jk201 62.4 47.8
jk202 45.5 45
jk203 51 48.2
wg201 63.4 50.2

输出样例:

jk203 5 2
wg201 2 1

解题思路:

先对sc1成绩进行排序,然后将两个班级对应的位次分别存储到其对应的结构体数组的ps1中;

同样地,对sc2成绩进行排序,然后将两个班级对应的位次分别存储到其对应的结构体数组的ps2中;

而后再对其名字进行排序,方便后面进行遍历输出的时候是按照字典顺序的;

最后根据题意输出即可.

#include<stdio.h>
#include<string.h>
struct pm
{
    char name[10];
    double sc1, sc2;
    int ps1, ps2;
};
int main()
{
    int n, i, j;
    char b1[10];
    char b2[10];
    scanf("%d", &n);
    scanf("%s %s", b1, b2);
    struct pm ss[100];
    for(i = 0; i < n; i++)
    {
        scanf("%s%lf%lf", ss[i].name, &ss[i].sc1, &ss[i].sc2);
    }
    //对sc1进行排序
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < n; j++)
        {
            if(ss[j].sc1 < ss[j+1].sc1)
            {
                struct pm t = ss[j];
                ss[j] = ss[j+1];
                ss[j+1] = t;
            }
        }
    }
    for(i = 0; i < n; i++)//寻找班级的sc1成绩的排名
    {
        if(strcmp(ss[i].name, b1) == 0)
        {
            ss[i].ps1 = i+1;
        }
        if(strcmp(ss[i].name, b2) == 0)
        {
            ss[i].ps1 = i+1;
        }
    }
    //对sc2进行排序
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < n-i-1; j++)
        {
            if(ss[j].sc2 < ss[j+1].sc2)
            {
                struct pm t = ss[j];
                ss[j] = ss[j+1];
                ss[j+1] = t;
            }
        }
    }
    for(i = 0; i < n; i++)//寻找班级的sc2成绩的排名
    {
        if(strcmp(ss[i].name, b1) == 0)
        {
            ss[i].ps2 = i+1;
        }
        if(strcmp(ss[i].name, b2) == 0)
        {
            ss[i].ps2 = i+1;
        }
    }
    //按照名字对其进行排序
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < n-1-i; j++)
        {
            if(strcmp(ss[j].name , ss[j+1].name)> 0 )//上一版的代码漏写了if,现已修正
            {
                struct pm t = ss[j];
                ss[j] = ss[j+1];
                ss[j+1] = t;
            }
        }
    }
    for(i = 0; i < n ;i++)
    {
        if(strcmp(b1, ss[i].name) == 0 || strcmp(b2, ss[i].name) == 0)
        {
            printf("%s %d %d\n", ss[i].name, ss[i].ps1, ss[i].ps2);
        }
    }
    return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值