春节至,亲朋好友聚会忙,聚会之人有时会说到自己的生肖。对于给定的若干人的生肖,请统计各种生肖的人数,并按人数从多到少输出各种出现的生肖及其人数。若有多种生肖的人数相同,则按生肖英文单词(详见最后的提示)的字典顺序输出。输入:首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试先输入1 个整数n(1<=n<=100)表示聚会人数,再输入n个字符串(长度不超过7且仅包含小写字母),每个字符串表示一个人的生肖。输出:对于每组测试,按描述要求输出结果,每种出现的生肖及其人数占一行,每行的两个数据之间以一个空格间隔。每两组测试数据之间留一个空行。 提示:鼠、牛、虎、兔、龙、蛇、马、羊、猴、鸡、狗、猪等十二生肖相应的英文单词如下:rat、ox、tiger、rabbit、dragon、snake、horse、goat、monkey、rooster、dog、pigc语言代码
时间: 2023-07-04 16:26:58 浏览: 293
好的,以下是 C 语言的代码实现:
```c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Zodiac {
char name[8];
int count;
};
int cmp(const void* a, const void* b) {
const struct Zodiac* z1 = (const struct Zodiac*) a;
const struct Zodiac* z2 = (const struct Zodiac*) b;
if (z1->count == z2->count) {
return strcmp(z1->name, z2->name);
} else {
return z2->count - z1->count;
}
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
int n;
scanf("%d", &n);
struct Zodiac zodiacs[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}
};
for (int i = 0; i < n; i++) {
char name[8];
scanf("%s", name);
for (int j = 0; j < 12; j++) {
if (strcmp(name, zodiacs[j].name) == 0) {
zodiacs[j].count++;
}
}
}
qsort(zodiacs, 12, sizeof(struct Zodiac), cmp);
for (int i = 0; i < 12; i++) {
printf("%s %d\n", zodiacs[i].name, zodiacs[i].count);
}
if (T > 0) {
printf("\n");
}
}
return 0;
}
```
在这段代码中,我们定义了一个结构体 `Zodiac` 来表示每个生肖的名称和出现次数。然后使用 `qsort` 函数进行排序,排序函数中按照题目要求进行比较。最后输出结果即可。
阅读全文