鱼C论坛

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

[已解决]围棋棋手系统

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

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

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

x

请分别简要解释这四段代码,并说明用哪些函数实现的,函数的输入和输出是什么
       
//查找棋手信息
  1. void SearchPlayer(Player players[], int num_players)
  2. {
  3.         char reply, keyword[20];
  4.         int i = 0, back = 0;
  5.         printf("A.按棋手身份查询\n");
  6.         printf("B.按棋手姓名查询\n");
  7.         printf("C.按棋手段位查询\n");
  8.         printf("D.退出当前功能\n");
  9.         printf("请选择(A-D):");
  10.         getchar();
  11.         scanf("%c", &reply);
  12.                 if(reply == 'D')
  13.                 {
  14.                         return;
  15.                 }
  16.                 printf("请输入%s:", reply == 'A' ? "棋手身份" : reply == 'B' ? "棋手姓名" : "棋手段位");
  17.                 scanf("%s", keyword);
  18.                
  19.                         for(i = 0; i < num_players; i++)
  20.                         {
  21.                                 int sel = 0;
  22.                                 switch(reply)
  23.                                 {
  24.                                         case 'A':
  25.                                                 sel = strcmp(players[i].identity, keyword) == 0;
  26.                                                 break;
  27.                                                
  28.                                         case'B':
  29.                                                 sel = strcmp(players[i].name, keyword) == 0;
  30.                                                 break;
  31.                                                
  32.                                         case'C':
  33.                                                 sel = strcmp(players[i].rank, keyword) == 0;
  34.                                                 break;
  35.                                 }
  36.                                 if(sel)
  37.                                 {
  38.                                         if(!back)
  39.                                         {
  40.                                                 printf("%20s\t%20s\t%10s\t%12s\t%20s\n", "编号","姓名","身份","段位","等级分\n");       
  41.                                         }
  42.                                         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);
  43.                                         back++;
  44.                                 }
  45.                        
  46.                         }
  47.                         if(!back)
  48.                         {
  49.                                 printf("未找到该棋手信息\n");
  50.                         }
  51.                         else
  52.                         {
  53.                                 printf("共%d人\n", back);
  54.                         }
  55.         }
复制代码



//更改棋手信息       
  1. void FixPlayer(Player players[], int num_players)
  2. {
  3.         char id[10], name[50];
  4.         printf("请输入棋手编号、姓名:");
  5.         scanf("%s%s", id, name);
  6.                
  7.         int i = 0, fix_choice, fix_index = -1;
  8.         char fix_ch;
  9.                 for(i = 0; i < num_players; i++)
  10.                 {
  11.                         if(strcmp(players[i].id, id) == 0 && strcmp(players[i].name, name) == 0)
  12.                         {
  13.                                 fix_index = i;
  14.                                 break;
  15.                         }
  16.                 }
  17.                
  18.                         if(fix_index == -1)
  19.                         {
  20.                         printf("查无此人\n");
  21.                         return;
  22.                         }
  23.                
  24.                 printf("完整信息:%20s\t%21s\t%10s\t%12s\t%18s\n",
  25.                                                  players[fix_index].id, players[fix_index].name, players[fix_index].identity, players[fix_index].rank, players[fix_index].score);
  26.                 printf("选择要修改的数据项(编号不能修改,1-姓名 2-身份 3-段位 4-等级分):");
  27.                 scanf("%d", &fix_choice);
  28.                 printf("是否修改该数据y/n?:");
  29.                 getchar();
  30.                 scanf("%c", &fix_ch);
  31.                         if(fix_ch == 'y')
  32.                         {
  33.                                 switch(fix_choice)
  34.                                 {
  35.                                         case 1:
  36.                                                 printf("请输入修改后的姓名:");
  37.                                                 scanf("%s", players[fix_index].name);
  38.                                                 break;
  39.                                         case 2:
  40.                                                 printf("输入修改后的身份:");
  41.                                                 scanf("%s", players[fix_index].identity);
  42.                                                 break;
  43.                                         case 3:
  44.                                                 printf("输入修改后的段位:");
  45.                                                 scanf("%s", players[fix_index].rank);
  46.                                                 break;
  47.                                         case 4:
  48.                                                 printf("输入修改后的等级分:");
  49.                                                 scanf("%s", players[fix_index].rank);
  50.                                                 break;
  51.                                         default:
  52.                                                 printf("输入错误,请按照规范重新输入!\n");
  53.                                                 break;
  54.                                 }
  55.                         printf("修改成功!\n");       
  56.                         SavePlayer(players, num_players);
  57.                         printf("本地文件更新成功\n");
  58.                 }
  59.                
  60.         }
  61.        
  62.        
