小羊爱吃小草 发表于 2023-12-22 18:17:35

围棋棋手系统


请分别简要解释这四段代码,并说明用哪些函数实现的,函数的输入和输出是什么
       
//查找棋手信息
void SearchPlayer(Player players[], int num_players)
{
        char reply, keyword;
        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.identity, keyword) == 0;
                                                break;
                                               
                                        case'B':
                                                sel = strcmp(players.name, keyword) == 0;
                                                break;
                                               
                                        case'C':
                                                sel = strcmp(players.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.id, players.name, players.identity, players.rank, players.score);
                                        back++;
                                }
                       
                        }
                        if(!back)
                        {
                                printf("未找到该棋手信息\n");
                        }
                        else
                        {
                                printf("共%d人\n", back);
                        }
        }


//更改棋手信息       
void FixPlayer(Player players[], int num_players)
{
        char id, name;
        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.id, id) == 0 && strcmp(players.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.id, players.name, players.identity, players.rank, players.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.name);
                                                break;
                                        case 2:
                                                printf("输入修改后的身份:");
                                                scanf("%s", players.identity);
                                                break;
                                        case 3:
                                                printf("输入修改后的段位:");
                                                scanf("%s", players.rank);
                                                break;
                                        case 4:
                                                printf("输入修改后的等级分:");
                                                scanf("%s", players.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, rank;
        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.identity, identity) == 0 && strcmp(players.rank, rank) == 0)
                                        {
                                                stat_count++;
                                        }
                                }
                                break;
                        case 'B':
                                for(i = 0; i < num_players; i++)
                                {
                                        if(strcmp(players.identity, "职业") == 0 && strcmp(players.rank, "二段") > 0)
                                        {
                                                stat_count++;
                                       }
                                }
                                break;
                        case 'C':
                                for(i = 0; i < num_players; i++)
                                {
                                        if(strcmp(players.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.identity, identity) == 0 && strcmp(players.rank, rank) == 0)
                                                {
                                                        printf("%20s\t%21s\t%10s\t%12s\t%18s\n", players.id, players.name, players.identity, players.rank, players.score);
                                                }
                                                break;
                                        case 'B':
                                                if(strcmp(players.identity, "职业") == 0 && strcmp(players.rank, "二段") > 0)
                                                {
                                                        printf("%20s\t%21s\t%10s\t%12s\t%18s\n", players.id, players.name, players.identity, players.rank, players.score);
                                                }
                                                break;
                                        case 'C':
                                                if(strcmp(players.identity, "业余") == 0)
                                                {
                                                        printf("%20s\t%21s\t%10s\t%12s\t%18s\n", players.id, players.name, players.identity, players.rank, players.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.id, players.name, players.identity, players.rank, players.score);
               }
}       
               

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 围棋棋手系统