鱼C论坛

 找回密码
 立即注册
查看: 424|回复: 1

C语言

[复制链接]
发表于 2023-12-15 00:48:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

例如:
A. 所有棋手按等级分进行降序排序
B. 职业棋手按段位进行降序排序
C. 退出当前功能
请选择(A-C): B
排序结果:
棋手编号 棋手姓名 棋手身份 棋手段位 等级分
P001 连笑 职业 九段 8900
P002 柯洁 职业 九段 9422
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-15 00:48:55 | 显示全部楼层
首先,我们需要定义一个结构体来表示棋手的信息:
  1. #include <stdio.h>
  2. // 定义棋手结构体
  3. typedef struct {
  4.     char id[5];      // 棋手编号
  5.     char name[20];   // 棋手姓名
  6.     char type[10];   // 棋手身份(职业或业余)
  7.     char rank[10];   // 棋手段位
  8.     int score;       // 等级分
  9. } Player;
复制代码

然后,我们需要实现两个比较函数,用于排序。一个用于按等级分进行升序排序,一个用于按段位进行降序排序。
  1. // 按等级分进行升序排序的比较函数
  2. int compareByScore(const void *a, const void *b) {
  3.     Player *playerA = (Player *)a;
  4.     Player *playerB = (Player *)b;
  5.    
  6.     return playerA->score - playerB->score;
  7. }
  8. // 按段位进行降序排序的比较函数
  9. int compareByRank(const void *a, const void *b) {
  10.     Player *playerA = (Player *)a;
  11.     Player *playerB = (Player *)b;
  12.    
  13.     // 先按段位进行排序
  14.     int rankCompare = strcmp(playerB->rank, playerA->rank);
  15.     if (rankCompare != 0) {
  16.         return rankCompare;
  17.     }
  18.    
  19.     // 如果段位相同,则按棋手编号的后三位数字进行排序
  20.     int idA = atoi(playerA->id + 1);   // 提取编号后三位数字
  21.     int idB = atoi(playerB->id + 1);
  22.    
  23.     return idA - idB;
  24. }
复制代码

接下来,我们需要读取用户输入的棋手信息,并进行排序。
  1. int main() {
  2.     Player players[100];   // 假设最多有100个棋手
  3.     int count = 0;         // 棋手数量
  4.    
  5.     // 读取用户输入的棋手信息
  6.     printf("请输入棋手信息(输入0结束输入):\n");
  7.     while (1) {
  8.         printf("棋手编号:");
  9.         scanf("%s", players[count].id);
  10.         if (players[count].id[0] == '0') {
  11.             break;
  12.         }
  13.         
  14.         printf("棋手姓名:");
  15.         scanf("%s", players[count].name);
  16.         printf("棋手身份:");
  17.         scanf("%s", players[count].type);
  18.         printf("棋手段位:");
  19.         scanf("%s", players[count].rank);
  20.         printf("等级分:");
  21.         scanf("%d", &players[count].score);
  22.         
  23.         count++;
  24.     }
  25.    
  26.     // 提示用户选择排序方式
  27.     printf("请选择排序方式(A-按等级分升序排序,B-按段位降序排序,C-退出):");
  28.     char choice;
  29.     scanf(" %c", &choice);
  30.    
  31.     // 根据用户选择进行排序并输出结果
  32.     switch (choice) {
  33.         case 'A':
  34.         case 'a':
  35.             qsort(players, count, sizeof(Player), compareByScore);
  36.             break;
  37.         case 'B':
  38.         case 'b':
  39.             qsort(players, count, sizeof(Player), compareByRank);
  40.             break;
  41.         default:
  42.             return 0;
  43.     }
  44.    
  45.     // 输出排序后的结果
  46.     printf("排序结果:\n");
  47.     printf("棋手编号  棋手姓名  棋手身份  棋手段位  等级分\n");
  48.     for (int i = 0; i < count; i++) {
  49.         printf("%s  %s  %s  %s  %d\n", players[i].id, players[i].name, players[i].type, players[i].rank, players[i].score);
  50.     }
  51.    
  52.     return 0;
  53. }
复制代码

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 13:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表