复制代码



//统计棋手信息
  1. void StatPlayer(Player players[], int num_players)
  2. {
  3.         char stat_choice, identity[10], rank[10];
  4.         int i = 0, stat_count = 0;
  5.         printf("A. 统计某身份某段位棋手总数\n");
  6.         printf("B. 统计职业二段以上的棋手总数\n");
  7.         printf("C. 统计业余棋手总数\n");
  8.         printf("D. 退出当前功能\n");
  9.         printf("请选择(A-D):");
  10.         getchar();
  11.         scanf("%c", &stat_choice);

  12.                 switch(stat_choice)
  13.                 {
  14.                         case 'A':
  15.                                 printf("请输入棋手身份和段位:");
  16.                                 scanf("%s%s", identity, rank);
  17.                                 for(i = 0; i < num_players; i++)
  18.                                 {
  19.                                         if(strcmp(players[i].identity, identity) == 0 && strcmp(players[i].rank, rank) == 0)
  20.                                         {
  21.                                                 stat_count++;
  22.                                         }
  23.                                 }
  24.                                 break;
  25.                         case 'B':
  26.                                 for(i = 0; i < num_players; i++)
  27.                                 {
  28.                                         if(strcmp(players[i].identity, "职业") == 0 && strcmp(players[i].rank, "二段") > 0)
  29.                                         {
  30.                                                 stat_count++;
  31.                                          }
  32.                                 }
  33.                                 break;
  34.                         case 'C':
  35.                                 for(i = 0; i < num_players; i++)
  36.                                 {
  37.                                         if(strcmp(players[i].identity, "业余") == 0)
  38.                                         {
  39.                                                 stat_count++;
  40.                                         }
  41.                                 }
  42.                                 break;
  43.                         case 'D':
  44.                                 break;
  45.                                
  46.                 }
  47.                 printf("当前棋手数量:%d\n", stat_count);
  48.                 if(stat_count > 0)
  49.                 {
  50.                         printf("%20s\t%20s\t%10s\t%12s\t%20s\n", "编号","姓名","身份","段位","等级分\n");
  51.                         for(i = 0; i < num_players; i++)
  52.                         {
  53.                                 switch(stat_choice)
  54.                                 {
  55.                                         case 'A':
  56.                                                 if(strcmp(players[i].identity, identity) == 0 && strcmp(players[i].rank, rank) == 0)
  57.                                                 {
  58.                                                         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);
  59.                                                 }
  60.                                                 break;
  61.                                         case 'B':
  62.                                                 if(strcmp(players[i].identity, "职业") == 0 && strcmp(players[i].rank, "二段") > 0)
  63.                                                 {
  64.                                                         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);
  65.                                                 }
  66.                                                 break;
  67.                                         case 'C':
  68.                                                 if(strcmp(players[i].identity, "业余") == 0)
  69.                                                 {
  70.                                                         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);
  71.                                                 }
  72.                                                 break;
  73.                                 }
  74.                         }
  75.                 }
  76.                  
  77.         }
复制代码



//对信息按要求排序       
        int SortByScore(const void* a, const void* b)
        {
            Player* playerA = (Player*)a;
            Player* playerB = (Player*)b;
                   return playerA -> score - playerB -> score;
        }
               
       
        int SortByRank(const void* a, const void* b)
        {
                const Player* playerA = (const Player*)a;
                const Player* playerB = (const Player*)b;
                if(strcmp(playerA -> identity, "职业") == 0 && strcmp(playerB -> identity, "职业") == 0)
                {
                        int Comp = strcmp(playerB -> rank, playerA -> rank);
                        if(Comp == 0)
                        {
                                return strcmp(playerA -> id, playerB -> id);
                        }
                        return Comp;
                }
                return strcmp(playerA -> identity, "职业") == 0 ? -1 : 1;
        }
       
       
       
