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

答案:

#include <bits/stdc++.h>

using namespace std;
//const int N=1e5+10;//这里必须是const类型的;

struct Student
{
    int number;
    char name[9];
    int score;
}S[100010];

bool cmp1(Student& a,Student& b)
{
    return a.number<b.number;
}

bool cmp2(Student& a,Student& b)
{
    return strcmp(a.name,b.name)?strcmp(a.name,b.name)<0:cmp1(a,b);
}

bool cmp3(Student& a,Student& b)
{
    return a.score!=b.score?a.score<b.score:cmp1(a,b);
}
int main()
{
    unsigned long long n;
    int c;
    scanf("%llu%d",&n,&c);
    for(int i=0;i<n;i++)
    {
        scanf("%d%s%d",&S[i].number,S[i].name,&S[i].score);//中间不需要空格,因为%s读不进空格,同时%s那里不需要&号
    }
    if(c==1)
    {
        sort(S,S+n,cmp1);
    }
    else if(c==2)
    {
        sort(S,S+n,cmp2);
    }
    else if(c==3)
    {
        sort(S,S+n,cmp3);
    }
    for(int i=0;i<n;i++)printf("%06d %s %d\n",S[i].number,S[i].name,S[i].score);
    return 0;

}

反思:
1、struct和typedef struct在C语言和c++中使用


C语言中定义结构体为

(1)先定义结构体类型,再定义结构体变量

struct student
{
    char no[20];       //学号
    char name[20];    //姓名
    char sex[5];    //性别
    int age;          //年龄
};
struct student stu1,stu2;

此时stu1,stu2=student结构体变量

stu1.no等

(2)定义结构体类型的同时定义结构体变量

struct student
{
    char no[20];       //学号
    char name[20];    //姓名
    char sex[5];    //性别
    int age;          //年龄
}stu1,stu2;

此时还可以继续定义student结构体变量,如:

struct student stu3;

stu1.no等

(1)和(2)中的方法是直接定义了一个变量,可以直接使用比如stu1.no,stu1.name等


(3)定义两个名字

typedef struct student
{
    char no[20];       //学号
    char name[20];    //姓名
    char sex[5];    //性别
    int age;          //年龄
}S;

这样,结构体有两个名字,一个是struct student,还有一个是S,不能直接 S . no ,S . name等,而是需要通过

S student1;
或者
struct student student1;

来定义一个结构体变量;


注意:在定义结构体数组的时候,要标明数组的长度比如S[100],而不能是S[N];


C++中的结构体

(1)

struct Student    
{
    int a;    
};

于是就定义了结构体类型Student,声明变量时直接Student stu2;
这里与C语言声明变量的方式不同

(2)

struct   Student    
{
    int   a; 
}stu1; //stu1是一个变量

-------------------------------------

typedef struct Student2    
{
    int   a;   
}stu2; //stu2是一个结构体类型=struct Student

这里与C语言相同;

使用时可以直接访问stu1.a
但是stu2则必须先   stu2 s2;
然后               s2.a=10;

2、strcmp函数
https://blog.csdn.net/weixin_40093087/article/details/78071718

10-07 17:49