福大OJ 多關鍵字排序和排名
多關鍵字排序和排名
Description
下面是某一屆學生在OJ系統某一時刻的完成情況統計(學生總數不超過170人):
學號 姓名 解題數目 提交次數
222200221 高豔紅 77 124
222200116 吳志贇 80 90
222200240 高一鑫 80 173
222200111 唐煥翔 81 157
…
學號用字串存放(長度為9),姓名最多5個漢字,0<=解題數目、提交次數<100000。
現要求程式設計完成下述功能:
(1)讀入學生總數和這些學生的學號、姓名、解題數目、提交次數資訊(假定資料都滿足前面的規定);
(2)為每個學生自動計算其"正確比例"(保留2位小數,第3位小數四捨五入);
(3)先按"解題數目",再按"正確比例"從高到低排序,如果它們都相同,就按"學號"從小到大排序;
(4)輸出上述完整的OJ系統完成情況統計表。
如果"解題數目"和"正確比例"都相同,則名次並列。並列規則:有2個第1名,則第3個人的名次為第3名。
輸出格式規定:名次4位左對齊,學號9+3位左對齊,姓名10+1位左對齊,解題數目和提交次數6位右對齊,正確比例8位2位小數右對齊。
Input
第1行為學生總數 第2行開始,每行為1個學生的學號、姓名、解題數目、提交次數(均用空格分開)
Output
已經按題目要求排序後的OJ系統完成情況統計表。 每行為1個學生的排名、學號、姓名、解題數目、提交次數、正確比例
Sample Input 1
13
222200221 高豔紅 77 124
222200116 吳志贇 80 90
222200201 翁詩寧 80 147
222200127 王建洲 80 128
222200128 曾榮流 80 332
222200125 張明星 80 128
222200203 李長泉 80 110
222200212 胡武揚 80 154
222200219 張華榮 80 198
222200227 劉成斌 80 117
222200240 高一鑫 80 173
222200101 流葉笛 81 150
222200111 唐煥翔 81 157
Sample Output 1
1 222200101 流葉笛 81 150 54.00%
2 222200111 唐煥翔 81 157 51.59%
3 222200116 吳志贇 80 90 88.89%
4 222200203 李長泉 80 110 72.73%
5 222200227 劉成斌 80 117 68.38%
6 222200125 張明星 80 128 62.50%
6 222200127 王建洲 80 128 62.50%
8 222200201 翁詩寧 80 147 54.42%
9 222200212 胡武揚 80 154 51.95%
10 222200240 高一鑫 80 173 46.24%
11 222200219 張華榮 80 198 40.40%
12 222200128 曾榮流 80 332 24.10%
13 222200221 高豔紅 77 124 62.10%
Hint
嚴格按要求的格式輸出。
原始碼
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student{
char stuNum[10]; //學生學號
char stuName[11]; //學生姓名,漢字一個2位元組
int solveNum; //解題數
int submitNum; //提交次數
float acceptRate; //正確比例
};
int cmp(const void* a,const void* b) //結構體排序函式,小於0則說明第一個減數小
{
struct Student* c1=(struct Student*)a;
struct Student* c2=(struct Student*)b;
if(c1->solveNum==c2->solveNum)
{
if(c1->submitNum==c2->submitNum)
{
return strcmp(c1->stuNum,c2->stuNum);
}
else return c1->submitNum-c2->submitNum;
}
else return c2->solveNum-c1->solveNum;
}
struct Student SE[175]; //軟體工程系學生總人數
int main(void)
{
// freopen("input/multiplysort.txt","r",stdin);
int n,ranking=1,pastSolveNum=0,pastSubmitNum=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s%s%d%d",SE[i].stuNum,SE[i].stuName,&SE[i].solveNum,&SE[i].submitNum);
SE[i].acceptRate=(float)SE[i].solveNum/SE[i].submitNum*100.0;
}
qsort(SE+1,n,sizeof(SE[0]),cmp);
for(int i=1;i<=n;i++)
{
if(SE[i].solveNum!=pastSolveNum||SE[i].submitNum!=pastSubmitNum)
{
ranking=i;
}
pastSolveNum=SE[i].solveNum;
pastSubmitNum=SE[i].submitNum;
printf("%-4d%-12s%-11s%6d%6d%8.2f%%",ranking,SE[i].stuNum,SE[i].stuName,SE[i].solveNum,SE[i].submitNum,SE[i].acceptRate);
if(i!=n) printf("\n");
}
return 0;
}