Как создать вертикальную диаграмму количества слов в предложениях? - C (СИ)
Формулировка задачи:
Всем привет. Нужно создать диаграмму количества слов в предложениях на си. Пользователь вводит несколько предложений, а программа потом выводит диаграмму количества слов в предложениях.
Помогите, пожалуйста, понять, как решить эту задачу? Не могу разобраться, как вывести на экран несколько разных по высоте столбиков подряд.
Нашёл вот такую прогу, которая решает задачу, но не могу понять как всё-таки она выводит символы, чтобы получалась вертикальная диаграмма?
В этой проге не понимаю, например, что такое state, что такое diagramma и ещё кое-что. Объясните, пожалуйста, кому не сложно.
Спасибо.
#include <iostream> #include <stdio.h> #include <conio.h> #define IN 1 #define OUT 0 int main() { setlocale(LC_ALL, "rus"); int kod = 1; int i, k, c, nw, state; int diagramma[20], np, maxw; do { state = OUT; nw = 0; // кол-во слов np = 0; // кол-во предл. maxw = 0; // максимальное кол-во слов for (i = 0; i<20; i++) diagramma[i] = 0; printf("Напишите предложения, обязательно оканчивающиеся на знаки: '.' '!' '?' (Окончите комбинацией клавиш Ctrl+Z)\n"); while ((c = getchar()) != EOF) { if (c == '.' || c == '...' || c == '!' || c == '?') np++; if (c == ' ' || c == '\n' || c == '\t') { state = OUT; } else if (state == OUT) { state = IN; diagramma[np]++; if (diagramma[np] > maxw) maxw = diagramma[np]; nw++; // слова } } if (np == 0) np = 1; i = 0; printf("\nДиаграмма количества слов в предложениях:\n"); for (i = maxw; i>0; i--) // строки { for (k = 0; k <= np; k++) // колво предложений { if (diagramma[k] == i) { printf(" *", diagramma[k]); diagramma[k]--; } else { printf(" "); } } printf("\n"); } printf("Хочешь еще? 0 - да, 1 - нет \n"); scanf("%d", &kod); } while (kod == 0); return 0; }
Решение задачи: «Как создать вертикальную диаграмму количества слов в предложениях?»
textual
Листинг программы
#include <stdio.h> /*программа печатающая вертикальную гистограмму вводимых символов в словах*/ #define IN 1 /*внутри слова*/ #define OUT 0/*вне слова*/ #define MAXWORDS 80 /*максимальное количество слов в нашей гистограмме 80*/ int main() { int i, j, c, state; /*i-индекс массива слов, j-количество символов в слове, с - вводимый символ, state - состояние переменной с ( IN - внутри слова, OUT - вне слова) */ int lenword [MAXWORDS], nextword, maxlen;/*счетчик массива слов,следующее слово,самое длинное слово*/ nextword = maxlen = 0; for (i = 0; i < MAXWORDS; ++i)/*инициализируем цикл*/ lenword [i] = 0; state = OUT; while ((c = getchar())!= EOF && nextword < MAXWORDS) { if ( c == ' ' || c == '\n' || c == '\t'){ /*1.если сначала вводится символ-разделитель,то */ if (state == IN){ /*программа ничего не делает,т.к. не выполняется*/ if (lenword [nextword] > maxlen) /*условие state == IN;( у нас state == OUT)*/ maxlen = lenword [nextword]; /*2.если вводится любой другой символ,программа */ ++nextword; state = OUT; } /*переходит к else, state становится IN и включа*/ } /*ется счетчик lenword [0],т.е. счетчик первого */ else { /*слова массива*/ if (state == OUT) /*3.при появлении на вводе символа-разделителя */ state = IN; /*(условие state == IN на этот раз выполнено) */ ++lenword [nextword]; /*проверяется условие lenword [0] > maxlen, оно */ } /*истинно и тогда maxlen = lenword [0]. 4.переменная nextword увеличивается на 1 */ } /* т.е. счетчик символов приобретает индекс 1-lenword[1],state присваивается OUT */ for (j = maxlen; j > 0; --j){ /* Печатание гистограммы. 1.Переменной j присваисается значение */ for(i = 0; i < nextword; ++i){ /*самого длинного слова из введенных,т.е. maxlen,это будет */ if (lenword[i] >= j) /*высота нашей гистограммы. 2. Цикл внутри цикла for печатает */ putchar('#'); /*строку начиная со счетчика первого слова lenword[0], если */ else /*это не самое длинное слово то печатается пробел,цикл перехо-*/ putchar(' '); /*дит к следующему слову (++i) и каретка смещается на одно поле*/ } /*вправо.Когда цикл доходит до самого длинного слова,то печа-*/ putchar('\n') ; /*тает #. 3.Когда "внутренний" цикл доходит до последнего слова*/ } /*условие i < nextword перестает выполняться и цикл завершает */ /*свою работу и программа переходит к функции putchar('\n'),*/ return 0; /*т.е. каретка принтера переходит на новую строку. 4.выполня- */ } /*ется --j и запускается следующий цикл "наружного" цикла for. */ /*5. когда j дойдет до нуля,условие j>0 перестанет выполняться */ /* и цикл прекратит работу. Программа завершена. */
Объяснение кода листинга программы
Вертикальная диаграмма количества слов в предложениях создается с помощью следующего кода:
- Объявляются переменные:
- i, j, c, state - для выполнения задач текущего цикла;
- nextword, maxlen - для отслеживания текущего слова и его длины;
- lenword[MAXWORDS] - для хранения длины каждого слова.
- Инициализируются переменные:
- nextword устанавливается в 0;
- maxlen устанавливается в 0;
- все элементы массива lenword устанавливаются в 0.
- В цикле while происходит обработка вводимых символов:
- Если вводится символ-разделитель (пробел, табуляция или перевод строки), то проверяется состояние переменной state. Если оно равно IN, то проверяется, является ли текущая длина слова (lenword[nextword]) максимальной. Если да, то значение переменной maxlen обновляется. Затем nextword увеличивается на 1, а state меняется на OUT.
- Если вводится любой другой символ, то переменная state меняется на OUT.
- Если вводится символ-разделитель и state равно OUT, то переменная state меняется на IN.
- Если вводится любой другой символ и state равно OUT, то длина текущего слова (lenword[nextword]) увеличивается на 1.
- В цикле for происходит печать гистограммы:
- Переменная j инициализируется значением maxlen.
- В цикле for, который выполняется от 0 до nextword, происходит печать символов:
- Если длина текущего слова (lenword[i]) больше или равна j, то печатается символ '#'.
- В противном случае, печатается пробел.
- После завершения внутреннего цикла, печатается символ '\n'.
- После завершения циклов, возвращается 0, что означает успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д