下面先貼上題目:
題目1061:成績排序
時間限制:1 秒
內存限制:32 兆
特殊判題:否
提交:4777
解決:1227
- 題目描述:
-
有N個學生的數據,將學生數據按成績高低排序,如果成績相同則按姓名字符的字母序排序,如果姓名的字母序也相同則按照學生的年齡排序,並輸出N個學生排序後的信息。
- 輸入:
-
測試數據有多組,每組輸入第一行有一個整數N(N<=1000),接下來的N行包括N個學生的數據。
每個學生的數據包括姓名(長度不超過100的字符串)、年齡(整形數)、成績(小於等於100的正數)。
- 輸出:
-
將學生信息按成績進行排序,成績相同的則按姓名的字母序進行排序。
然後輸出學生信息,按照如下格式:
姓名 年齡 成績
- 樣例輸入:
-
3 abc 20 99 bcd 19 97 bed 20 97
- 樣例輸出:
-
bcd 19 97 bed 20 97 abc 20 99
- 提示:
-
學生姓名的字母序區分字母的大小寫,如A要比a的字母序靠前(因爲A的ASC碼比a的ASC碼要小)。
貼上代碼:
#include <stdio.h> #include <stdlib.h> #include <string.h> struct student{ char name[101]; int age; int score; }; int main() { int n,i,j; struct student a[1000],temp; while(scanf("%d",&n) != EOF) { for(i = 0; i < n; i++) scanf("%s %d %d",&a[i].name,&a[i].age,&a[i].score); for(i = 0; i < n - 1; i++) for(j = 0; j < n - i - 1; j++) { if(a[j].score > a[j + 1].score) { temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } else if(a[j].score == a[j + 1].score) { if(strcmp(a[j].name,a[j + 1].name) > 0) { temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } else if(strcmp(a[j].name,a[j + 1].name) == 0) { if(a[j].age > a[j + 1].age) { temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } } } for(i = 0; i < n; i++) printf("%s %d %d\n",a[i].name,a[i].age,a[i].score); } //system("pause"); return 0; }