编写程序统计从键盘输入的一行文本中各个字母的个数。 输入以回车键结束。 不区分大小写,大写字母与相应的小写字母按照同一个字母看待.....以及用printf来调试函数-每日一题--20200416--

编写程序统计从键盘输入的一行文本中各个字母的个数。 输入以回车键结束。 不区分大小写,大写字母与相应的小写字母按照同一个字母看待。 要求输出按照各个字母出现的个数从大到小进行排序,出现的个数相同的,按照字母在字母表中的先后顺序进行排序。

要求:

  1. 各个字母出现的个数从大到小进行排序
  2. 出现的个数相同的,按照字母在字母表中的先后顺序进行排序
  3. 输出格式:
    例如输入以下文本:
    Hello World
    程序将输出:
    L(l):3
    O(o):2
    D(d):1
    E(e):1
    H(h):1
    R(r ):1
    W(w):1
    A(a):0
    B(b):0
    C(c ):0

代码在此:

【看后面的思路有惊喜哦】

#include <stdio.h>//
int main ( )//现在程序没毛病了!//现在测试语句都删掉了//来看看最后成功的版本吧!//成功!!!^-^
{
    char a[100];
    int b[26] = {0},d[26];
    gets(a);
// printf("%d\n",b[0]);
    for (int i = 0; a[i] != '\0'; i++) {
        switch (a[i]) {
            case 'a':
            case 'A':
                b[0]++;
                break;
            case 'b':
            case 'B':
                b[1]++;
                break;
            case 'c':
            case 'C':
                b[2]++;
                break;
            case 'd':
            case 'D':
                b[3]++;
                break;
            case 'e':
            case 'E':
                b[4]++;
                break;
            case 'f':
            case 'F':
                b[5]++;
                break;
            case 'g':
            case 'G':
                b[6]++;
                break;
            case 'h':
            case 'H':
                b[7]++;
                break;
            case 'i':
            case 'I':
                b[8]++;
                break;
            case 'j':
            case 'J':
                b[9]++;
                break;
            case 'k':
            case 'K':
                b[10]++;
                break;
            case 'l':
            case 'L':
                b[11]++;
                break;
            case 'm':
            case 'M':
                b[12]++;
                break;
            case 'n':
            case 'N':
                b[13]++;
                break;
            case 'o':
            case 'O':
                b[14]++;
                break;
            case 'p':
            case 'P':
                b[15]++;
                break;
            case 'q':
            case 'Q':
                b[16]++;
                break;
            case 'r':
            case 'R':
                b[17]++;
                break;
            case 's':
            case 'S':
                b[18]++;
                break;
            case 't':
            case 'T':
                b[19]++;
                break;
            case 'u':
            case 'U':
                b[20]++;
                break;
            case 'v':
            case 'V':
                b[21]++;
                break;
            case 'w':
            case 'W':
                b[22]++;
                break;
            case 'x':
            case 'X':
                b[23]++;
                break;
            case 'y':
            case 'Y':
                b[24]++;
                break;
            case 'z':
            case 'Z':
                b[25]++;
                
                
            default:
                
                break;
        }
    }
    
    for (int i = 0; i < 26; i++) {
        d[i] = i + 1;
    }
     //printf("%d\n",b[0]);
    for (int i = 0; i < 26; i++) {//??问题来源??
        for (int j = 0; j < 25 - i ; j++) {//因为后面出现了j+1!!!已经超出了26!!
            if (b[j] < b[j+1]) {
                int c = b[j];
                b[j] = b[j+1];
                b [j+1] = c;
                int m = d[j];
                d[j] = d[j+1];
                d[j+1] = m;
            }
             //printf("%d\n",b[0]);//最后一个出了问题//居然忘记删掉测试语句了!!
        }
    }
    //printf("%d\n",b[0]);
    for (int i = 0; i < 26; i++) {
       //问题二:a去哪了?
        printf("%c(%c):%d\n",d[i]+'A'-1,d[i]+'a'-1,b[i]);
    }
    
}//没有地方报错,现在来检验一下

运行结果:

在这里插入图片描述

思路:

  • 首先创建字符串并且接收
  • 判别并计数【这里我有两种思维:1·如上程序。 2·用for循环计数,多创建两个数组(26)分别记大写小写的数,然后加在一个数组中。】
  • 排序:注意两个条件1·多–>少 2· ascall码
  • 输出
    遇到的问题:
    排序问题:如管交换位置则数组与下标的对应关系会被打破
    解决办法:用一个新的数组存下标,对应字母每交换一次,下标数组也随之交换,最后下标数组将用于输出对应字母。

检验程序错误:

用printf来检查哪里的数据出错了【本来录制了视频,但是传不上来啊】

新的短代码:除了之后没有按照多少来打印,计数功能都实现了,另外注意字符串的长度可能不够!

#include <stdio.h>
//用下标表示字母,找到相应下标就可以给这个字母计数

