【奥运奖牌榜】一道复杂的C语言结构体问题求解

【奥运奖牌榜】一道复杂的C语言结构体问题求解

题目:奥运奖牌榜
问题描述
  给定多个比赛项目的不同国家和地区代表队运动员成绩,总结奥运奖牌榜。请编写一个函数AdjustSortTable,将奖牌榜按照规定的规则进行重新排序。函数声明如下:
void AdjustSortTable(int aSortTable[],struct medalCountry aMedalCountry[], int iCounter, int iNo, int iMedalType);
返回值:

参数:
AdjustSortTable:输入/输出参数,输入表示待重排数组,输出表示重排序后的数组
aMedalCountry:表示当前奖牌数目刚刚发生变化的代表队
iCounter:表示当前奖牌榜上总共有的代表队数目
iNo:表示当前奖牌数目刚刚发生变化的代表队目前在奖牌榜中的位置序号
iMedalType:表示当前奖牌数目刚刚发生变化的代表队刚刚获得的奖牌类型,其值为GOLDMEDAL(值0)代表金牌,SILVERMEDAL(值1)代表银牌,BRONZEMEDAL(值2)代表铜牌。
主函数输入格式
  输入的第一行包含一个整数n,表示给出了n个比赛项目的前三名所属代表队信息。
  第二行起的n行给出了n个比赛项目的金银铜牌运动员所属代表队信息,每行包含3个字符a1, a2, a3,表示金银铜牌运动员所属代表队代号,相邻的代号之间用一个空格分隔。
主函数输出格式
  输出优先按照金牌数,金牌数相同的按照银牌数,金银牌数目都相同的按照铜牌数从多到少,金银铜牌都相同的按照代号字母顺序排出的奥运奖牌棒。每个国家输出一行,每行包括名次、代表队代号、金牌数、银牌数、铜牌数信息,每项信息占用3个字符长度。

#include <stdio.h>
#include <string.h>

struct medalCountry{
    int iPlace;
    char sName[3];//代表队代号 
    int iMedalNum[3];
};

enum medalType{ GOLDMEDAL , SILVERMEDAL, BRONZEMEDAL};


void AdjustSortTable(int aSortTable[],struct medalCountry aMedalCountry[], int iCounter, int iNo, int iMedalType)
{
	struct medalCountry t;
	while(iCounter>1&&iNo)//两个队伍-iNo不为0,防止越界 
	{
		int flag= 0;
		if(aMedalCountry[aSortTable[iNo]].iMedalNum[0] > aMedalCountry[aSortTable[iNo-1]].iMedalNum[0])//和奖牌榜前一位进行比较 
		{
			t= aMedalCountry[aSortTable[iNo]];
			aMedalCountry[aSortTable[iNo]] = aMedalCountry[aSortTable[iNo-1]];
			aMedalCountry[aSortTable[iNo-1]] = t;
			flag= 1;//处理过一次 
			iNo--;//如果满足,位置序号前移 
		}
		else if(aMedalCountry[aSortTable[iNo]].iMedalNum[0] == aMedalCountry[aSortTable[iNo-1]].iMedalNum[0])
		{
			if(aMedalCountry[aSortTable[iNo]].iMedalNum[1] > aMedalCountry[aSortTable[iNo-1]].iMedalNum[1])
			{
				t= aMedalCountry[aSortTable[iNo]];
				aMedalCountry[aSortTable[iNo]] = aMedalCountry[aSortTable[iNo-1]];
				aMedalCountry[aSortTable[iNo-1]]=t;
				flag= 1;
				iNo--;
			}
			else if(aMedalCountry[aSortTable[iNo]].iMedalNum[1] == aMedalCountry[aSortTable[iNo-1]].iMedalNum[1])
			{
				if(aMedalCountry[aSortTable[iNo]].iMedalNum[2] > aMedalCountry[aSortTable[iNo-1]].iMedalNum[2])
				{
					t= aMedalCountry[aSortTable[iNo]];
					aMedalCountry[aSortTable[iNo]] = aMedalCountry[aSortTable[iNo-1]];
					aMedalCountry[aSortTable[iNo-1]] = t;
					flag= 1;
	    			iNo--;
				}
				else if(aMedalCountry[aSortTable[iNo]].iMedalNum[2] == aMedalCountry[aSortTable[iNo-1]].iMedalNum[2])
				{
					if(strcmp(aMedalCountry[iNo].sName, aMedalCountry[iNo].sName) > 0)
					{
						t= aMedalCountry[aSortTable[iNo]];
						aMedalCountry[aSortTable[iNo]] = aMedalCountry[aSortTable[iNo-1]];
						aMedalCountry[aSortTable[iNo-1]]=t;
						flag= 1;
						iNo--;
					}
				}
			}
		}
		if(flag)
		{
			iCounter--;//处理207个队伍 
		}
		else
		{
			break;
		}
	}	
}

