每次奧運會期間,大家都非常關注獎牌榜排名的情況。
現(xiàn)在我們假設獎牌榜的排名規(guī)則侥猬,按優(yōu)先級從高到低如下:
1.金牌 數(shù)量多的排在前面善炫;
2.銀牌 數(shù)量多的排在前面撩幽;
3.銅牌 數(shù)量多的排在前面;
4.若以上三個條件仍無法區(qū)分名次,則以國家名稱的字典序排列窜醉。
我們假設國家名稱不超過20個字符宪萄、各種獎牌數(shù)不超過100,且大于等于0榨惰。
1.輸入描述
第一行輸入一個整數(shù)N(0<N<21)拜英,代表國家數(shù)量;
然后接下來的N行,每行包含一個字符串Namei表示每個國家的名稱琅催,和三個整數(shù)Gi居凶、Si、Bi分別表示每個獲得的金藤抡、銀侠碧、銅牌的數(shù)量,以空格隔開,如(China 51 20 21)。
2.輸出描述
輸出獎牌榜的依次順序白翻,只輸出國家名稱,各占一行挨队。
3.樣例輸入
5
China 32 28 34
England 12 34 22
France 23 33 2
Japan 12 34 25
Rusia 23 43 0
4.樣例輸出
China
Rusia
France
Japan
England
5.代碼實現(xiàn)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct country {
char name[20];
int gold;
int silver;
int bronze;
}Ctry;
// 交換array1與array2的值
void SwitchCtry(Ctry *array1, Ctry *array2)
{
Ctry temp;
if(!array1 || !array2)
{
return;
}
temp = *array1;
*array1 = *array2;
*array2 = temp;
}
// 對array數(shù)組按照規(guī)則進行排序
void Sort(Ctry *array, int n)
{
for(int i = 0; i < n - 1; i++)
{
for(int j = i + 1; j < n; j++)
{
if(array[i].gold < array[j].gold)
{
SwitchCtry(&array[i], &array[j]);
}
else if (array[i].gold == array[j].gold)
{
if (array[i].silver < array[j].silver)
{
SwitchCtry(&array[i], &array[j]);
}
else if (array[i].silver == array[j].silver)
{
if (array[i].bronze < array[j].bronze)
{
SwitchCtry(&array[i], &array[j]);
}
else if (array[i].bronze == array[j].bronze)
{
//strcmp()函數(shù)用到<string.h>
if(strcmp(array[i].name, array[j].name) > 0)
{
SwitchCtry(&array[i], &array[j]);
}
}
}
}
}
}
}
int main()
{
int n;
Ctry *array = NULL;
scanf("%d", &n);
if (n <= 0 || n >= 21)
{
return 1;
}
// 開辟結構體指針空間
array = (Ctry *)malloc(n * sizeof(Ctry));
if(array == NULL)
{
return 1;
}
// 獲取輸入值
for(int i = 0; i < n; i++)
{
scanf("%s %d %d %d", array[i].name, &array[i].gold, &array[i].silver, &array[i].bronze);
}
Sort(array, n);
// 打印輸出結果
for (int j = 0; j < n; j++)
{
printf("%s\n", array[j].name);
}
// 釋放指針
free(array);
// 指針釋放后置NULL
array = NULL;
return 0;
}
個人主頁: