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<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAXID 7
#define MAXNAME 9
#define MAXN 100000

struct Student{
    char id[MAXID];
    char name[MAXNAME];
    int grade;
} Record[MAXN];
int ComparId(const void *a, const void *b);//比较学号
int ComparName(const void *a, const void *b);//比较姓名
int ComparGrade(const void *a, const void *b);//比较成绩

int main()
{
    int N, C;
    scanf("%d%d",&N,&C);
    for(int i=0;i<N;i++)//读入数据
        scanf("%s %s %d",Record[i].id, Record[i].name, &Record[i].grade);//注意,id和name为数组,grade为整型变量,grade前要加&
    switch(C){//根据C选择相应列进行排序
        case 1 : qsort(Record, N, sizeof(struct Student), ComparId);//qsort(待排数组名, 参与排序元素个数, 单个元素大小, 排序方法)
                 break;
        case 2 : qsort(Record, N, sizeof(struct Student), ComparName);
                 break;
        case 3 : qsort(Record, N, sizeof(struct Student), ComparGrade);
                 break;
    }
    for(int i=0;i<N;i++)
        printf("%s %s %d\n",Record[i].id, Record[i].name, Record[i].grade);
    return 0;
}

int ComparId(const void *a, const void *b){
    return strcmp(((const struct Student*)a)->id, ((const struct Student*)b)->id);
}

int ComparName(const void *a, const void *b){
    int k = strcmp(((const struct Student*)a)->name, ((const struct Student*)b)->name);
    if(!k)//重名时按学号大小排
        k = strcmp(((const struct Student*)a)->id, ((const struct Student*)b)->id);
    return k;
}

int ComparGrade(const void *a, const void *b){
    int k = (((const struct Student*)a)->grade > ((const struct Student*)b)->grade) ? 1 : 0;//判断a成绩是否大于b
    if(!k){//若不大于
        k = (((const struct Student*)a)->grade < ((const struct Student*)b)->grade) ? -1 : 0;//判断是否小于
        if(!k)//若不大于也不小于则等于,此时按学号排序
            k = strcmp(((const struct Student*)a)->id, ((const struct Student*)b)->id);
    }
    return k;
}
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