Excel can sort records according to any column. Now you are supposed to imitate this function.
Each input file contains one test case. For each case, the first line contains two integers N (≤105) and C, where N is the number of records and C is the column that you are supposed to sort the records with. Then N lines follow, each contains a record of a student. A student’s record consists of his or her distinct ID (a 6-digit number), name (a string with no more than 8 characters without space), and grade (an integer between 0 and 100, inclusive).
For each test case, output the sorting result in N lines. That is, if C = 1 then the records must be sorted in increasing order according to ID’s; if C = 2 then the records must be sorted in non-decreasing order according to names; and if C = 3 then the records must be sorted in non-decreasing order according to grades. If there are several students who have the same name or grade, they must be sorted according to their ID’s in increasing order.
Sample Input 1:
3 1
000007 James 85
000010 Amy 90
000001 Zoe 60
Sample Output 1:
000001 Zoe 60
000007 James 85
000010 Amy 90
Sample Input 2:
4 2
000007 James 85
000010 Amy 90
000001 Zoe 60
000002 James 98
Sample Output 2:
000010 Amy 90
000002 James 98
000007 James 85
000001 Zoe 60
Sample Input 3:
4 3
000007 James 85
000010 Amy 90
000001 Zoe 60
000002 James 90
Sample Output 3:
000001 Zoe 60
000007 James 85
000002 James 90
000010 Amy 90
先放AC代码
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
struct Grade{
int id; //id为6位
char name[10];
int score;
}grade[100010];
int n, c;
bool cmp(Grade a,Grade b){
if(c == 1)
return a.id < b.id;
else if(c == 2)
return strcmp(a.name,b.name) != 0 ? strcmp(a.name,b.name) < 0 : a.id < b.id;
else if(c == 3)
return a.score != b.score ? a.score < b.score : a.id < b.id;
}
int main(){
//n为记录个数,c为排序字段
scanf("%d%d",&n,&c);
for (int i = 0; i < n; ++i) {
scanf("%d %s %d",&grade[i].id,grade[i].name,&grade[i].score);
}
sort(grade,grade + n,cmp);
//输出
for (int i = 0; i < n; ++i) {
printf("%06d %s %d\n",grade[i].id,grade[i].name,grade[i].score);
}
}
此处第一遍做时比较函数cmp写为以下形式
return a.name != b.name ? a.name < b.name : a.id < b.id;
题目所给的测试用例始终不能通过。查阅资料得知
C语言中的字符串是不能直接比较大小的,而C++中的string类型的字符串才能进行字符串的比较。具体细节如下。
具体细节:
1、C语言的字符串的实质是一个字符数组中存储的字符序列,如果直接比较大小相当于比较了两个字符串的首地址的大小,毫无意义。
2、C语言的字符串需要通过strcmp函数进行比较大小。
int strcmp(const char *str1, const char *str2)
返回值 = 0 ,两字符串相等
> 0,str1 大于 str2
< 0,str1 小于 str2
3、C++添加的string字符串是一个类,该类对运算符>、<和==进行了重载,能够直接比较两个字符串的大小。(运算符重载技术)
4、建议在C++中尽量使用string字符串,简单,且不容易出错。
参考资料:https://www.cnblogs.com/wx2247516223/p/10022408.html