Как создать вертикальную диаграмму количества слов в предложениях? - C (СИ)

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

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

Всем привет. Нужно создать диаграмму количества слов в предложениях на си. Пользователь вводит несколько предложений, а программа потом выводит диаграмму количества слов в предложениях. Помогите, пожалуйста, понять, как решить эту задачу? Не могу разобраться, как вывести на экран несколько разных по высоте столбиков подряд. Нашёл вот такую прогу, которая решает задачу, но не могу понять как всё-таки она выводит символы, чтобы получалась вертикальная диаграмма?
Листинг программы
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <conio.h>
  4. #define IN 1
  5. #define OUT 0
  6. int main()
  7. {
  8. setlocale(LC_ALL, "rus");
  9. int kod = 1;
  10. int i, k, c, nw, state;
  11. int diagramma[20], np, maxw;
  12.  
  13. do {
  14. state = OUT;
  15. nw = 0; // кол-во слов
  16. np = 0; // кол-во предл.
  17. maxw = 0; // максимальное кол-во слов
  18. for (i = 0; i<20; i++)
  19. diagramma[i] = 0;
  20. printf("Напишите предложения, обязательно оканчивающиеся на знаки: '.' '!' '?' (Окончите комбинацией клавиш Ctrl+Z)\n");
  21. while ((c = getchar()) != EOF)
  22. {
  23. if (c == '.' || c == '...' || c == '!' || c == '?')
  24. np++;
  25. if (c == ' ' || c == '\n' || c == '\t')
  26. {
  27. state = OUT;
  28. }
  29. else if (state == OUT)
  30. {
  31. state = IN;
  32. diagramma[np]++;
  33. if (diagramma[np] > maxw)
  34. maxw = diagramma[np];
  35. nw++; // слова
  36. }
  37. }
  38. if (np == 0) np = 1;
  39. i = 0;
  40. printf("\nДиаграмма количества слов в предложениях:\n");
  41. for (i = maxw; i>0; i--) // строки
  42. {
  43. for (k = 0; k <= np; k++) // колво предложений
  44. {
  45. if (diagramma[k] == i)
  46. {
  47. printf(" *", diagramma[k]);
  48. diagramma[k]--;
  49. }
  50. else { printf(" "); }
  51. }
  52. printf("\n");
  53. }
  54. printf("Хочешь еще? 0 - да, 1 - нет \n");
  55. scanf("%d", &kod);
  56. } while (kod == 0);
  57. return 0;
  58. }
В этой проге не понимаю, например, что такое state, что такое diagramma и ещё кое-что. Объясните, пожалуйста, кому не сложно. Спасибо.

Решение задачи: «Как создать вертикальную диаграмму количества слов в предложениях?»

textual
Листинг программы
  1. #include <stdio.h>
  2. /*программа печатающая вертикальную гистограмму вводимых символов в словах*/
  3. #define IN 1 /*внутри слова*/
  4. #define OUT 0/*вне слова*/
  5. #define MAXWORDS 80 /*максимальное количество слов в нашей гистограмме 80*/
  6.  
  7. int main()
  8. {
  9. int i, j, c, state; /*i-индекс массива слов, j-количество символов в слове, с - вводимый символ,
  10.                       state - состояние переменной с ( IN - внутри слова, OUT - вне слова) */
  11. int lenword [MAXWORDS], nextword, maxlen;/*счетчик массива слов,следующее слово,самое
  12.                                            длинное слово*/
  13. nextword = maxlen = 0;
  14. for (i = 0; i < MAXWORDS; ++i)/*инициализируем цикл*/
  15.     lenword [i] = 0;
  16. state = OUT;
  17.  
  18. while ((c = getchar())!= EOF && nextword < MAXWORDS) {
  19.     if ( c == ' ' || c == '\n' || c == '\t'){    /*1.если сначала вводится символ-разделитель,то */
  20.         if (state == IN){                        /*программа ничего не делает,т.к. не выполняется*/
  21.             if (lenword [nextword] > maxlen)     /*условие state == IN;( у нас state == OUT)*/
  22.                     maxlen = lenword [nextword]; /*2.если вводится любой другой символ,программа */
  23.         ++nextword; state = OUT; }               /*переходит к else, state становится IN и включа*/
  24.     }                                            /*ется счетчик lenword [0],т.е. счетчик первого */
  25.     else {                                       /*слова массива*/
  26.         if (state == OUT)                        /*3.при появлении на вводе символа-разделителя */
  27.             state = IN;                          /*(условие state == IN на этот раз выполнено) */
  28.             ++lenword [nextword];                /*проверяется условие lenword [0] > maxlen, оно */
  29.             }    /*истинно и тогда maxlen = lenword [0]. 4.переменная nextword увеличивается на 1 */
  30.           }      /* т.е. счетчик символов приобретает индекс 1-lenword[1],state присваивается OUT */
  31. for (j = maxlen; j > 0; --j){    /* Печатание гистограммы. 1.Переменной j присваисается значение */
  32.     for(i = 0; i < nextword; ++i){ /*самого длинного слова из введенных,т.е. maxlen,это будет */
  33.         if (lenword[i] >= j)       /*высота нашей гистограммы. 2. Цикл внутри цикла for печатает */
  34.             putchar('#');          /*строку начиная со счетчика первого слова lenword[0], если */
  35.         else                       /*это не самое длинное слово то печатается пробел,цикл перехо-*/
  36.                 putchar(' ');      /*дит к следующему слову (++i) и каретка смещается на одно поле*/
  37.                 }                  /*вправо.Когда цикл доходит до самого длинного слова,то печа-*/
  38.      putchar('\n') ;               /*тает #. 3.Когда "внутренний" цикл доходит до последнего слова*/
  39. }                                  /*условие i < nextword перестает выполняться и цикл завершает */
  40.                                    /*свою работу и программа переходит к функции putchar('\n'),*/
  41.         return 0;                  /*т.е. каретка принтера переходит на новую строку. 4.выполня- */
  42. }                                  /*ется --j и запускается следующий цикл "наружного" цикла for. */
  43.                                    /*5. когда j дойдет до нуля,условие j>0 перестанет выполняться */
  44.                                    /* и цикл прекратит работу.   Программа завершена.  */

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

Вертикальная диаграмма количества слов в предложениях создается с помощью следующего кода:

  1. Объявляются переменные:
    • i, j, c, state - для выполнения задач текущего цикла;
    • nextword, maxlen - для отслеживания текущего слова и его длины;
    • lenword[MAXWORDS] - для хранения длины каждого слова.
  2. Инициализируются переменные:
    • nextword устанавливается в 0;
    • maxlen устанавливается в 0;
    • все элементы массива lenword устанавливаются в 0.
  3. В цикле while происходит обработка вводимых символов:
    • Если вводится символ-разделитель (пробел, табуляция или перевод строки), то проверяется состояние переменной state. Если оно равно IN, то проверяется, является ли текущая длина слова (lenword[nextword]) максимальной. Если да, то значение переменной maxlen обновляется. Затем nextword увеличивается на 1, а state меняется на OUT.
    • Если вводится любой другой символ, то переменная state меняется на OUT.
    • Если вводится символ-разделитель и state равно OUT, то переменная state меняется на IN.
    • Если вводится любой другой символ и state равно OUT, то длина текущего слова (lenword[nextword]) увеличивается на 1.
  4. В цикле for происходит печать гистограммы:
    • Переменная j инициализируется значением maxlen.
    • В цикле for, который выполняется от 0 до nextword, происходит печать символов:
      • Если длина текущего слова (lenword[i]) больше или равна j, то печатается символ '#'.
      • В противном случае, печатается пробел.
    • После завершения внутреннего цикла, печатается символ '\n'.
  5. После завершения циклов, возвращается 0, что означает успешное выполнение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

6   голосов , оценка 3.833 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы