这个还是比较简单的,如果需要按出现次数的高低来给结果排序,这个题目就有深度了.如果不需要排序,就像楼上说的那样,设置一个数组来按顺序代表字母,没遇到一个字母就在对该数组元素执行加1操作,这是基本解决方法.如果需要对结果排序的话,我有一个思路就是用结构体数组储存字母和字母出现的相应次数,最后根据次数对结构体数组排序即可.下面我给一个统计字母A/B/C/D出现次数的代码(26个字母的解答思路可以套用)- //从键盘输入一大堆字符串,统计A、B、C、D的出现次数,最后出现次数由高到低输出字母和出现次数。
- //主要思路:将字母和相应出现的次数存储在一个结构体数组中,统计后再根据字母出现的次数对结构体数组排序
- #include <stdio.h>
- #define N 40
- //创建一个包含两个变量的结构体
- struct letter_num
- {
- //letter表示要统计的字母
- char letter;
- //变量count表示相应字母出现的次数
- int count;
- };
- //使用冒泡排序对结构体数组重新排序
- void sort(struct letter_num arr[], int n)
- {
- //创建一个结构体临时变量tmp
- struct letter_num tmp;
- for (int i = 0; i < n - 1; i++)
- {
- for (int j = 0; j < n - 1 - i; j++) {
- /*当结构体数组中靠后的元素count值更大时,靠后的结构体元素
- 与靠前的结构体数组互换位置
- */
- if (arr[j + 1].count > arr[j].count ) {
- tmp = arr[j];
- arr[j] = arr[j + 1];
- arr[j + 1] = tmp;
- }
- }
- }
- }
- int main()
- {
- //为结构体数组中每个元素的letter分别赋值为A/B/C/D
- struct letter_num myLetter_num[4];
- for (int m = 0; m < 4; m ++) {
- myLetter_num[m].letter = 'A' + m;
- }
-
- //将结构体数组中所有的count都赋值为0
- for (int n = 0; n < 4; n++) {
- myLetter_num[n].count = 0;
- }
- printf("请输入一个字符串:");
- //定义一个字符串,长度为N
- char str[N];
- //从键盘获取用户输入
- fgets(str, N, stdin);
- //对字符串进行循环处理,直到读完字符串。
- for (int i = 0; str[i] != '\0'; i++) {
- //对字符串中的每个字符进行判断,如果该字符是A,则count[0]自增1,
- //以此类推,当字符是B/C/D的时候,count[1]/count[2]/count[3]分别自增1
- if (str[i] == 'A')
- myLetter_num[0].count++;
- if (str[i] == 'B')
- myLetter_num[1].count++;
- if (str[i] == 'C')
- myLetter_num[2].count++;
- if (str[i] == 'D')
- myLetter_num[3].count++;
- }
-
- //调用排序函数对得到的结构体数组排序
- sort(myLetter_num, 4);
-
- //按顺序打印出A/B/C/D这几个元素在字符串中出现的次数
- for (int j = 0; j < 4; j++) {
- printf("%c(%d)\n",myLetter_num[j].letter, myLetter_num[j].count);
- }
- return 0;
- }
复制代码 |