C语言 qsort的用法 模拟EXCEL排序

C语言 qsort的用法 模拟EXCEL排序

题目

Excel可以对一组记录按任意指定列排序。现请编写程序实现类似的功能。

输入

输入的第一行包含两个正整数N(<= 10^5)和C,其中N是记录的条数,C是指定排序的列号。之后有N行,每行包含一条学生记录。每条学生记录由学号(6位数字,保证没有重复的学号)、姓名(不超过8位且不包含空格的字符串)、成绩(【0,100】内的整数)组成,相邻属性用1个空格隔开。

输出

在N行中输出按要求排序后的结果,即:当C=1时,按学号递增排序;当C=2时,按姓名的非递减字典序排序;当C=3时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。

样例

C语言 qsort的用法 模拟EXCEL排序_第1张图片

题解

本题主要工作就是编写qsort函数的自定义cmp函数,实现结构体多级关键字排序。

代码

#include 
#include 
#include 

typedef struct record{
    char id[6];
    int score;
    char name[8];
}records;

int cmp_id(const void *a, const void *b){ 
//以学号(字符串)为关键字,递增排序
    return strcmp((*(records*)a).id, (*(records*)b).id);
}

int cmp_name(const void *a, const void *b){
//以姓名(字符串)为关键字,非递减字典序排序
//若姓名相同,按学号(字符串)递增排序
    records *x = (records*)a;
    records *y = (records*)b;
    if (strcmp(x->name, y->name))
        return strcmp(x->name, y->name);
    else
        return strcmp(x->id, y->id);
}

int cmp_score(const void *a, const void *b){
//以成绩为关键字,非递减排序
//若成绩相同,按学号(字符串)递增排序
    records *x = (records*)a;
    records *y = (records*)b;
    if (x->score != y->score)
        return x->score - y->score;
    else
        return strcmp(x->id, y->id);
}

int main(){
    int n,c;
    records student[100005];
    scanf("%d %d", &n, &c);
    for (int i = 0; i < n; i++){
        scanf("%s %s %d", student[i].id, student[i].name, &student[i].score);
    }
    switch (c) {
        case 1:
            qsort(student, n, sizeof(student[0]), cmp_id);
            break;
        case 2:
            qsort(student, n, sizeof(student[0]), cmp_name);
            break;
        case 3:
            qsort(student, n, sizeof(student[0]), cmp_score);
            break;
    }
    for (int i = 0; i < n; i++){
        printf("%s %s %d\n", student[i].id, student[i].name, student[i].score);
    }
    return 0;
}

你可能感兴趣的:(ACM)