@Redproxima
Студент технического ВВУЗ'а

Керниган, Ритчи: Упражнение 1.13, Я что-то не так понял?

Добрый день!
Без воды и пыли сразу к сути:
Брайан Керниган и Деннис Ритчи, второе издание, параграф 1.6 (Массивы), в конце два упражнения, по одному из них, собственно, вопрос:

Упражнение 1.13. Напишите программу, печатающую гистограммы длин вводимых слов. Гистограмму легко рисовать горизонтальными полосами. Рисование вертикальными полосами — более трудная задача.

Взялся без раскачки и через минуту в голове сформулировал алгоритм: Читаем символ и если он проблел\табуляция\новая_строка, то переносим курсор на новую строку, в противном случае печатаем символ.
#include <stdio.h>

int main()
{
    int c;

    while ((c = getchar()) != EOF)
    {

        if(c == ' ' || c == '\t' || c == '\n')
        {
            putchar('\n');
            
            while ((c = getchar()) == ' ' || (c = getchar()) == '\t' || (c = getchar()) == '\n')
            {
                putchar('\r');  //Для тех случаев, когда стоит нескоько пробелов, табуляций или новых строк подряд
                                //(Чтобы гиаграммма не росла вериткально, короче говоря, и была без разрывов)
            }
        }
        putchar('-');
     }
}

5c602663834e3748967543.png
Проверил - работает, горизонтальную диаграму строит. Собственно: ???
Тут либо задание специально с подвохом, чтобы его решали применяя массивы и кучу ветвлящихся условий, либо я чертов гений (что точно не правда, я проверял). Полез в Google и нашел следующие решения, от которых, мягко говоря, вопросы задаются сами собой (на подобие: зачем так громоздко и не логично?)
Вот пример:
#include <stdio.h>
#include <conio.h>
 
int main()
{
    int word_leangth = 0;
    char c;
    int i;
 
    while((c = getchar()) != '\n')                 //читаем одну строку
    {
        if (c != ' ')                              //если символ не пробел
            word_leangth++;          //+1 буковка в слове
        else                                      //а вот если он пробел
        {
            for(i = 0; i < word_leangth; i++)    //печатаем длину слова палочками горизонтальными
                printf("_"); 
            printf("\n");          //переходим на след. строку
            word_leangth = 0; 
        }
    }
 
    for(i = 0; i < word_leangth; i++) //печатаем длину посл. слова
        printf("_");                  //просто оно не заканчивается пробелом, а зак. знаком конца строки
 
    printf("\nPress any kay to exit\n");
    getch();                            //это просто чтобы спокойно посмотреть результат и выйти по нажатию любой кнопки
 
    return 0;
}


Или даже такое:
#include <stdio.h>
 
#define invischar 0 // непечатаемый символ
#define vischar 1   // печатаемый символ
#define maxwords 10 // количество слов ограничим десятью
 
int main(){
 
    int i, biggest = 0, num = 0, prevch = vischar; // индексы, счетчики, флажки
    int ch;        // текущий символ
    int nword[maxwords]; // массив с кол-вом эл-тов maxwords
 
    for(i = 0; i < maxwords; ++i) // инициализация массива
        nword[i] = 0;       
    i = 0;                 
 
    while((ch = getchar()) != EOF){ // начало заполнения массива
        if(ch == '\t' || ch == ' ' || ch == '\n')
            prevch = invischar;
        else{
            if (nword[i] > 0 && prevch == invischar){ // пропустим первые непечатаемые
                ++i; // переход к следующему элементу
                ++num; // счетчик числа непустых элементов
            }
            prevch = vischar;
            ++nword[i];
            if(nword[i] > biggest)
                biggest = nword[i]; // наибольший элемент(ы) массива
        }
    } //конец заполнения массива
 
    printf("%s\n", "Words length histogramm");
    while(biggest > 0){
        for(i = 0; i <= num; ++i)
            if(nword[i] >= biggest)
                putchar('I');
            else
                putchar(' ');
        putchar('\n');
        --biggest;
    }
    return(0);
}


Я не правильно понял задание? Может, задача состоит в том, чтобы натренировать применение массивов? Просто как по мне - чем короче, читаемей и проще код, тем лучше. Я ни в коем случае не хочу разводить холиваров по поводу красивых\практичных кодов, вопрос в другом: я в том направлении двигаюсь?
Как бы вы решили данную задачу, что применили бы и самое главное - почему так или иначе? Можно без приведения примеров кода, самое главное - объяснть суть.
Я буду рад любым ответам и советам. Заранее спасибо всем откликнувшимся, я очень признателен.
  • Вопрос задан
  • 1446 просмотров
Пригласить эксперта
Ответы на вопрос 1
Гистограмма длин показывает распределение количества встретившихся слов от их длины, т.е. вам нужно нарисовать n полосок (от 1 до n где n максимальная длина слова), в каждой полоске должно быть количество делений пропорциональное количеству слов данной длины. Т.е. если слов из 6 символов вдвое больше чем слов из 8, то полоска для 6-символьных слов должна быть вдвое длинней.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы