PTA:模拟EXCEL排序

发布于:2025-04-18 ⋅ 阅读:(21) ⋅ 点赞:(0)

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 或者直接使用比较运算符(<、> 等)。


网站公告

今日签到

点亮在社区的每一天
去签到