摘要:語言每日一練年月日文章目錄題目描述問題分析代碼實現運行結果題目描述用語言編寫軟件完成以下任務一批選手參加比賽,比賽的規則是最后得分越高,名次越低。
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個重要的步驟:
void Sort_By_Score(PLAYER *players, int len)
void Get_Ranking(PLAYER *player, int len)
void Sort_By_Num(PLAYER *players, int len)
核心步驟:
- 給選手結構體數組分配編號1~n
- 使用隨機函數生成選手的成績1~10
- 根據分數對選手進行排序,分數低的排名靠前
- 獲取每個選手的排名,分數相同的排名并列
- 將選手按照出場編號重新排列
- 依據選手的編號順序打印他們的成績和排名
#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;}
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/125076.html
摘要:原型和配合使用產生偽隨機數序列。問題分析思路可以參照前面擲骰子小游戲的實現原理。 C語言每日一練 2021年11月21日 文章目錄 實現擲骰子小游戲實現原理...
摘要:問題你需要執行簡單的日期操作,計算兩個日期間隔多少天某個日期后的多少天是幾月幾日轉換時間字符串的格式等解決方案使用庫中的和類其中類代表一個日期時間,例如年月日點分秒類代表一個日期間隔對于實例,可以直接進行數學運算得到一個實例,也就是兩個日 問題 你需要執行簡單的日期操作,計算兩個日期間隔多少天、某個日期后的多少天是幾月幾日、轉換時間字符串的格式等 解決方案 使用datetime庫中的d...
摘要:問題現在有多個字典或者映射,你想將它們從邏輯上合并為一個單一的映射后執行某些操作,比如查找值或者檢查某些鍵是否存在。 問題 現在有多個字典或者映射,你想將它們從邏輯上合并為一個單一的映射后執行某些操作, 比如查找值或者檢查某些鍵是否存在。 解決方案 使用collections庫的ChainMap類,可以快速的將多個dict合并在一起 >>> from collections impor...
摘要:問題如何保存迭代對象的最后個元素例如保存列表的最后個元素或者保存某個迭代器對象的最后個元素解決方案對于列表元組這樣的數據結構,可以使用切片來很方便的實現,例如保存列表的最后個元素就可以直接但有些時候,我們操作的可迭代對象不能使用切片這個時 問題 如何保存迭代對象的最后N個元素 例如保存列表[a, b, c, d]的最后2個元素 或者保存某個迭代器對象的最后5個元素 解決方案 對于列表、...
摘要:問題怎樣找出一個序列中出現次數最多的元素解決方案使用庫中的對象可以方便的求出現次數最多的前個元素直接使用成員函數就好了,例如輸出討論對象是的子類,事實上內部存儲也是按照字典存儲的,這里的就是次數,所以對象支持對象的所有操作每一個對象初始化 問題 怎樣找出一個序列中出現次數最多的元素? 解決方案 使用collections庫中的Counter對象可以方便的求出現次數最多的前N個元素 直接...
閱讀 1507·2021-11-25 09:43
閱讀 4057·2021-11-15 11:37
閱讀 3192·2021-08-17 10:13
閱讀 3503·2019-08-30 14:16
閱讀 3534·2019-08-26 18:37
閱讀 2488·2019-08-26 11:56
閱讀 1128·2019-08-26 10:42
閱讀 609·2019-08-26 10:39