我正在努力的练习说"写一个程序来打印它输入的单词长度的直方图。" 到目前为止,这是我的代码:
#include <stdio.h>
#define IN 1
#define OUT 0
int main()
{
int length[15];
int i, j, k;
i = j = k = 0;
int count, c, state = OUT;
for(i; i<15; i++)
length[i] = 0;
while ((c = getchar()) != EOF)
{
if ((c == '\n' || c == ' ' || c == '\t') && (state == IN))
{
state = OUT;
if ((count > 0) && (count < 16))
length[count -1]++;
if (count >= 16)
length[14]++;
}
if ((c != '\n' && c != ' ' && c != '\t') && (state == OUT))
{
state = IN;
count = 0;
}
if (state == IN)
count++;
}
for(j; j<15; j++)
{
printf("length %d\t",j+1);
for(k; k<length[j]; k++)
printf("X");
printf("\n");
}
return 0;
}
当我使用类似的测试运行此代码时:
a bb ccc
^d
或:
aaa bb c
^d
它给了我一个直方图只有一个&#39; X&#39;在1栏中。我不知道我做错了什么。任何帮助或建议将不胜感激!
答案 0 :(得分:4)
&#34;正常&#34;编写for
循环的方法是:
for (k = 0; k < length[j]; k++)
您跳过初始化步骤,依赖于程序开头的i = j = k = 0
设置。撇开大多数编译器会在此处抱怨(发出警告)关于未使用的值k
的事实,更深层次的问题是这个循环是嵌套在另一个循环中。第一次迭代没问题,k
从0
开始,然后按照它应该上升到length[0] - 1
;但是在第二次迭代中,k
从length[0]
开始并上升到length[1] - 1
,这可能是一个较低的数字,因此缩短或跳过此行的栏。如果确实打印了,那么&#34; bar&#34; (如果你原谅双关语)将被设置得更高,所以每个连续的行将缩短前面行的最大长度。
答案 1 :(得分:1)
@Amadan已经指出了代码中的错误。
我将使用一些printf
语句向您展示您的代码,以帮助找出问题。
如果您对调试器不熟悉或不熟悉,我认为您需要熟悉一个调试器。
一个穷人的调试方法是在关键位置插入printf
语句,以了解代码是如何工作的。
#include <stdio.h>
#define IN 1
#define OUT 0
int main()
{
int length[15];
int i, j, k;
i = j = k = 0;
int count, c, state = OUT;
for(i; i<15; i++)
length[i] = 0;
while ((c = getchar()) != EOF)
{
printf("%c\n", c);
printf("Came here 1.\n");
if ((c == '\n' || c == ' ' || c == '\t') && (state == IN))
{
printf("Came here 2. Count= %d\n", count);
state = OUT;
if ((count > 0) && (count < 16))
length[count -1]++;
if (count >= 16)
length[14]++;
printf("length[%d] = %d\n", count-1, length[count-1]);
}
else if ((c != '\n' && c != ' ' && c != '\t') && (state == OUT))
{
printf("Came here 3.\n");
state = IN;
count = 1;
}
else if (state == IN)
{
printf("Came here 4.\n");
count++;
}
else
{
printf("Didn't expect here.\n");
}
}
for(j; j<15; j++)
{
printf("length %d\t",length[j]);
for(k; k<length[j]; k++)
printf("X");
printf("\n");
}
return 0;
}