摘要:語言每日一練年月日文章目錄題目描述問題分析代碼實(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è)重要的步驟:
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ù)組分配編號(hào)1~n
- 使用隨機(jī)函數(shù)生成選手的成績(jī)1~10
- 根據(jù)分?jǐn)?shù)對(duì)選手進(jìn)行排序,分?jǐn)?shù)低的排名靠前
- 獲取每個(gè)選手的排名,分?jǐn)?shù)相同的排名并列
- 將選手按照出場(chǎng)編號(hào)重新排列
- 依據(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;}
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/125076.html
摘要:原型和配合使用產(chǎn)生偽隨機(jī)數(shù)序列。問題分析思路可以參照前面擲骰子小游戲的實(shí)現(xiàn)原理。 C語言每日一練 2021年11月21日 文章目錄 實(shí)現(xiàn)擲骰子小游戲?qū)崿F(xiàn)原理...
摘要:?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...
摘要:?jiǎn)栴}現(xiàn)在有多個(gè)字典或者映射,你想將它們從邏輯上合并為一個(gè)單一的映射后執(zhí)行某些操作,比如查找值或者檢查某些鍵是否存在。 問題 現(xiàn)在有多個(gè)字典或者映射,你想將它們從邏輯上合并為一個(gè)單一的映射后執(zhí)行某些操作, 比如查找值或者檢查某些鍵是否存在。 解決方案 使用collections庫的ChainMap類,可以快速的將多個(gè)dict合并在一起 >>> from collections impor...
摘要:?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ì)于列表、...
摘要:?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è)元素 直接...
閱讀 1530·2021-11-25 09:43
閱讀 4078·2021-11-15 11:37
閱讀 3208·2021-08-17 10:13
閱讀 3514·2019-08-30 14:16
閱讀 3545·2019-08-26 18:37
閱讀 2501·2019-08-26 11:56
閱讀 1143·2019-08-26 10:42
閱讀 623·2019-08-26 10:39