Добрый день!
Без воды и пыли сразу к сути:
Брайан Керниган и Деннис Ритчи, второе издание, параграф 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('-');
}
}
Проверил - работает, горизонтальную диаграму строит. Собственно: ???
Тут либо задание специально с подвохом, чтобы его решали применяя массивы и кучу ветвлящихся условий, либо я чертов гений (что точно не правда, я проверял). Полез в 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);
}
Я не правильно понял задание? Может, задача состоит в том, чтобы натренировать применение массивов? Просто как по мне - чем короче, читаемей и проще код, тем лучше. Я ни в коем случае не хочу разводить холиваров по поводу красивых\практичных кодов, вопрос в другом: я в том направлении двигаюсь?
Как бы вы решили данную задачу, что применили бы и самое главное - почему так или иначе? Можно без приведения примеров кода, самое главное - объяснть суть.
Я буду рад любым ответам и советам. Заранее спасибо всем откликнувшимся, я очень признателен.