苦苦思索C编程语言练习1-13

时间:2014-06-02 03:39:41

标签: c

我正在努力的练习说"写一个程序来打印它输入的单词长度的直方图。" 到目前为止,这是我的代码:

#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栏中。我不知道我做错了什么。任何帮助或建议将不胜感激!

2 个答案:

答案 0 :(得分:4)

&#34;正常&#34;编写for循环的方法是:

for (k = 0; k < length[j]; k++)

您跳过初始化步骤,依赖于程序开头的i = j = k = 0设置。撇开大多数编译器会在此处抱怨(发出警告)关于未使用的值k的事实,更深层次的问题是这个循环是嵌套在另一个循环中。第一次迭代没问题,k0开始,然后按照它应该上升到length[0] - 1;但是在第二次迭代中,klength[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;
}