• c语言:计算输入字符各个字母出现的频率思路


    接着上一篇的《c语言:计算输入字符个数》,这一篇来写《c语言:计算输入字符各个字母出现的频率思路》

    同样也是《c语言程序设计第二版》这本书上面:

    2.编写一个程序,计算输入字符各个字母出现的频率。

    最终结果为:

    刚刚接手题目的时候,我想得很复杂,因为26个字母中有大小写嘛,小写a~z,大写A~Z

    但是,无论是大写还是小写,字母都只有26个,在此,当输入大写字母的时候,我们就将其转换为小写就ok啦

    大写字母转换为小写字母,有个很方便的函数tolow(),在ctype.h中,详情文章末。

    看过前一篇文章《c语言:计算输入字符个数》中使用数组统计单词长度的方法,在统计字母的个数的时候,依旧可以,只不过有些"小技巧"。

    大小写转换与计算

    if(isalpha(c)) /*详情见文末*/
    {
    c = tolower(c); //大写转换为小写
    ++char_count[c-'a'];
    }

    通过上面的代码将26个字母出现的频率统计后(都存在数组中),再来打印直方图,何为直方图,就是那张图拉,向上看。

    由于要画直方图,所以用用到两个for循环语句,通过观察可以知道,直方图的行数由max决定。

    max如何求呢,看如下代码:

        max = 0;    //初始化

    /*找出出现频率最高的字母*/
    for(x = 0; x < 26; x++)
    {
    if(char_count[x] > max)
    {
    max = char_count[x];
    printf("max is %d", max);
    }
    }

    现在max也知道了,来画出直方图吧:

    /*打印直方图*/
    for(; max > 0; max--)
    {
    for(x = 0; x < 26; x++)
    {
    if(char_count[x] >= max)
    {
    putchar('x');
    }
    else
    putchar('');
    }
    putchar('\n');
    }

    现在一切都ok啦,还差一个横坐标,不然我们咋知道每一列代表的是哪一个字母呢:

    /*打印下标,即abcdefghijklml....*/
    for(x = 0; x < 26; x++)
    {
    putchar('a'+x);
    }

    ok,整个程序完成了。

    我调试了好长时间。。。在下面这个地方,结果自己粗心了。。。

    while( c = getchar() != EOF)
    这一行代码出错了,我早了半天都没有找出来
    算了,我直接重写一遍了
    O(∩_∩)O哈哈~

    完整代码:

     1 #include <stdio.h>
    2 #include <ctype.h>
    3
    4 main()
    5 {
    6 int x; //数组下标变量,详情看代码
    7 int max; //出现频率最高的字母
    8 int char_count[26]; //26个字母出现字数的统计
    9 char c;
    10
    11 /*将数组初始化,因为我们还没有输入嘛,所以a~z都为0啦*/
    12 for( x= 0; x < 26; x++)
    13 {
    14 char_count[x] = 0;
    15 }
    16
    17 while((c = getchar()) != EOF)
    18 {
    19 if(isalpha(c)) /*详情见文末*/
    20 {
    21 c = tolower(c); //大写转换为小写
    22 ++char_count[c-'a'];
    23 }
    24 }
    25
    26 max = 0; //初始化
    27
    28 /*找出出现频率最高的字母*/
    29 for(x = 0; x < 26; x++)
    30 {
    31 if(char_count[x] > max)
    32 {
    33 max = char_count[x];
    34 printf("max is %d", max);
    35 }
    36 }
    37
    38 /*打印直方图*/
    39 for(; max > 0; max--)
    40 {
    41 for(x = 0; x < 26; x++)
    42 {
    43 if(char_count[x] >= max)
    44 {
    45 putchar('x');
    46 }
    47 else
    48 putchar('');
    49 }
    50 putchar('\n');
    51 }
    52 /*打印下标,即abcdefghijklml....*/
    53 for(x = 0; x < 26; x++)
    54 {
    55 putchar('a'+x);
    56 }
    57 return 0;
    58
    59
    60 }

    本人不擅长写作,如有错误请指正!!

    代码最好自己敲一遍,别复制粘贴。

    ps:

    Have a nice day!!!
  • 相关阅读:
    Lambda表达式
    多态的实现原理
    泛型
    tomcat
    nginx
    列举cocoa touch 常用框架
    写出你对MVC模式的理解
    写一个委托的interface
    写一个“标准”宏MIN 这个宏输入两个参数并返回较小的一个
    简介Object-C的内存管理
  • 原文地址:https://www.cnblogs.com/fhefh/p/2226925.html
Copyright © 2020-2023  润新知