考察:多重排列规则
learn && wrong:
1、非递减--,如何strcmp+不等式表示,非递减果然是递增一个变形,
从小到大,用小于号,因为a < b,也就是左小右大;
从大到小,用大于号,因为a > b,也就是右大左小
2、为什么字符比较需要单独拿出来,sort函数的机制是什么
3、优化:以及输出是可以只有一个的,分别三个排序
题目要求:
C = 1,按ID递增排列
C = 2,按name非递减排列
C = 3,按grade非递减排列
注意:如果有相同的名字或分数,则按ID递增排列
编程思想:
1、编写三个cmp,按不同要求来,
得出序号也集成在一个if中
2、根据输入的C来判断走哪一个
*/
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
struct student {
char id[7];
char name[10]; //名字
int grade; //分数
}stu[100005];
bool cmp1(student a, student b) {
return strcmp(a.id, b.id) < 0; //按iD递增排列
}
bool cmp2(student a, student b) {
int s = strcmp(a.name, b.name);
if (s != 0) return s < 0;
else return strcmp(a.id, b.id) < 0;
}
/*、
if (a.name != b.name) return strcmp(a.name, b.name) < 0; // 按名字非递减排列
else return strcmp(a.id, b.id) < 0;
//名字相同,按id递增排列 //(!!!)大于号错了,非递减,非递增是什么,以及strcmp + 大于号应该是递减的,如果理解大于号,小于号呢,前面大于后面,是大于号,前面小于后面,是小于号->所以,递增,是小于号
}//(!!!)一个样例错了
*/
bool cmp3(student a, student b) {
if (a.grade != b.grade) return a.grade < b.grade; //按成绩非递减排列,即递增
else return strcmp(a.id, b.id) < 0; //名字相同,按id递增排列
}
int main()
{
int n, c; //n是输入的人数,c是按什么要求排列
cin >> n >> c;
for (int i = 0;i < n;i++) {
cin >> stu[i].id >> stu[i].name >> stu[i].grade;
}
if(c == 1) {
sort(stu, stu + n, cmp1);
int r = 1;
for (int i = 0;i < n;++i) {
cout << stu[i].id <<" "<< stu[i].name <<" "<< stu[i].grade << endl;
}
}
else if (c == 2) {
sort(stu, stu + n,cmp2);
for (int i = 0;i < n;++i) {
cout << stu[i].id << " " << stu[i].name << " " << stu[i].grade << endl;
}
}
else {
sort(stu, stu + n, cmp3);
for (int i = 0;i < n;++i) {
cout << stu[i].id << " " << stu[i].name << " " << stu[i].grade << endl;
}
}
//(!!!)以及输出是可以只有一个的,分别三个排序
return 0;
}