资讯专栏INFORMATION COLUMN

C语言每日一练——第62天:选美比赛

tuomao / 1473人阅读

摘要:语言每日一练年月日文章目录题目描述问题分析代码实现运行结果题目描述用语言编写软件完成以下任务一批选手参加比赛,比赛的规则是最后得分越高,名次越低。

C语言每日一练
2021年11月24日

题目描述

用c语言编写软件完成以下任务:一批选手参加比赛,比赛的规则是最后得分越高,名次越低。当半决赛结束时,要在现场按照选手的出场顺序宣布最后得分和最后名次,获得相同分数的选手具有相同的名次,名次连续编号,不用考虑同名次的选手人数。

例如:
选手序号: 1,2,3,4,5,6,7
选手得分: 5,3,4,7,3,5,6
输出名次为:3,1,2,5,1,3,4

问题分析

题目中要求编写的程序能实现将选手按照分数高低进行排序,又可以根据选手的入场顺序进行排序,对于这种多属性的对象,最好的处理方法便是使用结构体,定义一个结构体struct player,重定义命名为PLAYER(重定义的目的是免去重复写struct的麻烦),该结构体需要三个成员变量:num(出场编号),score(比赛得分)和rank(排名)。

//参赛选手结构体typedef struct player{    int num;    //出场编号    int score;  //总分    int rank;   //排名}PLAYER;

选手的编号可以直接通过一个循环进行顺序赋值(也可以在定义结构体时进行初始化),得分可以手动输入,也可以使用生成随机数的方法(该方法的详细介绍可以看我第61天的练习题),选手的排名需要参考他们的比赛得分,题目要求得分相同的排名也相同,且排名需要连续(比如有两个第一名,那么第三个人就是第二名,而不是第三名)。

我的代码主要包括3个重要的步骤:

  1. 根据分数对选手进行排序,分数低的排名靠前
    第一步,在选手已经得出成绩的情况下(成绩由随机函数生成),调用函数
    void Sort_By_Score(PLAYER *players, int len)
    该函数会将参赛选手(结构体数组)按照他们分数的高低进行排序,需要注意的是题目要求分数越低的排名越高,该函数排序使用了冒泡排序
  2. 获取每个选手的排名,分数相同的排名并列
    第一步已经将分数最低的选手排在结构体数组最前面,分数最高的选手放到了数组最后。所以这时只需要对每个成员顺序地分配排名值,唯一需要注意的是,如果两个选手分数相同,那么他们名次也相同。该功能在代码中对应的函数为:
    void Get_Ranking(PLAYER *player, int len)
  3. 将选手按照出场编号重新排列
    和第一步类似,只不过现在是按照选手的出场编号对结构体数组进行排序,该功能在代码中对应的函数为:
    void Sort_By_Num(PLAYER *players, int len)
    该函数用到了选择排序

代码实现

核心步骤:

  1. 给选手结构体数组分配编号1~n
  2. 使用随机函数生成选手的成绩1~10
  3. 根据分数对选手进行排序,分数低的排名靠前
  4. 获取每个选手的排名,分数相同的排名并列
  5. 将选手按照出场编号重新排列
  6. 依据选手的编号顺序打印他们的成绩和排名
#include #include      //srand()/rand()#include        //time()#define PLAYER_NUMBER  6  //参赛人数//参赛选手结构体typedef struct player{    int num;    //出场编号    int score;  //总分    int rank;   //排名}PLAYER;/****************************************************************************** * @brief 根据选手的分数对选手进行排序(使用冒泡排序) * @param players 选手结构体成员 * @param len     选手结构体数组长度 ******************************************************************************/void Sort_By_Score(PLAYER *players, int len){    int i = 0, j = 0;    PLAYER tmp;    //冒泡排序    for(i = 0; i < len - 1; i++)    {        for(j = 0 ; j < len - i - 1; j++)        {            if(players[j].score > players[j + 1].score)            {                tmp = players[j];                players[j] = players[j + 1];                players[j + 1] = tmp;            }        }    }}/****************************************************************************** * @brief 根据选手成绩确定选手的排名(分数低的排在前面) * @param players 选手结构体成员 * @param len     选手结构体数组长度 ******************************************************************************/void Get_Ranking(PLAYER *player, int len){    int i = 0, rank = 1;        player[0].rank = rank;    //第一名    for(i = 1; i < len; i++)  //第二至第len-1名    {        //如果分数与上一名不同,则排名加1,否则排名相同        if(player[i].score != player[i - 1].score)            rank++;        player[i].rank = rank;    }}/****************************************************************************** * @brief 根据选手的出场编号对选手进行排序(使用选择排序) * @param players 选手结构体成员 * @param len     选手结构体数组长度 ******************************************************************************/void Sort_By_Num(PLAYER *players, int len){    int i = 0, j = 0;    PLAYER tmp;    //选择排序    for(i = 0; i < len - 1; i++)    {        for(j = i + 1; j < len; j++)        {            if(players[i].num > players[j].num)            {                tmp = players[i];                players[i] = players[j];                players[j] = tmp;            }        }    }}int main(){    int i = 0;    PLAYER players[PLAYER_NUMBER];    //用系统秒数初始化随机数种子    srand((unsigned)time(NULL));    //初始化选手信息    for(i = 0; i < PLAYER_NUMBER; i++)    {        players[i].num = i + 1;    }    //随机生成成员分数    for(i = 0; i < PLAYER_NUMBER; i++)    {        //分数1~10分        players[i].score = rand() % 10 + 1;    }    //根据分数对选手进行排序(分数低的排前面)    Sort_By_Score(players, PLAYER_NUMBER);    //根据分数排序获取选手的排名    Get_Ranking(players, PLAYER_NUMBER);    //根据选手出场编号进行排序    Sort_By_Num(players, PLAYER_NUMBER);    //打印结果    printf("=========================/n");    printf("| 编号/t| 得分/t| 排名/t|/n");    printf("+-----------------------+/n");    for(i = 0; i < PLAYER_NUMBER; i++)    {        printf("| %d/t| %d/t| %d/t|/n", players[i].num,/               players[i].score, players[i].rank);        printf("+-----------------------+/n");    }    return 0;}

运行结果

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/125076.html

相关文章

  • C语言每日一练——61:掷骰子游戏

    摘要:原型和配合使用产生伪随机数序列。问题分析思路可以参照前面掷骰子小游戏的实现原理。 C语言每日一练 2021年11月21日 文章目录 实现掷骰子小游戏实现原理...

    whlong 评论0 收藏0
  • Python每日一练0020

    摘要:问题你需要执行简单的日期操作,计算两个日期间隔多少天某个日期后的多少天是几月几日转换时间字符串的格式等解决方案使用库中的和类其中类代表一个日期时间,例如年月日点分秒类代表一个日期间隔对于实例,可以直接进行数学运算得到一个实例,也就是两个日 问题 你需要执行简单的日期操作,计算两个日期间隔多少天、某个日期后的多少天是几月几日、转换时间字符串的格式等 解决方案 使用datetime库中的d...

    Berwin 评论0 收藏0
  • Python每日一练0013

    摘要:问题现在有多个字典或者映射,你想将它们从逻辑上合并为一个单一的映射后执行某些操作,比如查找值或者检查某些键是否存在。 问题 现在有多个字典或者映射,你想将它们从逻辑上合并为一个单一的映射后执行某些操作, 比如查找值或者检查某些键是否存在。 解决方案 使用collections库的ChainMap类,可以快速的将多个dict合并在一起 >>> from collections impor...

    sihai 评论0 收藏0
  • Python每日一练0004

    摘要:问题如何保存迭代对象的最后个元素例如保存列表的最后个元素或者保存某个迭代器对象的最后个元素解决方案对于列表元组这样的数据结构,可以使用切片来很方便的实现,例如保存列表的最后个元素就可以直接但有些时候,我们操作的可迭代对象不能使用切片这个时 问题 如何保存迭代对象的最后N个元素 例如保存列表[a, b, c, d]的最后2个元素 或者保存某个迭代器对象的最后5个元素 解决方案 对于列表、...

    greatwhole 评论0 收藏0
  • Python每日一练0009

    摘要:问题怎样找出一个序列中出现次数最多的元素解决方案使用库中的对象可以方便的求出现次数最多的前个元素直接使用成员函数就好了,例如输出讨论对象是的子类,事实上内部存储也是按照字典存储的,这里的就是次数,所以对象支持对象的所有操作每一个对象初始化 问题 怎样找出一个序列中出现次数最多的元素? 解决方案 使用collections库中的Counter对象可以方便的求出现次数最多的前N个元素 直接...

    yiliang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<