某学年的班级考评中,班名为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;
}