字符频率直方图



我读了这个程序,但是我不能理解它。请解释length[]阵列到底发生了什么。如何使用它来存储不同类型的字符,即两个数字&识字课。代码如下:

#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的数组位置遇到数值为c的字符的次数。

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

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

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

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

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

length[96]包含a的计数,因为97aASCII码。

length[47]包含0的计数,因为480ASCII码。

最新更新