Excel可以对一组纪录按任意指定列排序。现请编写程序实现类似功能。
输入格式:
输入的第一行包含两个正整数N(≤10
5
) 和C,其中N是纪录的条数,C是指定排序的列号。之后有 N行,每行包含一条学生纪录。每条学生纪录由学号(6位数字,保证没有重复的学号)、姓名(不超过8位且不包含空格的字符串)、成绩([0, 100]内的整数)组成,相邻属性用1个空格隔开。
输出格式:
在N行中输出按要求排序后的结果,即:当C=1时,按学号递增排序;当C=2时,按姓名的非递减字典序排序;当C=3时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。
输入样例:
3 1
000007 James 85
000010 Amy 90
000001 Zoe 60
输出样例:
000001 Zoe 60
000007 James 85
000010 Amy 90
strcmp()
The strcmp() compares two strings character by character.
If the first character of two strings is equal, the next character of two strings are compared. This continues until the corresponding characters of two strings are different or a null character ‘\0’ is reached.
It is defined in the string.h header file.
Return Value from strcmp()
Return Value Remarks
0 if both strings are identical (equal)
negative if the ASCII value of the first unmatched character is less than second.
positive integer if the ASCII value of the first unmatched character is greater than second.
AC代码:
//自定义sort函数
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAX 100005
using namespace std;
struct node{
int x;
char name[15];
int y;
}p[MAX];
int n,c;
bool cmp(const node& x1,node& x2){ //当C=1时,按学号递增排序
return x1.x<x2.x;
}
bool cmp1(const node& x3,const node& x4){ //当C=2时,按姓名的非递减字典序排序,当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。
if(strcmp(x3.name,x4.name)==0){return x3.x<x4.x;}
return strcmp(x3.name,x4.name)<0;
}
bool cmp2(const node& x5, const node& x6){ //当C=3时,按成绩的非递减排序
if(x5.y==x6.y){return x5.x<x6.x;}
return x5.y<x6.y;
}
int main(){
cin>>n>>c;
int i=0;
while(i<n){
scanf("%d %s %d",&p[i].x,p[i].name,&p[i].y);
i++;
}
if(c==1){sort(p,p+n,cmp);}
if(c==2){sort(p,p+n,cmp1);}
if(c==3){sort(p,p+n,cmp2);}
for(int i=0;i<n;i++){
printf("%06d %s %d\n",p[i].x,p[i].name,p[i].y);
}
return 0;
}