日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言:成绩排名(结构体)

發布時間:2024/1/18 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言:成绩排名(结构体) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目詳情

定義結構體struct stu,編寫成績排名函數:void sort(struct stu *ps,int n),對結構體數組按成績排名。 程序功能為讀入整數N(N<100),再讀入N個學生的學號(整型)和成績(實數)。按樣例輸出排名。

輸出格式

第一列是名次,注意并列情況;

第二列是學號,第三列是成績(2位小數)

輸入樣例

5 101 99 102 100 103 50 104 80 105 99

輸出樣例?

1 102 100.00 2 101 99.00 2 105 99.00 4 104 80.00 5 103 50.00

題目分析?

怎么來分析這個題目呢?

我覺得這道題難得不是排序,難頂的是這該死的并列排名還有一些細節!細節!細節!

先說說這個并列排名吧? 我是真真的在這磕了好久 提交了好多次 就是不能夠通過測試點1 就是不能完全對... 那種感覺真的是太難受了。(最后是一個好朋友救了我)

直接說說我的思路吧。

無非就是兩種情況

所以我們可以考慮使用? if (s[i].score == s[i-1].score)??具體代碼可以看下面

第一種就是該學生的成績與前面一個的學生不相同 這個時候我們就可以直接用 i+1 來表示排名就可以了 最關鍵的一步就是我們要將這個名次用一個變量存儲起來 (至于為什么呢 看了第2種情況就悟了)。

第二種就是成績并列的情況了 這個時候的名次就和前一個的是一樣的了??這個時候我們就可以直接用上邊的那個存儲名次的變量了。

大致就是這樣了。

代碼展示

靜態構建結構體數組

# include <stdio.h>struct stu {int num;//學號 float score;//成績 };void sort(struct stu * ps, int n) {int i, j;struct stu t;/* 定義中間變量 *//* 冒泡排序法 這里就不具體解釋了*/for (i=0; i<n; i++){for (j=0; j<n-1-i; j++){if (ps[j].score < ps[j+1].score){t = ps[j];ps[j] = ps[j+1];ps[j+1] = t;}}}}int main(void) {struct stu s[100]; int N, i;int k = 0; /* 記錄排名 (嗚嗚嗚 定義這個變量真的太有必要了)*/ scanf("%d", &N); /* 輸入N個學生個數 */for (i=0; i<N; i++)/* 逐個輸入學生的信息 */ {scanf("%d%f", &s[i].num, &s[i].score);}sort(s, N);/* 將學生信息排列 */for (i=0; i<N; i++)/* 遍歷所有學生 逐個輸出 */{/* 與前一個學生成績進行比較 在這里是與前一個學生的信息進行對比 具體分析可以參考題目分析里的 */if (s[i].score == s[i-1].score){ printf("%d %d %.2f", k, s[i].num, s[i].score); /* 注意題目要求成績要保留兩位小數 */}else { /* 如果與前面的成績不相等的話 就直接用i+1來表示排名再好不過了 */printf("%d %d %.2f", i+1, s[i].num, s[i].score);k = i+1;/* 把這個排名保存在K中 如果后面的成績與這個成績相同 排名就相同 直接就用K來表示了 */ }if (i < N-1) /* 嗚嗚嗚 我們這里還要滿足人類的要求 輸出最后一名時不能加換行符 */{printf("\n");} } return 0; }

?動態構建結構體數組

思路都一樣就不注釋了

# include <stdio.h> # include <stdlib.h> # define LEN sizeof(struct stu)struct stu {int num;float score; };void sort(struct stu * ps, int n) {int i, j;struct stu t;for (i=0; i<n; i++){for (j=0; j<n-1-i; j++){if (ps[j].score < ps[j+1].score){t = ps[j];ps[j] = ps[j+1];ps[j+1] = t;}}}}int main(void) {struct stu * s; int N, i;scanf("%d", &N);s = (struct stu *)malloc(N*LEN);for (i=0; i<N; i++){scanf("%d%f", &s[i].num, &s[i].score);}sort(s, N);int t; for (i=0; i<N; i++){if (s[i].score == s[i-1].score){printf("%d %d %.2f", t, s[i].num, s[i].score);}else {printf("%d %d %.2f", i+1, s[i].num, s[i].score);t = i+1;}if (i < N-1){printf("\n");} }return 0; }

運行展示

?

?

?

?

?

總結

以上是生活随笔為你收集整理的c语言:成绩排名(结构体)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。