int main( )
{
    char a[1000];
    int b[26] = {0};
    int i = 0;
    for (; i<1000; i++) {
        a[i] = getchar();
        if (a[i] == '\n') {
            break;
        }
        if ('a' <= a[i]&&a[i] <= 'z')
            b[a[i] - 'a']++;
        else if ('A' <= a[i]&&a[i] <= 'Z')
          b[a[i] - 'A']++;
    }
    for (i = 0; i <26; i++) {
        printf("%c(%c):%d\n",i+'A',i+'a',b[i]  );
    }
    
}
  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 这段字符串的意思是:编写程序统计从键盘输入一行文本各个字母个数输入回车键结束。不区分大小写大写字母相应小写字母按照同一个字母看待。要求输出按照各个字母出现个数从大到小进行排序,输出的个数相同的,按照它们出现的顺序。 ### 回答2: 对于这道题,我们首先要明确两个问题:一是如何读取用户输入文本,二是如何统计各个字母个数。 对于第一个问题,我们可以使用Python的input()函数来读取用户输入文本。input()函数会把用户输入的所有字符读取为一个字符串,直到用户输入回车键结束。 对于第二个问题,我们可以使用一个字典来存储各个字母个数。字典的每个键表示一个字母,每个值表示该字母出现次数。具体实现时,我们可以先将所有字母出现次数初始化为0,然后遍历输入文本,每遇到一个字母就将该字母的计数器加1。 在统计完各个字母个数后,我们可以使用Python的sorted函数来将字典按照各个字母出现个数从大到小进行排序。具体实现时,我们可以使用sorted函数的key参数,将排序的依据设为每个键对应的值。 最后,为了满足题目的要求,我们可以在排序完成后,再根据出现次数相同的字母字母顺序进行排序。具体实现时,我们可以将排好序的字典每个键值对转化为一个元素,存储在一个列表。然后,我们可以使用列表元素的比较函数,将列表按照键的顺序从小到大进行排序。 最终实现如下所示: ```python text = input("请输入一行文本:") text = text.lower() # 将所有字符转换为小写 word_count = {} # 初始化各个字母的计数器 for i in range(ord('a'), ord('z') + 1): word_count[chr(i)] = 0 for word in text: if word.isalpha(): word_count[word] += 1 sorted_word_count = sorted(word_count.items(), key=lambda x: x[1], reverse=True) # 按照出现次数排序 # 按照字母顺序排序 sorted_word_count = sorted(sorted_word_count, key=lambda x: x[0]) # 按照出现次数相同的字母字母顺序排序 sort_order = "".join([i[0] for i in sorted_word_count]) sorted_word_count = sorted(sorted_word_count, key=lambda x: sort_order.index(x[0])) for word, count in sorted_word_count: print(word, count) ``` 需要注意的是,在输出各个字母出现次数时,我们使用了sorted_word_count字典的items()函数来获取所有的键值对。每个键值对的第一个元素表示字母,第二个元素表示该字母出现次数。 ### 回答3: 编写程序统计从键盘输入一行文本各个字母个数,这个问题需要认真分析,因为需要实现的功能较为复杂。按照要求,我们可以采取以下步骤: 1. 定义一个长度为26的数组,用于存储各字符出现次数,数组下标从0到25对应A到Z。 2. 从键盘读取一行输入,可以用scanf或fgets函数实现,最好使用fgets,因为scanf容易出现缓冲区溢出的问题。读入的字符串最后要加上'\0'作为结束符。 3. 遍历读入的字符串,依次取出每个字符。如果是大写字母,直接将其转换为小写字母;如果不是字母,直接跳过不处理。 4. 对于每个字母,计算其出现次数,并更新到数组。可以用字符的ASCII码值减去'a'的ASCII码值得到对应的数组下标。 5. 遍历数组,找出出现次数最多的字母及其出现次数。可以使用两个变量,一个存储最大值,一个存储最大值对应的下标。处理完一个最大值后,将其赋为0,继续找下一个最大值,直到数组所有的值都被处理完毕。 6. 按照要求输出结果,可以用一个结构体数组来存储不同字母及其对应的出现次数,然后按照出现次数从大到小对结构体数组进行排序,最后输出结果即可。 代码示例: struct char_count { char ch; // 字符 int count; // 出现次数 }; int main() { char_count cc[26]; // 存储字母出现次数的数组 char str[100]; // 存储输入字符串的数组 int i, j, maxcount, maxidx; // 初始化char_count数组 for (i = 0; i < 26; i++) { cc[i].ch = 'a' + i; cc[i].count = 0; } // 读入字符串 printf("请输入一行文本(以回车键结束):\n"); fgets(str, 100, stdin); // 去掉输入字符串的结尾换行符 if (str[strlen(str)-1] == '\n') { str[strlen(str)-1] = '\0'; } // 统计字母出现次数 for (i = 0; i < strlen(str); i++) { if (str[i] >= 'A' && str[i] <= 'Z') { // 大写字母小写字母 str[i] += 'a' - 'A'; } if (str[i] >= 'a' && str[i] <= 'z') { // 只处理字母 cc[str[i]-'a'].count++; } } // 按照出现次数从大到小排序 for (i = 0; i < 25; i++) { maxcount = cc[i].count; maxidx = i; for (j = i+1; j < 26; j++) { if (cc[j].count > maxcount) { maxcount = cc[j].count; maxidx = j; } } if (maxidx != i) { char_count tmp = cc[i]; cc[i] = cc[maxidx]; cc[maxidx] = tmp; } if (cc[i].count == 0) { // 已经没有统计到的字母了,退出循环 break; } } // 输出结果 printf("每个字母出现次数如下:\n"); for (i = 0; i < 26; i++) { if (cc[i].count != 0) { printf("%c:%d\n", cc[i].ch, cc[i].count); } } return 0; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值