鱼C论坛

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

排序

[复制链接]
发表于 2023-12-21 09:14:35 | 显示全部楼层 |阅读模式

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

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

x
  1. //对信息按要求排序       
  2.         int SortByScore(const void* a, const void* b)
  3.         {
  4.             Player* playerA = (Player*)a;
  5.             Player* playerB = (Player*)b;
  6.                    return playerA -> score - playerB -> score;
  7.         }
  8.                
  9.        
  10.         int SortByRank(const void* a, const void* b)
  11.         {
  12.                 const Player* playerA = (const Player*)a;
  13.                 const Player* playerB = (const Player*)b;
  14.                 if(strcmp(playerA -> identity, "职业") == 0 && strcmp(playerB -> identity, "职业") == 0)
  15.                 {
  16.                         int Comp = strcmp(playerB -> rank, playerA -> rank);
  17.                         if(Comp == 0)
  18.                         {
  19.                                 return strcmp(playerA -> id, playerB -> id);
  20.                         }
  21.                         return Comp;
  22.                 }
  23.                 return strcmp(playerA -> identity, "职业") == 0 ? -1 : 1;
  24.         }
  25.        
  26.        
  27.        
  28. void SortPlayer(Player players[], int num_players)
  29. {
  30.         int i = 0;
  31.         char sort_choice;
  32.         printf("A. 所有棋手按等级分进行降序排序\n");
  33.         printf("B. 职业棋手按段位进行降序排序\n");
  34.         printf("C. 退出当前功能\n");
  35.         printf("请选择(A-C):");
  36.         scanf("%c", &sort_choice);
  37.                 switch(sort_choice)
  38.                 {
  39.                         case 'A':
  40.                                 qsort(players, num_players, sizeof(Player), SortByScore);
  41.                                 break;
  42.                         case 'B':
  43.                                 qsort(players, num_players, sizeof(Player), SortByRank);
  44.                                 break;
  45.                         case 'C':
  46.                                 return;
  47.                 }
  48.                 getchar();
  49.                  printf("排序结果:\n");
  50.                  printf("%20s\t%20s\t%10s\t%12s\t%20s\n", "编号","姓名","身份","段位","等级分\n");
  51.                  for(i = 0; i < num_players; i++)
  52.                  {
  53.                          printf("%20s\t%21s\t%10s\t%12s\t%18s\n", players[i].id, players[i].name, players[i].identity, players[i].rank, players[i].score);
  54.                  }
  55. }       
  56.                
复制代码


修改这段代码,实现排序的功能,要能正常运行出来
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-12-21 09:15:09 | 显示全部楼层
根据您提供的代码,我发现其中存在一些问题。首先,在排序函数`SortPlayer`中,参数`Player players`应该是一个指针类型,而不是直接传递一个数组。另外,在对数组进行排序时,可以使用`qsort`函数,但在比较函数中,需要将`a`和`b`强制转换为`Player*`类型。

另外,还有一点值得注意的是,您在打印结果时使用了`players`数组的第一个元素,并且没有递增指针来访问其他元素。实际上,应该使用循环来遍历整个数组,以便打印出所有的排序结果。

下面是修改后的代码实现:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. // 玩家结构体
  5. typedef struct {
  6.     char id[20];      // 编号
  7.     char name[20];    // 姓名
  8.     char identity[10];// 身份
  9.     char rank[12];    // 段位
  10.     int score;        // 等级分
  11. } Player;
  12. // 按等级分排序比较函数
  13. int SortByScore(const void* a, const void* b)
  14. {
  15.     Player* playerA = (Player*)a;
  16.     Player* playerB = (Player*)b;
  17.     return playerB->score - playerA->score; // 降序排序
  18. }
  19. // 按段位及身份排序比较函数
  20. int SortByRank(const void* a, const void* b)
  21. {
  22.     const Player* playerA = (const Player*)a;
  23.     const Player* playerB = (const Player*)b;
  24.     if (strcmp(playerA->identity, "职业") == 0 && strcmp(playerB->identity, "职业") == 0) {
  25.         int Comp = strcmp(playerB->rank, playerA->rank);
  26.         if (Comp == 0) {
  27.             return strcmp(playerA->id, playerB->id);
  28.         }
  29.         return Comp;
  30.     }
  31.     return strcmp(playerA->identity, "职业") == 0 ? -1 : 1;
  32. }
  33. void SortPlayer(Player* players, int num_players)
  34. {
  35.     int i = 0;
  36.     char sort_choice;
  37.     printf("A. 所有棋手按等级分进行降序排序\n");
  38.     printf("B. 职业棋手按段位进行降序排序\n");
  39.     printf("C. 退出当前功能\n");
  40.     printf("请选择(A-C):");
  41.     getchar(); // 清空缓冲区中的回车符
  42.     scanf("%c", &sort_choice);
  43.    
  44.     switch (sort_choice) {
  45.         case 'A':
  46.             qsort(players, num_players, sizeof(Player), SortByScore);
  47.             break;
  48.         case 'B':
  49.             qsort(players, num_players, sizeof(Player), SortByRank);
  50.             break;
  51.         case 'C':
  52.             return;
  53.     }
  54.    
  55.     printf("排序结果:\n");
  56.     printf("%20s\t%20s\t%10s\t%12s\t%20s\n", "编号", "姓名", "身份", "段位", "等级分");
  57.     for (i = 0; i < num_players; i++) {
  58.         printf("%20s\t%21s\t%10s\t%12s\t%18d\n", players[i].id, players[i].name, players[i].identity, players[i].rank, players[i].score);
  59.     }
  60. }
  61. int main()
  62. {
  63.     Player players[3];
  64.    
  65.     strcpy(players[0].id, "001");
  66.     strcpy(players[0].name, "张三");
  67.     strcpy(players[0].identity, "职业");
  68.     strcpy(players[0].rank, "高段位");
  69.     players[0].score = 3000;
  70.    
  71.     strcpy(players[1].id, "002");
  72.     strcpy(players[1].name, "李四");
  73.     strcpy(players[1].identity, "业余");
  74.     strcpy(players[1].rank, "低段位");
  75.     players[1].score = 1500;
  76.    
  77.     strcpy(players[2].id, "003");
  78.     strcpy(players[2].name, "王五");
  79.     strcpy(players[2].identity, "职业");
  80.     strcpy(players[2].rank, "中段位");
  81.     players[2].score = 2500;
  82.    
  83.     SortPlayer(players, 3);
  84.    
  85.     return 0;
  86. }
复制代码

在以上代码中,我们首先定义了一个包含3个玩家信息的`players`数组,然后将其作为参数传递给`SortPlayer`函数进行排序。排序的结果会按照您选择的方式打印出来。

希望这个修改后的代码能够满足您的需求!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-19 10:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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