Упражнение 1.13. Напишите программу для вывода гистограммы длин слов во входном потоке. Построить гистограмму с горизонтальными рядами довольно легко, а вот с вертикальными столбцами труднее.
Программа для вывода гистограммы с горизонтальными рядами:
/* вывод гистограммы длин слов во входном потоке */
#include"stdafx.h" #define IN 1 /* внутри слова */ #define OUT 0 /* снаружи слова */
int main()
{
int c, j, i, state; int wordlength[16]; // массив длин слов
for (i = 0; i < 16; ++i)
wordlength[i] = 0;
i = 0; while ((c = getchar()) != EOF) {
state = IN; if (c == ' ' || c == '\n' || c == '\t' || c == '.' || c == ',')
state = OUT;
else if (state == OUT)
state = IN;
/* если находимся внутри слова, считаем количество символов в слове */ if (state == IN)
++i;
/* если слово заканчивается, увеличиваем количество слов с длиной i */ if (state == OUT && i != 0) {
++wordlength[i];
i = 0;
}
}
/* выводим гистограмму длин слов */ for (i = 1; i < 16; ++i) {
Вот вариант вертикальный. Результат выполнения(оформление) я подсмотрел <a=http://users.powernet.co.uk/eton/kandr2/krx113.html>тут</a>, а сам код писал сам, для меня было очень трудно.
Код
#include <stdio.h> #define IN 1 #define OUT 0 #define MAXLEN 12
main() { int c, i, j, state = OUT, wlen=0, words_len[MAXLEN], big = 0;
for (i = 0; i < MAXLEN; ++i) words_len [i]= 0;
while ((c = getchar())!= EOF) if (c == ' ' || c == '\n' || c == '\t') { if (state == IN) state = OUT; } else { if(wlen > 0 && state == OUT) { if (wlen > 10) wlen = 11; ++words_len[wlen]; wlen = 0; } state = IN; ++wlen; } if(wlen > 10) wlen = 11; ++words_len[wlen]; //Добавление единственного или последнего не учтенного слова
for (i = 1; i < MAXLEN; ++i) { if (words_len > big) big = words_len; }
в решении автора не будет считаться последнее введенное слово, если после него не было символов '\n', ' ', '\t'.
Код
#include <stdio.h>
#define MAXWORDLEN 10 #define IN 1 #define OUT 0
main() { int i, j, c, nc, state; int nword[MAXWORDLEN+1];
for (i = 0; i <= MAXWORDLEN; ++i) nword [i]= 0;
state = IN; nc = 0; for(;;) { c = getchar();
if (c == '\n' || c == '\t' || c == ' ' || c == EOF) state = OUT; else if (state == OUT) state = IN;
if (state == IN) ++nc; else if (nc <= MAXWORDLEN && nc !=0) { ++nword[nc]; nc = 0; } /*проверяем не конец ли файла, если да, то выход из цикла*/ if (c == EOF) break; }
for (i = 1; i <= MAXWORDLEN; ++i) { printf("\n%d:\t", i); for (j = 1; j <= nword; ++j) printf("*"); } printf("\n"); }[/i]
/* вывод гистограммы длин слов во входном потоке */ #include <stdio.h> int main(){ int i, c, k=0, j; int DlinSlova [20]; //обнуление массива for (i=0; i<20; i++) DlinSlova[i]=0; i=0; //подсчет количества длинн слов while ((c=getchar()) != EOF){ if ((c >= 'a' && c <= 'z' ) || ( c >= 'A' && c <= 'Z')){ i++; } else { ++DlinSlova [i]; i=0; } } //выведение номеров столбцов для вертикальной гистограммы for (i = 1; i < 20; ++i) { printf ("%2d ", i); if (k<DlinSlova[i]) /*определение максимального количества слов одной длинны*/ k = DlinSlova[i]; } printf ("\n"); //вывод вертикальной гистограммы for (j = 0; j<=k; j++){ for (i = 1; i < 20; ++i){ if (DlinSlova [i]<=j) printf(" "); else printf(" * "); } printf ("\n"); } //вывод горизонтальной гистограммы for (i = 1; i < 20; ++i) { printf(" %d\t", i); for (j = 0; j < DlinSlova[i]; ++j) printf("*"); printf("\n"); } return 0; }
получилось немного иначе. укажите на ошибки и критические отличия, которые не допустимы
main() { int i, j, c, nc, state; int nword[MAXWORDLEN+1];
for (i = 0; i <= MAXWORDLEN; ++i) nword [i]= 0;
state = IN; nc = 0; for(;;) { c = getchar();
if (c == '\n' || c == '\t' || c == ' ' || c == EOF) state = OUT; else if (state == OUT) state = IN;
if (state == IN) ++nc; else if (nc !=0) { if (nc <= MAXWORDLEN) ++nword[nc]; nc = 0; } /*проверяем не конец ли файла, если да, то выход из цикла*/ if (c == EOF) break; }
for (i = 1; i <= MAXWORDLEN; ++i) { printf("\n%d:\t", i); for (j = 1; j <= nword; ++j) printf("*"); } printf("\n"); }
[/i]
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]