鱼C论坛

 找回密码
 立即注册
查看: 694|回复: 3

求助

[复制链接]
发表于 2023-12-22 19:03:43 | 显示全部楼层 |阅读模式

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

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

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.                
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-22 19:04:11 | 显示全部楼层
这段代码排序函数的实现基本正确,但是在调用排序函数时,传递进去的参数有问题。

首先,在排序函数`SortPlayer`中,你定义了一个数组`Player players`作为排序的目标数组。然而,由于C语言中不支持对数组类型进行赋值操作,所以这个数组并没有被正确初始化和赋值。

其次,在调用排序函数`qsort`时,应该传入指向数组的指针,而不是数组本身。所以你需要将`players`改为指针类型`Player*`,并且在调用`qsort`函数时传入`&players[0]`,即数组的首地址。

最后,还需要注意在输出排序结果时,使用循环来逐个输出每个玩家的信息。

下面是修正后的代码:
  1. void SortPlayer(Player* players, int num_players)
  2. {
  3.     int i = 0;
  4.     char sort_choice;
  5.     printf("A. 所有棋手按等级分进行降序排序\n");
  6.     printf("B. 职业棋手按段位进行降序排序\n");
  7.     printf("C. 退出当前功能\n");
  8.     printf("请选择(A-C):");
  9.     scanf("%c", &sort_choice);
  10.     switch(sort_choice)
  11.     {
  12.         case 'A':
  13.             qsort(players, num_players, sizeof(Player), SortByScore);
  14.             break;
  15.         case 'B':
  16.             qsort(players, num_players, sizeof(Player), SortByRank);
  17.             break;
  18.         case 'C':
  19.             return;
  20.     }
  21.     getchar();
  22.     printf("排序结果:\n");
  23.     printf("%20s\t%20s\t%10s\t%12s\t%20s\n", "编号","姓名","身份","段位","等级分\n");
  24.     for(i = 0; i < num_players; i++)
  25.     {
  26.         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);
  27.     }
  28. }
复制代码

然后在调用`SortPlayer`函数时,传入正确的参数,例如:
  1. Player players[100];
  2. int num_players = 10;
  3. // ... 初始化 players 数组的数据 ...
  4. SortPlayer(players, num_players);
复制代码

希望能对你有所帮助!

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

使用道具 举报

发表于 2023-12-22 19:15:39 | 显示全部楼层
[ 本帖最后由 sfqxx 于 2023-12-22 20:07 编辑 ]\n\n[b]这段代码不能实现排序,可能的问题出在对比函数SortByScore和SortByRank的返回值上。在这两个函数中,我们是通过返回一个整数值来决定两个元素的排序位置。对于字符串,使用strcmp可以返回三种情况:小于0,等于0,大于0,分别代表小于,等于,大于。但对于数值类型,直接相减的结果可能不太恰当。

在SortByScore函数中,我们返回的是playerA -> score - playerB -> score,score是整型,如果score的值相差很大,可能会导致溢出,甚至返回值可能接近0,但两个score实际上差距很大。这样的话,qsort函数可能无法正确排序。

在SortByRank函数中,我们对段位进行排序时比较的是字符串,这可能会出现不符合预期的结果。比如"10段"会比"2段"小。

解决方法是修改比较函数SortByScore,对于数值类型的比较,应该返回-1,0,1代表小于,等于,大于。

在SortByRank函数中,段位应转化为数值再进行比较。或者设计合适的规则以让字符串的比较符合预期,比如01段,02段等。

另外,最后的打印结果printf函数中,players[i].score应该是数值类型,直接打印可能有误,通常应该用%d进行打印。

所以整体来说,这段代码出现了排序不准确,输出不正确的问题。

[color=Red]求最佳答案[/color][/b]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-22 19:44:11 | 显示全部楼层
sfqxx 发表于 2023-12-22 19:15
这段代码不能实现排序,可能的问题出在对比函数SortByScore和SortByRank的返回值上。在这两个函数中,我们 ...

AI?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 11:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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