鱼C论坛

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

[已解决]围棋棋手系统

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

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

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

x

请分别简要解释这四段代码,并说明用哪些函数实现的,函数的输入和输出是什么
       
//查找棋手信息
void SearchPlayer(Player players[], int num_players)
{
        char reply, keyword[20];
        int i = 0, back = 0;
        printf("A.按棋手身份查询\n");
        printf("B.按棋手姓名查询\n");
        printf("C.按棋手段位查询\n");
        printf("D.退出当前功能\n");
        printf("请选择(A-D):");
        getchar();
        scanf("%c", &reply);
                if(reply == 'D')
                {
                        return;
                }
                printf("请输入%s:", reply == 'A' ? "棋手身份" : reply == 'B' ? "棋手姓名" : "棋手段位");
                scanf("%s", keyword);
                
                        for(i = 0; i < num_players; i++)
                        {
                                int sel = 0;
                                switch(reply)
                                {
                                        case 'A':
                                                sel = strcmp(players[i].identity, keyword) == 0;
                                                break;
                                                
                                        case'B':
                                                sel = strcmp(players[i].name, keyword) == 0;
                                                break;
                                                
                                        case'C':
                                                sel = strcmp(players[i].rank, keyword) == 0;
                                                break;
                                }
                                if(sel)
                                {
                                        if(!back)
                                        {
                                                printf("%20s\t%20s\t%10s\t%12s\t%20s\n", "编号","姓名","身份","段位","等级分\n");        
                                        }
                                        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);
                                        back++;
                                }
                        
                        }
                        if(!back)
                        {
                                printf("未找到该棋手信息\n");
                        }
                        else
                        {
                                printf("共%d人\n", back);
                        }
        }


//更改棋手信息       
void FixPlayer(Player players[], int num_players)
{
        char id[10], name[50];
        printf("请输入棋手编号、姓名:");
        scanf("%s%s", id, name);
                
        int i = 0, fix_choice, fix_index = -1;
        char fix_ch;
                for(i = 0; i < num_players; i++)
                {
                        if(strcmp(players[i].id, id) == 0 && strcmp(players[i].name, name) == 0)
                        {
                                fix_index = i;
                                break;
                        }
                }
                
                        if(fix_index == -1)
                        {
                        printf("查无此人\n");
                        return;
                        }
                
                printf("完整信息:%20s\t%21s\t%10s\t%12s\t%18s\n",
                                                 players[fix_index].id, players[fix_index].name, players[fix_index].identity, players[fix_index].rank, players[fix_index].score);
                printf("选择要修改的数据项(编号不能修改,1-姓名 2-身份 3-段位 4-等级分):");
                scanf("%d", &fix_choice);
                printf("是否修改该数据y/n?:");
                getchar();
                scanf("%c", &fix_ch);
                        if(fix_ch == 'y')
                        {
                                switch(fix_choice)
                                {
                                        case 1:
                                                printf("请输入修改后的姓名:");
                                                scanf("%s", players[fix_index].name);
                                                break;
                                        case 2:
                                                printf("输入修改后的身份:");
                                                scanf("%s", players[fix_index].identity);
                                                break;
                                        case 3:
                                                printf("输入修改后的段位:");
                                                scanf("%s", players[fix_index].rank);
                                                break;
                                        case 4:
                                                printf("输入修改后的等级分:");
                                                scanf("%s", players[fix_index].rank);
                                                break;
                                        default: 
                                                printf("输入错误,请按照规范重新输入!\n");
                                                break; 
                                }
                        printf("修改成功!\n");        
                        SavePlayer(players, num_players);
                        printf("本地文件更新成功\n");
                }
                
        }
        
        


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

                switch(stat_choice)
                {
                        case 'A':
                                printf("请输入棋手身份和段位:");
                                scanf("%s%s", identity, rank);
                                for(i = 0; i < num_players; i++)
                                {
                                        if(strcmp(players[i].identity, identity) == 0 && strcmp(players[i].rank, rank) == 0)
                                        {
                                                stat_count++;
                                        }
                                }
                                break;
                        case 'B':
                                for(i = 0; i < num_players; i++)
                                {
                                        if(strcmp(players[i].identity, "职业") == 0 && strcmp(players[i].rank, "二段") > 0)
                                        {
                                                stat_count++;
                                         } 
                                }
                                break;
                        case 'C':
                                for(i = 0; i < num_players; i++)
                                {
                                        if(strcmp(players[i].identity, "业余") == 0)
                                        {
                                                stat_count++;
                                        }
                                }
                                break;
                        case 'D':
                                break;
                                
                }
                printf("当前棋手数量:%d\n", stat_count);
                if(stat_count > 0)
                {
                        printf("%20s\t%20s\t%10s\t%12s\t%20s\n", "编号","姓名","身份","段位","等级分\n");
                        for(i = 0; i < num_players; i++)
                        {
                                switch(stat_choice)
                                {
                                        case 'A':
                                                if(strcmp(players[i].identity, identity) == 0 && strcmp(players[i].rank, rank) == 0)
                                                {
                                                        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);
                                                }
                                                break;
                                        case 'B':
                                                if(strcmp(players[i].identity, "职业") == 0 && strcmp(players[i].rank, "二段") > 0)
                                                {
                                                        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);
                                                }
                                                break;
                                        case 'C':
                                                if(strcmp(players[i].identity, "业余") == 0)
                                                {
                                                        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);
                                                }
                                                break;
                                }
                        }
                }
                 
        }


//对信息按要求排序       
        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[i].id, players[i].name, players[i].identity, players[i].rank, players[i].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-11-23 03:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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