Интуитивно понятный подход к упражнению с массивом из «Книги».[Ex1-13] - PullRequest
0 голосов
/ 25 июня 2019

Я хочу создать символическую гистограмму из ввода пользователя, детализирующего количество слов его абзаца:

Я пытаюсь найти len каждого слова и записать его в массив (++ для каждого слова, состоящего из 1-3 букв, 3-5 и т. Д.), А затем распечатать их.

/* Write a program to print a histogram of the lengths of words in its input. It is easy to draw the histrogram with bars, horizontal; a vertical oreientation is more challenging */
#include <stdio.h>
int main()
{
    int wordCountHistogram[5];
    int len = -1;
    char c;
    while ((c = getchar()) != EOF) {
        ++len;
        if (c == '\t' || c == '\n' || c == ' '){
            if (0 <= len <= 3)
                ++wordCountHistogram[0];

            if (4 <= len <= 6)
                ++wordCountHistogram[1];

            if (7 <= len <= 8)
                ++wordCountHistogram[2];

            if (9 <= len <= 13)
                ++wordCountHistogram[3];

            if (len > 14)
                ++wordCountHistogram[4];

            /*if (12 <= len <= 14)
                wordCountHistogram[5]++;

            if (14 <= len < 15)
                wordCountHistogram[6]++;

            if (16 <= len < 17)
                wordCountHistogram[7]++;

            if (17 <= len < 18)
                wordCountHistogram[8]++;

            if (19 <= len < 9999)
                wordCountHistogram[9]++;
        */
            printf("%d", len);
            len = -1;
    }
}

    for(int i = 0; i < 5 ;i++){
        printf("%d \n",wordCountHistogram[i]);
        for(int n = wordCountHistogram[i];n >= 0;n--){//Histogram sizeof(array) / sizeof(array[0]))
            printf("+");}
        printf("\n");
    }

}

Я знаю, что "символические" длины записываются в соответствии с распечаткой, которую я знаю, я хочу записать каждый len, записанный в его соответствующую часть массива (увеличьте значение индекса массива на 1], а затем распечатайте гистограмму из таких данных. Я получаю довольно странную ошибку, и это приводит к тому, что гистограмма распечатывается неправильно.

Я знаю, что есть некоторые странные проблемы с функцией печати, но суть проблемы заключается в назначении wordCountHistogram.

Ответы [ 3 ]

3 голосов
/ 25 июня 2019

Несколько вещей:

  1. Вам нужно инициализировать массив гистограмм в 0:
    int wordCountHistogram[5] = {0};
  2. Выражения типа 0 <= len <= 3 не работают так, как вы ожидаете - вам нужно использовать 0 <= len && len <= 3
  3. Вы можете использовать функцию isspace (объявленную в ctype.h), чтобы проверить, является ли символ пробелом:
    if ( isspace( c ) )
    {
      // update histogram
    }
    
  4. Вероятно, неплохо бы абстрагировать операцию биннинга в отдельную функцию, например так:
    int bin( int len )
    {
      if ( 0 <= len && len <= 3 )
        return 0;
      if ( 4 <= len && len <= 6 )
        return 1;
      if ( 7 <= len && len <= 8 )
        return 2;
      ...
    }
    int main( void )
    {
      ...
      if ( isspace( c ) )
        ++wordCountHistogram[ bin( len ) ];
      ...
    }
    
    
    Примечание - c должен быть объявлен как int, а не char - getchar() возвращает int. Вы захотите добавить некоторые проверки работоспособности, чтобы убедиться, что bin не возвращает значение вне диапазона для вашего массива.
1 голос
/ 25 июня 2019

Вы не инициализируете свой массив, что оставляет вас в предположении, что вы собираетесь заполнить его значениями. Это может привести к тому, что массив будет содержать мусор, когда вы нажимаете Ctrl + D, чтобы распечатать знаки «+». Я рекомендую определить это, когда вы объявите это:

int wordCountHistogram[5] = {0};

Я внес это изменение вместе с изменением ваших оценок:

if ((0 <= len) && (len  <= 3))

И ваша программа дала мне гистограмму.

0 голосов
/ 25 июня 2019
/* Write a program to print a histogram of the lengths of words in its input. It is easy to draw the histrogram with bars, horizontal; a vertical oreientation is more challenging */
#include <stdio.h>
int main()
{
    int wordCountHistogram[5] = {};
    int len = -1;
    char c;
    while ((c = getchar()) != EOF) {
        ++len;
        if (c == '\t' || c == '\n' || c == ' '){
            if ((0 <= len) && (len  <= 3))
                ++wordCountHistogram[0];

            if ((4 <= len) && (len  <= 6))
                ++wordCountHistogram[1];

            if ((6 <= len) && (len  <= 8))
                ++wordCountHistogram[2];

            if ((9 <= len) && (len  <= 13))

                ++wordCountHistogram[3];

            if (len > 14)
                ++wordCountHistogram[4];

            /*if (12 <= len <= 14)
                wordCountHistogram[5]++;

            if (14 <= len < 15)
                wordCountHistogram[6]++;

            if (16 <= len < 17)
                wordCountHistogram[7]++;

            if (17 <= len < 18)
                wordCountHistogram[8]++;

            if (19 <= len < 9999)
                wordCountHistogram[9]++;
        */
            printf("%d", len);
            len = -1;
    }
}

    for(int i = 0; i < 5 ;i++){
        //printf("%d \n",wordCountHistogram[i]);

        for(int n = wordCountHistogram[i];n >= 0;n--){//Histogram sizeof(array) / sizeof(array[0]))
                    printf("+");}
        printf("\n");
    }

}

Спасибо - Урок усвоен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...