Гистограмма длины слова упражнения подсказка? - PullRequest
2 голосов
/ 30 апреля 2011

Я изучаю C с помощью книги «Язык программирования 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 ]

2 голосов
/ 30 апреля 2011

(потому что ОП запрашивает подсказки, а не решение)

Итак ... что равно i после этого цикла?

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

А где ты будешь его использовать дальше?

1 голос
/ 15 августа 2011
for (i = 0; i < 20; ++i)     
    lengthn[i] = 0;

Значение i после этого цикла будет i=20

, поэтому вы должны инициализировать i перед циклом while

0 голосов
/ 26 декабря 2016

Я написал код для вертикальной ориентации. Я новичок в 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;
}
...