Excel可以对一组纪录按任意指定列排序。现请编写程序实现类似功能。
输入格式:
输入的第一行包含两个正整数 n (≤105) 和 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
代码如下:
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
struct Student{
string number;
string name;
int grade;
};
bool compareByNumber(const Student& a,const Student& b)
{
return a.number<b.number;
}
bool compareByName(const Student& a,const Student& b)
{
if(a.name==b.name)
{
return a.number<b.number;
}
return a.name<b.name;
}
bool compareByGrade(const Student& a,const Student& b)
{
if(a.grade==b.grade)
{
return a.number<b.number;
}
return a.grade<b.grade;
}
void sortStudents(vector<Student>& students,int c)
{
if(c==1)
{
sort(students.begin(),students.end(),compareByNumber);
}else if(c==2){
sort(students.begin(),students.end(),compareByName);
}else if(c==3){
sort(students.begin(),students.end(),compareByGrade);
}
}
int main()
{
int n,c;
cin>>n>>c;
vector<Student> students(n);
for(int i=0;i<n;i++)
{
cin>>students[i].number>>students[i].name>>students[i].grade;
}
sortStudents(students,c);
for(Student& student:students)
{
cout<<student.number<<" "<<student.name<<" "<<student.grade<<endl;
}
return 0;
}
学习心得 :
1、StudentA->name - StudentB->name 和 StudentA->number - StudentB->number 这种操作是错误的。name 和 number 是 std::string 类型,不能直接进行减法运算。应该使用字符串的比较函数,如 compare 或者直接使用比较运算符(<、> 等)。