我正在尝试打印垂直直方图,该直方图计算用户输入的每个数字的频率。 我首先按如下方式存储频率:
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
}
问题是当我尝试打印直方图时,我得到一个空白屏幕。我用水平直方图对它进行了测试,它可以工作。
答案 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');
}
}
你做的当然取决于你,我个人认为这更加一致。