考察:排序,cmp + strcmp + sort
learn && wrong:
1、cmp的编写
bool cmp(student a, student b) {
if (a.flag != b.flag) return a.flag < b.flag; //类别小的在前
else if (a.sum != b.sum) return a.sum > b.sum; //类别相同,总分大的在前
else if (a.de != b.de) return a.de > b.de; //总分相同,德分大的在前
else return strcmp(a.id, b.id) < 0; //德分相同,准考证号小的在前
}
2、str的比较,在string.h中,strcmp(str1,str1)
3、
(1).scanf( )函数和gets( )函数都可用于输入字符串,但在功能上有区别。若想从键盘上输入字符串"hi hello",则应该使用gets函数。
(2).gets可以接收空格,回车结束,gets(s)是输入一行;而scanf(%s)遇到空格、回车和Tab键都会认为输入结束,所以它不能接收空格。
4、4类人数最多,所以放到最后,这个技巧不错!
/*
编程思想:
输入准考证 德分 才分
1、输入准考证号以及成绩等,
2、依旧条件,修改标记位,用if_else if_else if,不及格的排序,1类,2类
3、然后根据标记位分类
排名:
第一类:才德尽全:全部高于H,总分排序
第二类:才分不够H,但德分高位H,按总分排序,但是排序第一类考生后
第三类:德才分均低于H,但德分不低于才分的,按总分排序,但是排与第二类后
第四类:其他达到最低线的也按总分排序,但排在最后
当某类考生中有多人总分相同时,按其德分降序排列;若德分也并列,则按准考证号的升序输出。
*/
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
struct student {
char id[12]; //准考证号
int de, cai, sum; //德分,才分及总分
int flag; //考生类别:第一类以及第五类
}stu[100010];
bool cmp(student a, student b) {
if (a.flag != b.flag) return a.flag < b.flag; //类别小的在前
else if (a.sum != b.sum) return a.sum > b.sum; //类别相同,总分大的在前
else if (a.de != b.de) return a.de > b.de; //总分相同,德分大的在前
else return strcmp(a.id, b.id) < 0; //德分相同,准考证号小的在前
}
int main()
{
int n, L, H;
scanf_s("%d%d%d", &n, &L, &H);
int m = n; //m为及格的人数
for (int i = 0;i < n;i++) {
cin >> stu[i].id >> stu[i].de >> stu[i].cai;
stu[i].sum = stu[i].de + stu[i].cai; //计算总分
if (stu[i].de < L || stu[i].cai < L) { //现将不及格者设为第5类
stu[i].flag = 5;
m--; //及格人数减一
}
else if (stu[i].de >= H && stu[i].cai >= H) stu[i].flag = 1;
else if (stu[i].de >= H && stu[i].cai < H) stu[i].flag = 2;
else if (stu[i].de >= stu[i].cai) stu[i].flag = 3;
else stu[i].flag = 4; //第四类情况最多,因此放到最后
}
sort(stu, stu + n, cmp); //排序
printf("%d\n", m);
for (int i = 0;i < m;i++) {
printf("%s %d %d\n", stu[i].id, stu[i].de, stu[i].cai);
}
return 0;
}
网友评论