结构体测验:按时间顺序给出奥运会的获奖情况,根据获奖情况输出当前奥运金牌榜。

笔者:“ 以下代码为笔者大一初入C语言的笔记与作业,谨以此记录我的C学习生涯,重要之处皆有注释,若有疑问大可评论区留言。”

题目描述

按时间顺序给出奥运会的获奖情况,根据获奖情况输出当前奥运金牌榜。

输入

第一行一个整数N,代表奖牌的数量。
接下来N行,每行代表国家的名字和奖牌的类型。
为了简化问题,国家名中不存在空格。
N<=500

输出

按金牌数量降序输出每个国家的名称,及金银铜牌的数量,用空格隔开。若金牌数相同,则比较银牌的数量。若金牌银牌的数量都相同,则比较铜牌的数量。

样例输入

10
zhongguo jin
zhongguo tong
meiguo jin
yidali jin
faguo jin
faguo tong
meiguo yin
meiguo yin
eluosi tong
zhongguo jin

样例输出

zhongguo 2 0 1
meiguo 1 2 0
faguo 1 0 1
yidali 1 0 0
eluosi 0 0 1

基本思路

  1. 本题运用结构体存储数据会更加方便,否则需要创建多个伴生数组存储数据。
  2. 比较金银铜数量时应使用权重代替3层if嵌套语句,依次给金银铜赋予不同的权重,比较各个国家的权重之和。
  3. 存储数据的难点为在读入一组新数据时,需要在已有数据结构体数组中遍历是否存过该国家的数据,有则存入,无则创建新的数据结构体。
#include<stdio.h>//按序先存国家名字,遍历数组,如果没有则新占用数组,再存入jin yin tong牌数目,s[1] s[2] s[3]
#include<string.h>

int main(){
	struct medal{
		char country[1000];
		int jin;
		int yin;
		int tong;
		int sum;//代表权重
	}s[1000]={},temp;//temp为后续冒泡排序比较顺序时的缓冲区。

	char *cmp[3]={"jin","yin","tong"};//用于strcmp()内的比较,strcmp无法直接比较字符串。
	int m;
	int count=0;//计数不重复的国家数量
	int flag;
	char gj[1000],jp[1000];
	scanf("%d",&m);

		for (int i = 0; i < m; i++)
		{
			scanf("%s %s",gj,jp);
			flag=0;
			for (int j = 0; j  < count; j ++)
			{
				if(strcmp(s[j].country,gj)==0) {
					flag=1;
					if(strcmp(cmp[0],jp)==0) {s[j].jin++;s[j].sum+=100000;}
					if(strcmp(cmp[1],jp)==0) {s[j].yin++;s[j].sum+=1000;}
					if(strcmp(cmp[2],jp)==0) {s[j].tong++;s[j].sum+=1;}
					break;
				}
			}
			if(flag==0){//若flag为0则代表之前遍历结构体数组时没有那个国家的数据
				strcpy(s[count].country,gj);
				if(strcmp(cmp[0],jp)==0) {s[count].jin++;s[count].sum+=100000;}
				if(strcmp(cmp[1],jp)==0) {s[count].yin++;s[count].sum+=1000;}
				if(strcmp(cmp[2],jp)==0) {s[count].tong++;s[count].sum+=1;}
				count++;
			}
		}
		//?为数组输入
		//?开始比较各国家数据
		for (int i = 0; i < count-1; i++)//冒泡排序
		{
			for (int j = 0; j < count-1-i; j++)
			{
				if(s[j].sum<s[j+1].sum){
					temp=s[j+1];//结构体允许整体赋值
					s[j+1]=s[j];
					s[j]=temp;
				}
			}
		}
		for (int i = 0; i < count; i++)
		{
			printf("%s %d %d %d\n",s[i].country,s[i].jin,s[i].yin,s[i].tong);
		}

	return 0;
}

版权声明:本文为wjhauannn原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。