pta-生肖统计

生肖统计

分数 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;

}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值