Нужно подсчитать частоту с которой в вводимом тексте встречаются цифры (0-9) и нарисовать вертикальную гистограмму.
Потом то-же самое сделать с буквами.
Пока сделал только цифры, поругайте код пожалуйста.
#include <stdio.h>
main() /*подсчет числа появлений каждой цифры и
построение гистограммы*/
{
int c, i, n, max, s;
int ndigit[10];
char nstars[1000];
/* обнуляем массив */
for (i = 0; i < 10; ++i)
ndigit[i] = 0;
/* заполняем массив ndigit[10] */
while ((c = getchar()) != EOF)
if (c >= '0' && c <= '9')
++ndigit[c-'0'];
/* выводим его содержимое */
printf("\nгистограмма\n");
for (i = 0; i < 10; ++i)
printf(" %d", ndigit[i]);
printf("\n");
/* ищем максимум max в массиве digit[10]*/
max = ndigit[0];
for (i = 1; i <= 9; ++i)
if ((max -ndigit[i]) <= 0)
max = ndigit[i];
/* вычисляем длинну массива со звездочками n */
n = max * 10;
/* заполняем массив со звездочками nstars[s] */
s = 0;
while (s < n)
for (i = 9; i >= 0; --i){
if (ndigit[i] != 0){
nstars[s] = '*';
--ndigit[i];
}
else nstars[s] = ' ';
++s;
}
/* выводим его содержимое кусками по 10
с переводом строки после каждого десятка*/
i = 1;
for (s = (n - 1); s > 0; --s){
if (i != 10){
printf(" %c", nstars[s]);
++i;
}
else {
i = 1;
printf("\n");
}
}
/* выводим цифры от 0 до 9 внизу для наглядности*/
printf("\n");
for (i = 0; i < 10; ++i)
printf(" %d", i);
printf("\n");
}
/* заполняем массив со звездочками nstars[s] */
s = 0;
while (s < n)
for (i = 9; i >= 0; --i){
if (ndigit[i] != 0){
nstars[s] = '*';
--ndigit[i];
}
else nstars[s] = ' ';
++s;
}
/* выводим его содержимое кусками по 10
с переводом строки после каждого десятка*/
i = 1;
for (s = (n - 1); s > 0; --s){
if (i != 10){
printf(" %c", nstars[s]);
++i;
}
else {
i = 1;
printf("\n");
}
}
можно покрасивше организовать, но как - не могу придумать.
Я бы сделал гистограмму не вертикальную, а горизонтальную. Вот такую
0 *************
1 *******
2 *
3 **************
Ну и так далее. Тогда никакого массива звездочек не нужно, и отпадает куча головной боли. Просто после каждой цифры надо печатать столько звездочек, сколько указано в массиве ndigit.
Uncle_Theodore
Керниган и Ритчи хотят чтобы я сделал и горизонтальную и вертикальную.
Горизонтальную я сделал, сделал вертикальную перевернутую (звездочки свешиваются сверху вниз), теперь вот эта.
Она строится, все нормально, но как-то код мне не очень нравится, а что бы такого в нем улучшить не приходит в голову.
Какое упражнение ты делаешь? 1.14? Я их делал и программы сохранял. Обратившись к своей программе, мне проще будет понять о чём идёт речь. Но для этого я должен знать номер выполняемого упражнения.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
promov 1.13
Напишите программу, печатающую гистограммы длин вводимых слов. Гистограмму легко рисовать горизонтальными полосами. Рисование вертикальными полосами - более трудная задача.
Только не длины слов считаю, а количество цифр, то есть как в примере перед заданием. Длины слов потом.
Uncle_Theodore
Да, действительно пробелами гораздо лучше.
И с ещё одним массивом связываться не надо. И строк в программе стало почти в два раза меньше.