Вывести гистограммы длин вводимых слов - C (СИ)
Формулировка задачи:
Собственно задание:
Мутительное начало для меня. Помогите разобраться. Вылетает в segmentation fault.
Упражнение 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("#");
}
}
}Решение задачи: «Вывести гистограммы длин вводимых слов»
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;
}
Объяснение кода листинга программы
- Ввод данных: считывание одной строки, используя функцию getchar(). Эта функция считывает один символ за раз, и она будет вызывать до тех пор, пока не встретит символ новой строки (\n).
- Переменная
word_leangthинициализируется как 0. Она используется для отслеживания длины текущего слова. - Переменная
cиспользуется для хранения каждого считанного символа. - Переменная
iиспользуется в цикле for. - Если считанный символ не пробел, то увеличивается значение
word_leangth. - Если считанный символ - пробел, то выполняется следующий блок кода:
a. Цикл for выполняется, пока значение
word_leangthбольше 0. b. Для каждой итерации цикла выводится горизонтальная линия из палочек, используя функцию printf(). c. Значениеword_leangthсбрасывается обратно в 0 после вывода горизонтальной линии. - После окончания цикла while выводится горизонтальная линия из палочек для последнего слова, используя цикл for.
- Выводится сообщение
Press any key to exit, чтобы пользователь мог выйти из программы, нажав любую клавишу. - Функция getch() используется для ожидания нажатия клавиши.
- Программа возвращает 0, что означает успешное завершение.