词汇长度的直方图提示?

时间:2011-04-30 16:34:48

标签: c kernighan-and-ritchie

我正在使用“The C Programming Language”一书学习C语,我正在尝试解决练习1.13:

“编写一个程序,在其输入中打印单词长度的直方图。很容易 绘制直方图,条形水平;垂直方向更具挑战性。“

我编写了代码,但是当我按下CTRL + Z(文件结束)时,它会显示全部为零而不是单词的长度。

有人能给我一个关于我出错的地方的暗示吗?

#include <stdio.h>

/* print a histogram of the length of words from input */
main()
{
    int c, i, wordn, space;
    int lengthn[20];

    wordn = space = 0;
    for (i = 0; i < 20; ++i)
        lengthn[i] = 0;

    while ((c = getchar()) != EOF) {
        if (c == ' ' || c == '\t' || c == '\n')
            if (space == 1) {
                ++wordn;
                space = 0;
                ++i;
            }
        if (c != ' ' && c != '\t' && c != '\n') {
            ++lengthn[i];
            space = 1;
        }
    }
    printf("Length: ");
    for (i = 0; i < 16; ++i)
        printf("%d   ", lengthn[i]);
    printf("\n        --------------------------------------------------------------\n");
    printf("Word:   1   2   3   4   5   6   7   8   9   10   11   12   13   14   15\n");
}

3 个答案:

答案 0 :(得分:2)

(因为OP要求提示,而不是解决方案)

那么......这个循环之后i等于什么?

for (i = 0; i < 20; ++i)
    lengthn[i] = 0;

接下来你在哪里使用它?

答案 1 :(得分:1)

for (i = 0; i < 20; ++i)     
    lengthn[i] = 0;

此循环后i的值为i=20

所以你必须在while循环

之前初始化i

答案 2 :(得分:0)

我为垂直方向编写了一个代码。 我是C的新手,所以可能代码不好。

#include <stdio.h>
#include <conio.h>

#define MAX_WORDS 100
#define IN 1
#define OUT 0

int maxlength(int length[], char num_of_word);

int main()
{
    char c,i,j,state,num_of_word;
    int length[MAX_WORDS];
    /*initialize length[]*/
        for(i=0;i<MAX_WORDS;i++){
        length[i]=0;
        }
    /* find the length of each word */
    num_of_word=0;
    while(num_of_word<MAX_WORDS && (c = getchar()) != EOF && c != 'a'){
        if(c != ' ' && c!= '\t' && c!= '\n'){
            state = IN;
            length[num_of_word]++;
        }else{
            if(state != OUT){
                state = OUT;
                num_of_word++;
            }
        }
    }
    /*   draw histogram            */
    for(i= maxlength(length[],num_of_word);i>0;i--){
        for(j=0;j<num_of_word;j++){
            if(length[j]<i){
                printf(" ");
            }else{
                printf("|");
            }
        }
        printf("\n");
    }
    /* print name of each column*/
    for(i=0;i<num_of_word;i++){
        printf("%d",i+1);
    }

    _getch();
    return(0);
}
/*sub-function that find the longest word */
int maxlength(int length[], char num_of_word){
    int i, max;
    max = length[0];
    for(i=1;i<num_of_word;i++){
        if(max<length[i]){
            max = length[i];
        }
    }
    return max;
}