天天看點

利用C語言結構體解決“各個國家體育競賽獲獎排名”問題

一.題目描述:

     輸入一個正整數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);//隻輸出國家名稱 
	  }
	  
} 
           

四.程式運作結果:

利用C語言結構體解決“各個國家體育競賽獲獎排名”問題