Вывести гистограммы длин вводимых слов - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Собственно задание:

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

#include <stdio.h>
#include <ctype.h>
#define IN 1
#define OUT 0
main ()
{
    int c, i, length, state, max, l;
    int wordl[15];
    state = OUT;
    l = 0;
    max = 0;
    for (i = 0; i < 15; ++i)
        wordl[i] = 0;
    while ((c=getchar()) != EOF)
        if (isalpha(c)){
            ++length;
            state = IN;
        }
        else if (state = IN) {
            state = OUT;
            ++wordl[length];
            if (max < length)
                max = length;
        }
    for (i = 0; i < max; ++i)
        printf("%4d", i);
    for (i = 0; i < 15; ++i) {
        printf ("%d", i);
        while (l <= wordl[i]*4) {
            ++l;
            printf("#");
        }
        }
}
Мутительное начало для меня. Помогите разобраться. Вылетает в segmentation fault.

Решение задачи: «Вывести гистограммы длин вводимых слов»

textual
Листинг программы
#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;
}

Объяснение кода листинга программы

  1. Ввод данных: считывание одной строки, используя функцию getchar(). Эта функция считывает один символ за раз, и она будет вызывать до тех пор, пока не встретит символ новой строки (\n).
  2. Переменная word_leangth инициализируется как 0. Она используется для отслеживания длины текущего слова.
  3. Переменная c используется для хранения каждого считанного символа.
  4. Переменная i используется в цикле for.
  5. Если считанный символ не пробел, то увеличивается значение word_leangth.
  6. Если считанный символ - пробел, то выполняется следующий блок кода: a. Цикл for выполняется, пока значение word_leangth больше 0. b. Для каждой итерации цикла выводится горизонтальная линия из палочек, используя функцию printf(). c. Значение word_leangth сбрасывается обратно в 0 после вывода горизонтальной линии.
  7. После окончания цикла while выводится горизонтальная линия из палочек для последнего слова, используя цикл for.
  8. Выводится сообщение Press any key to exit, чтобы пользователь мог выйти из программы, нажав любую клавишу.
  9. Функция getch() используется для ожидания нажатия клавиши.
  10. Программа возвращает 0, что означает успешное завершение.

Оцени полезность:

15   голосов , оценка 4.267 из 5
Похожие ответы