摘要:語言每日一練年月日文章目錄題目描述問題分析代碼實現(xiàn)運(yùn)行結(jié)果題目描述用語言編寫軟件完成以下任務(wù)一批選手參加比賽,比賽的規(guī)則是最后得分越高,名次越低。
C語言每日一練
2021年11月24日
用c語言編寫軟件完成以下任務(wù):一批選手參加比賽,比賽的規(guī)則是最后得分越高,名次越低。當(dāng)半決賽結(jié)束時,要在現(xiàn)場按照選手的出場順序宣布最后得分和最后名次,獲得相同分?jǐn)?shù)的選手具有相同的名次,名次連續(xù)編號,不用考慮同名次的選手人數(shù)。
例如:
選手序號: 1,2,3,4,5,6,7
選手得分: 5,3,4,7,3,5,6
輸出名次為:3,1,2,5,1,3,4
題目中要求編寫的程序能實現(xiàn)將選手按照分?jǐn)?shù)高低進(jìn)行排序,又可以根據(jù)選手的入場順序進(jìn)行排序,對于這種多屬性的對象,最好的處理方法便是使用結(jié)構(gòu)體,定義一個結(jié)構(gòu)體struct player
,重定義命名為PLAYER
(重定義的目的是免去重復(fù)寫struct
的麻煩),該結(jié)構(gòu)體需要三個成員變量:num
(出場編號),score
(比賽得分)和rank
(排名)。
//參賽選手結(jié)構(gòu)體typedef struct player{ int num; //出場編號 int score; //總分 int rank; //排名}PLAYER;
選手的編號可以直接通過一個循環(huán)進(jìn)行順序賦值(也可以在定義結(jié)構(gòu)體時進(jìn)行初始化),得分可以手動輸入,也可以使用生成隨機(jī)數(shù)的方法(該方法的詳細(xì)介紹可以看我第61天的練習(xí)題),選手的排名需要參考他們的比賽得分,題目要求得分相同的排名也相同,且排名需要連續(xù)(比如有兩個第一名,那么第三個人就是第二名,而不是第三名)。
我的代碼主要包括3個重要的步驟:
void Sort_By_Score(PLAYER *players, int len)
void Get_Ranking(PLAYER *player, int len)
void Sort_By_Num(PLAYER *players, int len)
核心步驟:
- 給選手結(jié)構(gòu)體數(shù)組分配編號1~n
- 使用隨機(jī)函數(shù)生成選手的成績1~10
- 根據(jù)分?jǐn)?shù)對選手進(jìn)行排序,分?jǐn)?shù)低的排名靠前
- 獲取每個選手的排名,分?jǐn)?shù)相同的排名并列
- 將選手按照出場編號重新排列
- 依據(jù)選手的編號順序打印他們的成績和排名
#include #include //srand()/rand()#include //time()#define PLAYER_NUMBER 6 //參賽人數(shù)//參賽選手結(jié)構(gòu)體typedef struct player{ int num; //出場編號 int score; //總分 int rank; //排名}PLAYER;/****************************************************************************** * @brief 根據(jù)選手的分?jǐn)?shù)對選手進(jìn)行排序(使用冒泡排序) * @param players 選手結(jié)構(gòu)體成員 * @param len 選手結(jié)構(gòu)體數(shù)組長度 ******************************************************************************/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ǐn)?shù)低的排在前面) * @param players 選手結(jié)構(gòu)體成員 * @param len 選手結(jié)構(gòu)體數(shù)組長度 ******************************************************************************/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ù)選手的出場編號對選手進(jìn)行排序(使用選擇排序) * @param players 選手結(jié)構(gòu)體成員 * @param len 選手結(jié)構(gòu)體數(shù)組長度 ******************************************************************************/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ù)對選手進(jìn)行排序(分?jǐn)?shù)低的排前面) Sort_By_Score(players, PLAYER_NUMBER); //根據(jù)分?jǐn)?shù)排序獲取選手的排名 Get_Ranking(players, PLAYER_NUMBER); //根據(jù)選手出場編號進(jìn)行排序 Sort_By_Num(players, PLAYER_NUMBER); //打印結(jié)果 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;}
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/125076.html
摘要:原型和配合使用產(chǎn)生偽隨機(jī)數(shù)序列。問題分析思路可以參照前面擲骰子小游戲的實現(xiàn)原理。 C語言每日一練 2021年11月21日 文章目錄 實現(xiàn)擲骰子小游戲?qū)崿F(xiàn)原理...
摘要:問題你需要執(zhí)行簡單的日期操作,計算兩個日期間隔多少天某個日期后的多少天是幾月幾日轉(zhuǎn)換時間字符串的格式等解決方案使用庫中的和類其中類代表一個日期時間,例如年月日點(diǎn)分秒類代表一個日期間隔對于實例,可以直接進(jìn)行數(shù)學(xué)運(yùn)算得到一個實例,也就是兩個日 問題 你需要執(zhí)行簡單的日期操作,計算兩個日期間隔多少天、某個日期后的多少天是幾月幾日、轉(zhuǎn)換時間字符串的格式等 解決方案 使用datetime庫中的d...
摘要:問題現(xiàn)在有多個字典或者映射,你想將它們從邏輯上合并為一個單一的映射后執(zhí)行某些操作,比如查找值或者檢查某些鍵是否存在。 問題 現(xiàn)在有多個字典或者映射,你想將它們從邏輯上合并為一個單一的映射后執(zhí)行某些操作, 比如查找值或者檢查某些鍵是否存在。 解決方案 使用collections庫的ChainMap類,可以快速的將多個dict合并在一起 >>> from collections impor...
摘要:問題如何保存迭代對象的最后個元素例如保存列表的最后個元素或者保存某個迭代器對象的最后個元素解決方案對于列表元組這樣的數(shù)據(jù)結(jié)構(gòu),可以使用切片來很方便的實現(xiàn),例如保存列表的最后個元素就可以直接但有些時候,我們操作的可迭代對象不能使用切片這個時 問題 如何保存迭代對象的最后N個元素 例如保存列表[a, b, c, d]的最后2個元素 或者保存某個迭代器對象的最后5個元素 解決方案 對于列表、...
摘要:問題怎樣找出一個序列中出現(xiàn)次數(shù)最多的元素解決方案使用庫中的對象可以方便的求出現(xiàn)次數(shù)最多的前個元素直接使用成員函數(shù)就好了,例如輸出討論對象是的子類,事實上內(nèi)部存儲也是按照字典存儲的,這里的就是次數(shù),所以對象支持對象的所有操作每一個對象初始化 問題 怎樣找出一個序列中出現(xiàn)次數(shù)最多的元素? 解決方案 使用collections庫中的Counter對象可以方便的求出現(xiàn)次數(shù)最多的前N個元素 直接...
閱讀 1603·2021-11-25 09:43
閱讀 4160·2021-11-15 11:37
閱讀 3264·2021-08-17 10:13
閱讀 3572·2019-08-30 14:16
閱讀 3603·2019-08-26 18:37
閱讀 2547·2019-08-26 11:56
閱讀 1214·2019-08-26 10:42
閱讀 701·2019-08-26 10:39