小羊爱吃小草 发表于 2023-12-15 00:48:11

C语言

用C语言对棋手信息进行排序:
提示用户可按照两种方式进行排序:对所有棋手按等级分进行升序排序、对职业棋
手按段位进行降序排序(等级分或段位相同的棋手按照棋手编号后三位数字大小升序
排列)。根据输入信息进行排序,输出排序后的棋手信息。

例如:
A. 所有棋手按等级分进行降序排序
B. 职业棋手按段位进行降序排序
C. 退出当前功能
请选择(A-C): B
排序结果:
棋手编号 棋手姓名 棋手身份 棋手段位 等级分
P001 连笑 职业 九段 8900
P002 柯洁 职业 九段 9422

FishC 发表于 2023-12-15 00:48:55

首先,我们需要定义一个结构体来表示棋手的信息:

#include <stdio.h>

// 定义棋手结构体
typedef struct {
    char id;      // 棋手编号
    char name;   // 棋手姓名
    char type;   // 棋手身份(职业或业余)
    char rank;   // 棋手段位
    int score;       // 等级分
} Player;

然后,我们需要实现两个比较函数,用于排序。一个用于按等级分进行升序排序,一个用于按段位进行降序排序。

// 按等级分进行升序排序的比较函数
int compareByScore(const void *a, const void *b) {
    Player *playerA = (Player *)a;
    Player *playerB = (Player *)b;
   
    return playerA->score - playerB->score;
}

// 按段位进行降序排序的比较函数
int compareByRank(const void *a, const void *b) {
    Player *playerA = (Player *)a;
    Player *playerB = (Player *)b;
   
    // 先按段位进行排序
    int rankCompare = strcmp(playerB->rank, playerA->rank);
    if (rankCompare != 0) {
      return rankCompare;
    }
   
    // 如果段位相同,则按棋手编号的后三位数字进行排序
    int idA = atoi(playerA->id + 1);   // 提取编号后三位数字
    int idB = atoi(playerB->id + 1);
   
    return idA - idB;
}

接下来,我们需要读取用户输入的棋手信息,并进行排序。

int main() {
    Player players;   // 假设最多有100个棋手
    int count = 0;         // 棋手数量
   
    // 读取用户输入的棋手信息
    printf("请输入棋手信息(输入0结束输入):\n");
    while (1) {
      printf("棋手编号:");
      scanf("%s", players.id);
      if (players.id == '0') {
            break;
      }
      
      printf("棋手姓名:");
      scanf("%s", players.name);
      printf("棋手身份:");
      scanf("%s", players.type);
      printf("棋手段位:");
      scanf("%s", players.rank);
      printf("等级分:");
      scanf("%d", &players.score);
      
      count++;
    }
   
    // 提示用户选择排序方式
    printf("请选择排序方式(A-按等级分升序排序,B-按段位降序排序,C-退出):");
    char choice;
    scanf(" %c", &choice);
   
    // 根据用户选择进行排序并输出结果
    switch (choice) {
      case 'A':
      case 'a':
            qsort(players, count, sizeof(Player), compareByScore);
            break;
      case 'B':
      case 'b':
            qsort(players, count, sizeof(Player), compareByRank);
            break;
      default:
            return 0;
    }
   
    // 输出排序后的结果
    printf("排序结果:\n");
    printf("棋手编号棋手姓名棋手身份棋手段位等级分\n");
    for (int i = 0; i < count; i++) {
      printf("%s%s%s%s%d\n", players.id, players.name, players.type, players.rank, players.score);
    }
   
    return 0;
}

这样,我们就完成了对棋手信息进行排序的程序。用户可以选择按等级分进行升序排序,或者按职业棋手的段位进行降序排序。最后,程序会输出排序后的棋手信息。注意,我们使用了`qsort`函数进行数组的快速排序,需要包含`stdlib.h`头文件。另外,代码中有一些简化处理,例如没有对用户的输入进行错误检查,请根据实际情况进行修改和完善。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: C语言