void SortPlayer(Player players[], int num_players)
{
        int i = 0;
        char sort_choice;
        printf("A. 所有棋手按等级分进行降序排序\n");
        printf("B. 职业棋手按段位进行降序排序\n");
        printf("C. 退出当前功能\n");
        printf("请选择(A-C):");
        getchar();
        scanf("%c", &sort_choice);
                switch(sort_choice)
                {
                        case 'A':
                                qsort(players, num_players, sizeof(Player), SortByScore);
                                break;
                        case 'B':
                                qsort(players, num_players, sizeof(Player), SortByRank);
                                break;
                        case 'C':
                                return;
                }
                getchar();
                 printf("排序结果:\n");
                 printf("%20s\t%20s\t%10s\t%12s\t%20s\n", "编号","姓名","身份","段位","等级分\n");
                 for(i = 0; i < num_players; i++)
                 {
                         printf("%20s\t%21s\t%10s\t%12s\t%18s\n", players.id, players.name, players.identity, players.rank, players.score);
                 }
}       
               
最佳答案
2023-12-22 18:17:52
第一个代码段是用于查找棋手信息的函数。函数的输入参数有一个Player类型的数组players和一个整数num_players表示棋手的数量。函数的功能是根据用户的选择按照不同的方式查找棋手信息,并打印出符合条件的棋手信息。函数内部使用了getchar和scanf函数获取用户的选择和关键词,然后通过for循环和switch语句遍历棋手数组,根据用户选择的方式进行比较,如果找到符合条件的棋手,则打印出其信息。该函数无返回值。

第二个代码段是用于更改棋手信息的函数。函数的输入参数与第一个代码段相同。函数的功能是根据用户输入的棋手编号和姓名,找到对应的棋手,然后允许用户选择要修改的数据项,并修改该数据项的值。最后将修改后的棋手信息保存到本地文件中。函数内部通过for循环和if语句找到要修改的棋手,然后根据用户的选择修改对应的数据项。修改成功后,通过调用SavePlayer函数保存修改后的棋手信息到本地文件。

第三个代码段是用于统计棋手信息的函数。函数的输入参数与第一个代码段相同。函数的功能是根据用户的选择,统计满足特定条件的棋手数量,并打印出符合条件的棋手信息。函数内部使用了getchar和scanf函数获取用户的选择和输入,然后通过for循环和switch语句统计符合条件的棋手数量,并打印出这些棋手的信息。

第四个代码段是用于对棋手信息按照要求进行排序的函数。函数的输入参数与第一个代码段相同。函数的功能是根据用户的选择,对棋手信息进行排序,并打印出排序结果。函数内部使用了qsort函数和自定义的比较函数SortByScore和SortByRank来实现对棋手信息的排序。根据用户的选择不同,调用不同的比较函数进行排序。排序完成后,通过for循环打印出排好序的棋手信息。

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

使用道具 举报

发表于 2023-12-22 18:17:52 | 显示全部楼层    本楼为最佳答案   
第一个代码段是用于查找棋手信息的函数。函数的输入参数有一个Player类型的数组players和一个整数num_players表示棋手的数量。函数的功能是根据用户的选择按照不同的方式查找棋手信息,并打印出符合条件的棋手信息。函数内部使用了getchar和scanf函数获取用户的选择和关键词,然后通过for循环和switch语句遍历棋手数组,根据用户选择的方式进行比较,如果找到符合条件的棋手,则打印出其信息。该函数无返回值。

第二个代码段是用于更改棋手信息的函数。函数的输入参数与第一个代码段相同。函数的功能是根据用户输入的棋手编号和姓名,找到对应的棋手,然后允许用户选择要修改的数据项,并修改该数据项的值。最后将修改后的棋手信息保存到本地文件中。函数内部通过for循环和if语句找到要修改的棋手,然后根据用户的选择修改对应的数据项。修改成功后,通过调用SavePlayer函数保存修改后的棋手信息到本地文件。

第三个代码段是用于统计棋手信息的函数。函数的输入参数与第一个代码段相同。函数的功能是根据用户的选择,统计满足特定条件的棋手数量,并打印出符合条件的棋手信息。函数内部使用了getchar和scanf函数获取用户的选择和输入,然后通过for循环和switch语句统计符合条件的棋手数量,并打印出这些棋手的信息。

第四个代码段是用于对棋手信息按照要求进行排序的函数。函数的输入参数与第一个代码段相同。函数的功能是根据用户的选择,对棋手信息进行排序,并打印出排序结果。函数内部使用了qsort函数和自定义的比较函数SortByScore和SortByRank来实现对棋手信息的排序。根据用户的选择不同,调用不同的比较函数进行排序。排序完成后,通过for循环打印出排好序的棋手信息。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 09:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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