鱼C论坛

 找回密码
 立即注册
查看: 597|回复: 2

[已解决]排序

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

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

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

x
解释这段代码,并说出用哪些函数实现的,函数的输入和输出是什么
  1.         int SortByScore(const void* a, const void* b)
  2.         {
  3.             Player* playerA = (Player*)a;
  4.             Player* playerB = (Player*)b;
  5.                    return playerA -> score - playerB -> score;
  6.         }
  7.                
  8.        
  9.         int SortByRank(const void* a, const void* b)
  10.         {
  11.                 const Player* playerA = (const Player*)a;
  12.                 const Player* playerB = (const Player*)b;
  13.                 if(strcmp(playerA -> identity, "职业") == 0 && strcmp(playerB -> identity, "职业") == 0)
  14.                 {
  15.                         int Comp = strcmp(playerB -> rank, playerA -> rank);
  16.                         if(Comp == 0)
  17.                         {
  18.                                 return strcmp(playerA -> id, playerB -> id);
  19.                         }
  20.                         return Comp;
  21.                 }
  22.                 return strcmp(playerA -> identity, "职业") == 0 ? -1 : 1;
  23.         }
  24.        
  25.        
  26.        
  27. void SortPlayer(Player players[], int num_players)
  28. {
  29.         int i = 0;
  30.         char sort_choice;
  31.         printf("A. 所有棋手按等级分进行降序排序\n");
  32.         printf("B. 职业棋手按段位进行降序排序\n");
  33.         printf("C. 退出当前功能\n");
  34.         printf("请选择(A-C):");
  35.         getchar();
  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.                
复制代码
最佳答案
2023-12-22 19:08:05
这段代码定义了三个函数,分别是:SortByScore,SortByRank,以及SortPlayer。

SortByScore函数通过比较两个Player类型对象的score属性值来给对象进行排序。它接收的输入是两个void指针,指针中应包含指向Player对象的地址。函数返回的是两个Player对象的score属性值的差。如果第一个Player的score大于第二个Player的score,则返回正数;如果等于,则返回零;如果小于,则返回负数。

SortByRank函数通过比较两个Player类型对象的rank属性值来给对象进行排序。它同样接收的输入是两个void指针,指针中应包含指向Player对象的地址。函数中首先判断两个Player对象的identity属性值是否都是"职业", 如果都是,则先潮比两者的rank属性值。如果rank相同,则比较他们id的字符串顺序;否则返回rank比较的结果。如果identity值并非都是"职业",则直接通过比较identity值来判断排序。

SortPlayer函数对输入的Player对象数组进行排序。首先输入一个表示排序选项的字符,然后根据输入的字符调用相应的比较函数,使用qsort函数对Player对象数组进行排序。之后输出排序后的结果。

qsort函数是C标准库中的一个排序函数,需要传入数组指针,数组中元素的数量,每个元素的大小,以及一个用于比较两个元素的函数指针。在这个代码中,qsort函数使用了SortByScore或SortByRank函数进行Player对象的排序。

求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-22 18:36:39 | 显示全部楼层
这段代码是用来对棋手进行排序的。它首先定义了两个排序函数SortByScore和SortByRank,然后定义了一个名为SortPlayer的函数,用于根据用户选择的不同排序方式对棋手进行排序。

函数SortByScore的输入参数为两个指针a和b,它们分别指向参与排序的两个棋手对象。函数将这两个指针转换为Player类型的指针,并通过比较棋手的分数来判断它们的相对次序,返回值为负数表示a在b之前,返回值为正数表示a在b之后,返回值为0表示a和b相等。

函数SortByRank的输入参数和SortByScore相同。函数首先将指针a和b转换为const Player类型的指针,因为它们不会被修改。接着,函数判断两个棋手的身份是否都是“职业”,如果是的话,就比较它们的段位。如果段位相同,则通过比较id来判断它们的相对次序。如果身份不都是“职业”,则返回-1代表a在b之前,否则返回1代表a在b之后。

函数SortPlayer的输入参数包括所有的棋手对象和棋手总数。它首先显示一个菜单供用户选择排序方式。根据用户的选择,调用qsort函数来对棋手进行排序。qsort函数的参数包括要排序的对象、对象的数量、对象的大小以及一个指向排序函数的指针。根据菜单的选择,调用的排序函数可以是SortByScore或SortByRank。

最后,函数输出排序结果,并逐个打印每个棋手的信息,包括编号、姓名、身份、段位和等级分。

代码中使用的函数有:qsort、printf、getchar、scanf和strcmp。其中,qsort函数用于排序,printf函数用于输出菜单和排序结果,getchar函数用于去除之前输入的回车符,scanf函数用于接收用户的选择,strcmp函数用于字符串的比较。

整个程序的功能是让用户选择按照等级分或段位对棋手进行排序,并输出排序结果。

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

使用道具 举报

发表于 2023-12-22 19:08:05 | 显示全部楼层    本楼为最佳答案   
这段代码定义了三个函数,分别是:SortByScore,SortByRank,以及SortPlayer。

SortByScore函数通过比较两个Player类型对象的score属性值来给对象进行排序。它接收的输入是两个void指针,指针中应包含指向Player对象的地址。函数返回的是两个Player对象的score属性值的差。如果第一个Player的score大于第二个Player的score,则返回正数;如果等于,则返回零;如果小于,则返回负数。

SortByRank函数通过比较两个Player类型对象的rank属性值来给对象进行排序。它同样接收的输入是两个void指针,指针中应包含指向Player对象的地址。函数中首先判断两个Player对象的identity属性值是否都是"职业", 如果都是,则先潮比两者的rank属性值。如果rank相同,则比较他们id的字符串顺序;否则返回rank比较的结果。如果identity值并非都是"职业",则直接通过比较identity值来判断排序。

SortPlayer函数对输入的Player对象数组进行排序。首先输入一个表示排序选项的字符,然后根据输入的字符调用相应的比较函数,使用qsort函数对Player对象数组进行排序。之后输出排序后的结果。

qsort函数是C标准库中的一个排序函数,需要传入数组指针,数组中元素的数量,每个元素的大小,以及一个用于比较两个元素的函数指针。在这个代码中,qsort函数使用了SortByScore或SortByRank函数进行Player对象的排序。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 15:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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