c语言:成绩排名(结构体)
生活随笔
收集整理的這篇文章主要介紹了
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语言:成绩排名(结构体)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringMVC执行流程【简单理解举例
- 下一篇: oracle客户端备份导入导出数据库(e