打印垂直直方图

时间:2018-05-25 13:29:45

标签: c arrays histogram

我正在尝试打印垂直直方图,该直方图计算用户输入的每个数字的频率。 我首先按如下方式存储频率:

 int a[10];  //array
 int c;      //store input from getchar
 int i;      //loop variable

 for(i=0;i<10;i++)
 {

    a[i]=0;   //initialize to 0
 }
 while((c=getchar())!=EOF)  //read character
 {
    ++a[c-'0'];
 }

接下来,我尝试绘制垂直直方图。

for(i=10;i>0;i--)  //asssumed max limit of frequency is 10
{
  int j;          //iterate through the array
  for(j=0;j<10;j++)
{
 if(a[j]==i)     //if frequency of any element in array matches i 
 {
  printf("* \t");
  --a[j];       //decrement array element frequency value
 }
 else
 printf(" \t");  //no action
 }
 printf("\n");   //next line
}

问题是当我尝试打印直方图时,我得到一个空白屏幕。我用水平直方图对它进行了测试,它可以工作。

1 个答案:

答案 0 :(得分:0)

准确地使用您的代码,将其格式化以便于阅读,并添加一项检查以确保仅使用数字来避免进一步破坏,它可以正常工作。检查对于功能来说不是必需的,但是避免写出数组的边界是个好主意。

#include <stdio.h>
#include <ctype.h>

int main() {
    int a[10];  //array
    int c;      //store input from getchar
    int i;      //loop variable

    for(i=0;i<10;i++)
    {
        a[i]=0;   //initialize to 0
    }
    while((c=getchar())!=EOF)  //read character
    {
        if (isdigit(c))
            ++a[c - '0'];
    }

    for(i=10;i>0;i--)  //asssumed max limit of frequency is 10
    {
        int j;          //iterate through the array
        for(j=0;j<10;j++)
        {
            if(a[j]==i)     //if frequency of any element in array matches i 
            {
                printf("* \t");
                --a[j];       //decrement array element frequency value
            }
            else
                printf(" \t");  //no action
        }
        printf("\n");   //next line
    }
}

结果:

$ ./a
0123456789666338592






                                                *
                        *                       *
                *       *               *       *               *       *
*       *       *       *       *       *       *       *       *       *

作为参考,这是为Cygwin编译的。 我还通过几种方式修改了您的源代码,以符合我遵循的一些做法:

#include <stdio.h>
#include <ctype.h>

int main()
{
    int a[10] = {0}; // While use a for to initialize to 0 when you can do it easily?
    int i;
    char c;

    while((c = getchar()) != EOF)
    {
        if (isdigit(c))    // Never trust the user
            a[c - '0']++;  // Changed for readability, make it clear that we are incrementing the value, not the pointer.
    }

    for(i = 10; i > 0; --i)
    {
        int j;
        for(j = 0; j < 10; ++j)
        {
            // Made flow a little clearer
            if(a[j] >= i)
                putchar('*');
            else
                putchar(' ');
            putchar('\t');
        }
        putchar('\n');
    }
}

你做的当然取决于你,我个人认为这更加一致。