一.題目描述:
輸入一個正整數N代表國家個數,緊接着輸入國家名稱,該國家獲得金牌數目,獲得銀牌數目,獲得銅牌數目。然後根據輸入輸出國家獲獎排名,排名規則是首先按金牌排名,如果金牌相同則比較銀牌,如果銀牌也相同,則比較銅牌數目,否則按照輸入順序輸出排名。
二.輸入輸出樣例:
輸入:
China 32 28 34
England 12 34 22
France 23 33 2
Japan 12 34 22
Rusia 23 43 0
輸出:
China
Rusia
France
England
Japan
三.解題思想:首先這題要求用c語言實作,是以可以采用c語言中的結構體來存儲各個國家的名稱以及獲獎情況,然後進行排序。常見的排序算法有很多,這題中采用冒泡排序,隻不過所用的冒泡排序是添加了一些條件的排序。
關于冒泡排序:外循環為排序趟數,len個元素需要進行len-1趟。内循環為每趟需要比較的次數,第i趟需要比較len-i次。注意在寫兩層循環的時候,這樣寫:for(int i=0;i<len;i++) for(int j=0;j<len-1-j;j++)。
四.帶注釋的代碼:
#include<stdio.h>
#include<string.h>
//定義一個結構體
struct AwardState
{
char str[21]; //用來存儲國家名稱
int G; //用來存儲金牌數量
int S; //用來存儲銀牌數量
int B; //用來存儲銅牌數量
}ST[21];//定義了一個結構體數組
int main()
{
struct AwardState Temp;//定義一個結構題變量,用來交換
int n;//輸入一個數n,表示國家數量
scanf("%d", &n);
//輸入各個國家名稱以及每個國家獲獎情況
int i=0;
//循環輸入n個國家的名稱以及獲獎情況
for(;i<n;i++)
{
scanf("%s",&ST[i].str);
scanf("%d",&ST[i].G);
scanf("%d",&ST[i].S);
scanf("%d",&ST[i].B);
}
//進行冒泡排序
int j=0;
for(;j<n;j++)
{
int e=0;
for(;e<n-1-j;e++)
{
if(ST[e].G<ST[e+1].G)//前面國家的金牌數量小于後面的國家
{
Temp=ST[e];
ST[e]=ST[e+1];
ST[e+1]=Temp;
}
if(ST[e].G==ST[e+1].G)//前面國家的金牌數量等于後面的國家
{
if(ST[e].S<ST[e+1].S) //銀牌數量不等
{
Temp=ST[e];
ST[e]=ST[e+1];
ST[e+1]=Temp;
}
if(ST[e].S==ST[e+1].S) //銀牌數量相等
{
if(ST[e].B<ST[e+1].B) //銅牌數量不等
{
Temp=ST[e];
ST[e]=ST[e+1];
ST[e+1]=Temp;
}
if(ST[e].B==ST[e+1].B)
{
if(strcmp(ST[e].str,ST[e+1].str)>0)
{
Temp=ST[e];
ST[e]=ST[e+1];
ST[e+1]=Temp;
}
}
}
}
}
}
//輸出排序後的結果
int k=0;
for(;k<n;k++)
{
printf("%s\n",ST[k].str);//隻輸出國家名稱
}
}
四.程式運作結果: