【问题标题】:Character frequency histogram in CC中的字符频率直方图
【发布时间】:2013-05-29 07:31:25
【问题描述】:

我阅读了这个程序,但我无法理解它。请解释length[] arraay 中到底发生了什么。它如何用于存储不同类型的字符,即数字和字符。以下是代码:

#include <stdio.h>
#define EOL '\n'
#define ARYLEN 256
main()
{
    int c, i, x;
    int length[ARYLEN];
    for(x = 0; x < ARYLEN;x++)
        length[x] = 0;
    while( (c = getchar() ) != EOL)
     {
        length[c]++;
    if (c == EOL)
        break;
    }    
    for(x = 0; x < ARYLEN; x++)
    {
         if( length[x] > 0){
            printf("%c | ", x);
            for(i = 1; i <= length[x]; ++i){
                printf("*");
         }
         printf("\n");
         }
     }
}

【问题讨论】:

    标签: c character histogram


    【解决方案1】:

    该数组不存储任何字符(至少在概念上)。它存储程序在索引c的数组位置中遇到数值为c的字符的次数。

    基本上,在 C 编程语言中,char 是一种由 8 位组成的数据类型,对于 unsigned char 可以保存 0 到 255 范围内的值,对于 signed char 可以保存 -128 到 127 范围内的值.
    然后,程序定义一个足够大的数组来保存尽可能多的不同值,使用char 表示,每个唯一值对应一个数组位置。 然后它使用适当的数组位置length[c] 作为该特定值的计数器来计算出现次数。当它遍历数组以打印出数据时,它可以通过查看循环内的当前索引来判断数据属于哪个字符,因此printf("%c | ", x); 是字符,而length[x] 是我们要查找的数据.

    【讨论】:

      【解决方案2】:

      在您的代码中,整数数组length[] 不用于存储字符。它仅用于存储输入的每个字符的计数。字符被一一读入字符变量cwhile( (c = getchar() ) != EOL)

      但棘手的部分是length[c]++;。每个字符的计数保存在数组length[] 中与其ASCII value - 1 相等的位置。

      例如在使用ASCII 代码的系统中,length[64] 包含A 的计数,因为65ASCII 代码A

      length[65] 包含B 的计数,因为66ASCII-8 代码B

      length[96] 包含a 的计数,因为97ASCII 代码a

      length[47] 包含0 的计数,因为48ASCII 代码0

      【讨论】:

      • ASCII 以 127(十进制)结尾。不知道也没有必要知道正在使用哪个字符代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-11
      • 2016-09-17
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      • 2022-10-14
      相关资源
      最近更新 更多