主函数

int main(void)
{
    int n,i,j,counter=0;
    struct medalCountry aMedalCountry[206]={0};
    struct medalCountry *pSMC;
    int aSortTable[206];
    char sNameTmp[3];
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        //Gold Medal
        scanf("%s",sNameTmp);
        for(j=0; j<counter;j++)
        {
            if(!strcmp(aMedalCountry[j].sName, sNameTmp))
            {
                aMedalCountry[j].iMedalNum[GOLDMEDAL]++;
                AdjustSortTable(aSortTable, aMedalCountry, counter, j, GOLDMEDAL);
                break;
            }
        }
        if(j==counter)
        {
            strcpy(aMedalCountry[j].sName, sNameTmp);
            aMedalCountry[j].iMedalNum[GOLDMEDAL]++;
            aSortTable[j]=j;
            counter++;
            AdjustSortTable(aSortTable, aMedalCountry, counter, j, GOLDMEDAL);
        }

        //Silver Medal
        scanf("%s",sNameTmp);
        for(j=0; j<counter;j++)
        {
            if(!strcmp(aMedalCountry[j].sName, sNameTmp))
            {
                aMedalCountry[j].iMedalNum[SILVERMEDAL]++;
                AdjustSortTable(aSortTable, aMedalCountry, counter, j, SILVERMEDAL);
                break;
            }
        }
        if(j==counter)
        {
            strcpy(aMedalCountry[j].sName, sNameTmp);
            aMedalCountry[j].iMedalNum[SILVERMEDAL]++;
            aSortTable[j]=j;
            counter++;
            AdjustSortTable(aSortTable, aMedalCountry, counter, j, SILVERMEDAL);
        }

        //Bronze Medal
        scanf("%s",sNameTmp);
        for(j=0; j<counter;j++)
        {
            if(!strcmp(aMedalCountry[j].sName, sNameTmp))
            {
                aMedalCountry[j].iMedalNum[BRONZEMEDAL]++;
                AdjustSortTable(aSortTable, aMedalCountry, counter, j, BRONZEMEDAL);
                break;
            }
        }
        if(j==counter)
        {
            strcpy(aMedalCountry[j].sName, sNameTmp);
            aMedalCountry[j].iMedalNum[BRONZEMEDAL]++;
            aSortTable[j]=j;
            counter++;
            AdjustSortTable(aSortTable, aMedalCountry, counter, j, BRONZEMEDAL);
        }
    }

    for(i=0; i<counter; i++)
    {
        aMedalCountry[aSortTable[i]].iPlace = i;
        pSMC=aMedalCountry+aSortTable[i];
        printf("%3d %3s %3d %3d %3d\n", pSMC->iPlace+1, pSMC->sName, pSMC->iMedalNum[GOLDMEDAL], pSMC->iMedalNum[SILVERMEDAL], pSMC->iMedalNum[BRONZEMEDAL]);
    }

    return 0;
}

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值