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时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。

样例

在这里插入图片描述

题解

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

代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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;
}
  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值