生肖统计
分数 10
作者 黄龙军
单位 绍兴文理学院
春节至,亲朋好友聚会忙,聚会之人有时会说到自己的生肖。对于给定的若干人的生肖,请统计各种生肖的人数,并按人数从多到小输出各种出现的生肖及其人数。若有多种生肖的人数相同,则按生肖英文单词(详见最后的提示)的字典序输出。
输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试先输入1个整数n(1<=n<=100)表示聚会人数,再输入n个字符串(长度不超过7且仅包含小写字母),每个字符串表示一个人的生肖。
输出格式:
对于每组测试,按描述要求输出结果,每种出现的生肖及其人数占一行,每行的两个数据之间以一个空格间隔。每两组测试数据之间留一个空行。
输入样例:
2
4
tiger
rabbit
dragon
rabbit
5
tiger
rabbit
dragon
rabbit
dragon
输出样例:
rabbit 2
dragon 1
tiger 1
dragon 2
rabbit 2
tiger 1
提示:
鼠、牛、虎、兔、龙、蛇、马、羊、猴、鸡、狗、猪等十二生肖相应的英文单词如下:
rat、ox、tiger、rabbit、dragon、snake、horse、goat、monkey、rooster、dog、pig
实现代码:
#include<stdio.h>
#include<string.h>
struct P{
char name[20];
int count;
};
int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
struct P str[12]={{"rat",0},{"ox",0},{"tiger",0},{"rabbit",0},{"dragon",0},{"snake",0},{"horse",0},{"goat",0},{"monkey",0},{"rooster",0},{"dog",0},{"pig",0}};
char a[20];//存放比较数组字符串
int i;
for(i=0;i<n;i++){
scanf("%s",a);
for(int j=0;j<12;j++){
if(strcmp(a,str[j].name)==0){
str[j].count++;
break;
}
}
}
struct P t;
for(i=0;i<12;i++){
for(int j=0;j<12-i-1;j++){
if(str[j+1].count>str[j].count){
t=str[j];str[j]=str[j+1];str[j+1]=t;
}//冒泡排序str[i].count,达到题目要求
if(strcmp(str[j+1].name,str[j].name)<0&&str[j+1].count==str[j].count){
t=str[j];str[j]=str[j+1];str[j+1]=t;
}//生肖人数相同,按生肖英文单词的字典序排序
}
}
for(i=0;i<12;i++){
if(str[i].count>0){
printf("%s %d\n",str[i].name,str[i].count);
}
}
if(T>0){
printf("\n");/*保证每组测试之间有一个空行,
如果不添加这一步,输出结果可能会变得混乱*/
}
}
return 0;
}