成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

C語言每日一練——第62天:選美比賽

tuomao / 1529人閱讀

摘要:語言每日一練年月日文章目錄題目描述問題分析代碼實(shí)現(xiàn)運(yùn)行結(jié)果題目描述用語言編寫軟件完成以下任務(wù)一批選手參加比賽,比賽的規(guī)則是最后得分越高,名次越低。

C語言每日一練
2021年11月24日

題目描述

用c語言編寫軟件完成以下任務(wù):一批選手參加比賽,比賽的規(guī)則是最后得分越高,名次越低。當(dāng)半決賽結(jié)束時(shí),要在現(xiàn)場(chǎng)按照選手的出場(chǎng)順序宣布最后得分和最后名次,獲得相同分?jǐn)?shù)的選手具有相同的名次,名次連續(xù)編號(hào),不用考慮同名次的選手人數(shù)。

例如:
選手序號(hào): 1,2,3,4,5,6,7
選手得分: 5,3,4,7,3,5,6
輸出名次為:3,1,2,5,1,3,4

問題分析

題目中要求編寫的程序能實(shí)現(xiàn)將選手按照分?jǐn)?shù)高低進(jìn)行排序,又可以根據(jù)選手的入場(chǎng)順序進(jìn)行排序,對(duì)于這種多屬性的對(duì)象,最好的處理方法便是使用結(jié)構(gòu)體,定義一個(gè)結(jié)構(gòu)體struct player,重定義命名為PLAYER(重定義的目的是免去重復(fù)寫struct的麻煩),該結(jié)構(gòu)體需要三個(gè)成員變量:num(出場(chǎng)編號(hào)),score(比賽得分)和rank(排名)。

//參賽選手結(jié)構(gòu)體typedef struct player{    int num;    //出場(chǎng)編號(hào)    int score;  //總分    int rank;   //排名}PLAYER;

選手的編號(hào)可以直接通過一個(gè)循環(huán)進(jìn)行順序賦值(也可以在定義結(jié)構(gòu)體時(shí)進(jìn)行初始化),得分可以手動(dòng)輸入,也可以使用生成隨機(jī)數(shù)的方法(該方法的詳細(xì)介紹可以看我第61天的練習(xí)題),選手的排名需要參考他們的比賽得分,題目要求得分相同的排名也相同,且排名需要連續(xù)(比如有兩個(gè)第一名,那么第三個(gè)人就是第二名,而不是第三名)。

我的代碼主要包括3個(gè)重要的步驟:

  1. 根據(jù)分?jǐn)?shù)對(duì)選手進(jìn)行排序,分?jǐn)?shù)低的排名靠前
    第一步,在選手已經(jīng)得出成績(jī)的情況下(成績(jī)由隨機(jī)函數(shù)生成),調(diào)用函數(shù)
    void Sort_By_Score(PLAYER *players, int len)
    該函數(shù)會(huì)將參賽選手(結(jié)構(gòu)體數(shù)組)按照他們分?jǐn)?shù)的高低進(jìn)行排序,需要注意的是題目要求分?jǐn)?shù)越低的排名越高,該函數(shù)排序使用了冒泡排序
  2. 獲取每個(gè)選手的排名,分?jǐn)?shù)相同的排名并列
    第一步已經(jīng)將分?jǐn)?shù)最低的選手排在結(jié)構(gòu)體數(shù)組最前面,分?jǐn)?shù)最高的選手放到了數(shù)組最后。所以這時(shí)只需要對(duì)每個(gè)成員順序地分配排名值,唯一需要注意的是,如果兩個(gè)選手分?jǐn)?shù)相同,那么他們名次也相同。該功能在代碼中對(duì)應(yīng)的函數(shù)為:
    void Get_Ranking(PLAYER *player, int len)
  3. 將選手按照出場(chǎng)編號(hào)重新排列
    和第一步類似,只不過現(xiàn)在是按照選手的出場(chǎng)編號(hào)對(duì)結(jié)構(gòu)體數(shù)組進(jìn)行排序,該功能在代碼中對(duì)應(yīng)的函數(shù)為:
    void Sort_By_Num(PLAYER *players, int len)
    該函數(shù)用到了選擇排序。

代碼實(shí)現(xiàn)

核心步驟:

  1. 給選手結(jié)構(gòu)體數(shù)組分配編號(hào)1~n
  2. 使用隨機(jī)函數(shù)生成選手的成績(jī)1~10
  3. 根據(jù)分?jǐn)?shù)對(duì)選手進(jìn)行排序,分?jǐn)?shù)低的排名靠前
  4. 獲取每個(gè)選手的排名,分?jǐn)?shù)相同的排名并列
  5. 將選手按照出場(chǎng)編號(hào)重新排列
  6. 依據(jù)選手的編號(hào)順序打印他們的成績(jī)和排名
#include #include      //srand()/rand()#include        //time()#define PLAYER_NUMBER  6  //參賽人數(shù)//參賽選手結(jié)構(gòu)體typedef struct player{    int num;    //出場(chǎng)編號(hào)    int score;  //總分    int rank;   //排名}PLAYER;/****************************************************************************** * @brief 根據(jù)選手的分?jǐn)?shù)對(duì)選手進(jìn)行排序(使用冒泡排序) * @param players 選手結(jié)構(gòu)體成員 * @param len     選手結(jié)構(gòu)體數(shù)組長(zhǎng)度 ******************************************************************************/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 根據(jù)選手成績(jī)確定選手的排名(分?jǐn)?shù)低的排在前面) * @param players 選手結(jié)構(gòu)體成員 * @param len     選手結(jié)構(gòu)體數(shù)組長(zhǎng)度 ******************************************************************************/void Get_Ranking(PLAYER *player, int len){    int i = 0, rank = 1;        player[0].rank = rank;    //第一名    for(i = 1; i < len; i++)  //第二至第len-1名    {        //如果分?jǐn)?shù)與上一名不同,則排名加1,否則排名相同        if(player[i].score != player[i - 1].score)            rank++;        player[i].rank = rank;    }}/****************************************************************************** * @brief 根據(jù)選手的出場(chǎng)編號(hào)對(duì)選手進(jìn)行排序(使用選擇排序) * @param players 選手結(jié)構(gòu)體成員 * @param len     選手結(jié)構(gòu)體數(shù)組長(zhǎng)度 ******************************************************************************/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];    //用系統(tǒng)秒數(shù)初始化隨機(jī)數(shù)種子    srand((unsigned)time(NULL));    //初始化選手信息    for(i = 0; i < PLAYER_NUMBER; i++)    {        players[i].num = i + 1;    }    //隨機(jī)生成成員分?jǐn)?shù)    for(i = 0; i < PLAYER_NUMBER; i++)    {        //分?jǐn)?shù)1~10分        players[i].score = rand() % 10 + 1;    }    //根據(jù)分?jǐn)?shù)對(duì)選手進(jìn)行排序(分?jǐn)?shù)低的排前面)    Sort_By_Score(players, PLAYER_NUMBER);    //根據(jù)分?jǐn)?shù)排序獲取選手的排名    Get_Ranking(players, PLAYER_NUMBER);    //根據(jù)選手出場(chǎng)編號(hào)進(jìn)行排序    Sort_By_Num(players, PLAYER_NUMBER);    //打印結(jié)果    printf("=========================/n");    printf("| 編號(hào)/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;}

運(yùn)行結(jié)果

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/125076.html

相關(guān)文章

  • C語言每日一練——61:擲骰子游戲

    摘要:原型和配合使用產(chǎn)生偽隨機(jī)數(shù)序列。問題分析思路可以參照前面擲骰子小游戲的實(shí)現(xiàn)原理。 C語言每日一練 2021年11月21日 文章目錄 實(shí)現(xiàn)擲骰子小游戲?qū)崿F(xiàn)原理...

    whlong 評(píng)論0 收藏0
  • Python每日一練0020

    摘要:?jiǎn)栴}你需要執(zhí)行簡(jiǎn)單的日期操作,計(jì)算兩個(gè)日期間隔多少天某個(gè)日期后的多少天是幾月幾日轉(zhuǎn)換時(shí)間字符串的格式等解決方案使用庫中的和類其中類代表一個(gè)日期時(shí)間,例如年月日點(diǎn)分秒類代表一個(gè)日期間隔對(duì)于實(shí)例,可以直接進(jìn)行數(shù)學(xué)運(yùn)算得到一個(gè)實(shí)例,也就是兩個(gè)日 問題 你需要執(zhí)行簡(jiǎn)單的日期操作,計(jì)算兩個(gè)日期間隔多少天、某個(gè)日期后的多少天是幾月幾日、轉(zhuǎn)換時(shí)間字符串的格式等 解決方案 使用datetime庫中的d...

    Berwin 評(píng)論0 收藏0
  • Python每日一練0013

    摘要:?jiǎn)栴}現(xiàn)在有多個(gè)字典或者映射,你想將它們從邏輯上合并為一個(gè)單一的映射后執(zhí)行某些操作,比如查找值或者檢查某些鍵是否存在。 問題 現(xiàn)在有多個(gè)字典或者映射,你想將它們從邏輯上合并為一個(gè)單一的映射后執(zhí)行某些操作, 比如查找值或者檢查某些鍵是否存在。 解決方案 使用collections庫的ChainMap類,可以快速的將多個(gè)dict合并在一起 >>> from collections impor...

    sihai 評(píng)論0 收藏0
  • Python每日一練0004

    摘要:?jiǎn)栴}如何保存迭代對(duì)象的最后個(gè)元素例如保存列表的最后個(gè)元素或者保存某個(gè)迭代器對(duì)象的最后個(gè)元素解決方案對(duì)于列表元組這樣的數(shù)據(jù)結(jié)構(gòu),可以使用切片來很方便的實(shí)現(xiàn),例如保存列表的最后個(gè)元素就可以直接但有些時(shí)候,我們操作的可迭代對(duì)象不能使用切片這個(gè)時(shí) 問題 如何保存迭代對(duì)象的最后N個(gè)元素 例如保存列表[a, b, c, d]的最后2個(gè)元素 或者保存某個(gè)迭代器對(duì)象的最后5個(gè)元素 解決方案 對(duì)于列表、...

    greatwhole 評(píng)論0 收藏0
  • Python每日一練0009

    摘要:?jiǎn)栴}怎樣找出一個(gè)序列中出現(xiàn)次數(shù)最多的元素解決方案使用庫中的對(duì)象可以方便的求出現(xiàn)次數(shù)最多的前個(gè)元素直接使用成員函數(shù)就好了,例如輸出討論對(duì)象是的子類,事實(shí)上內(nèi)部存儲(chǔ)也是按照字典存儲(chǔ)的,這里的就是次數(shù),所以對(duì)象支持對(duì)象的所有操作每一個(gè)對(duì)象初始化 問題 怎樣找出一個(gè)序列中出現(xiàn)次數(shù)最多的元素? 解決方案 使用collections庫中的Counter對(duì)象可以方便的求出現(xiàn)次數(shù)最多的前N個(gè)元素 直接...

    yiliang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<