LinuxForum.Fans
Тема

K&R, изд. 3, исп., или начал изучать Си.

Автор: yars 1 сообщений 984 просмотров
27.08.2023 22:57 #439041

Всем привет! Давненько ничего не писал :) В общем, начал изучать Си. Дошел до упражнения 1.13, написал программу:

text
#include <stdio.h>
#define MAXCOUNT 1000
#define OUTW 0
#define INW 1
#define DELIMITER "  "

/* Write a program that makes a word length histo */

int main() { int wordlen[MAXCOUNT]; int c, i, j, wc, m, state; for (i = 0; i < MAXCOUNT; ++i) wordlen[i] = 0; c = i = j = wc = m = 0;

state = OUTW; while ((c = getchar()) != EOF && wc < MAXCOUNT - 1 ) { if (c == ' ' || c == '\t' || c == '\n') { state = OUTW; ++wordlen[wc]; ++wc; } else if (state == OUTW) state = INW; else ++wordlen[wc]; }

printf("Building histograms. First, horizontal:\n"); for (i = 0; i < wc; ++i) { printf("word %d: ", i); for (j = 0; j < wordlen[i]; ++j) putchar('+'); putchar('\n'); }

printf("Then, vertical:\n"); /* what's the longest word? */ m = 0; for (i = 0; i < wc; ++i) if (wordlen[i] > m) m = wordlen[i];

for (i = 0; i < m; ++i) { for (j = 0; j < wc; ++j) { if (wordlen[j] >= m) putchar('+'); else putchar(' '); printf(DELIMITER); } putchar('\n'); --m; } /* the legend under histogram */ for (i = 0; i < wc; ++i) printf("%d%s", i, DELIMITER); putchar('\n'); }

Программа работает, но пока не придумал, как сделать горизонтальную гистограмму в том же стиле, что и вертикальная. Вот результат работы программы:

text
./1.13_words_histo 
this is another words
Building histograms. First, horizontal:
word 0: ++++
word 1: ++
word 2: +++++++
word 3: +++++
Then, vertical:
      +     
      +     
      +  +  
+     +  +  
0  1  2  3  

Покритикуйте :)

Войдите или зарегистрируйтесь, чтобы ответить.