笔者:“ 以下代码为笔者大一初入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
基本思路
- 本题运用结构体存储数据会更加方便,否则需要创建多个伴生数组存储数据。
- 比较金银铜数量时应使用权重代替3层if嵌套语句,依次给金银铜赋予不同的权重,比较各个国家的权重之和。
- 存储数据的难点为在读入一组新数据时,需要在已有数据结构体数组中遍历是否存过该国家的数据,有则存入,无则创建新的数据结构体。
#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版权协议,转载请附上原文出处链接和本声明。