1-14 char_hist.c
20回以上の頻度はその他扱いに。
/* * P30 演習1-14 * 入力中の異なる文字の頻度をヒストグラムにプリントする * プログラムを書け。 * * 解答者ボヤキ: 「文字」が何を指すのかハッキリしてくれよ、まったく… * とりあえずアルファベットの大文字小文字だけ見る。 * ASCIIじゃない処理系だと動かんね。 * * 2007/05/23 arikui */ #include <stdio.h> #define FREQ_LIMIT 20 #define NUM_ASCII 128 int main(void){ char count[NUM_ASCII], freq[FREQ_LIMIT + 1]; int c, i, j; for(i = 0; i < NUM_ASCII; i++) count[i] = freq[i] = 0; while((c = getchar()) != EOF){ if (c >= '0' && c < NUM_ASCII) ++count[c]; } for(i = 'A'; i <= 'Z'; i++){ if (count[i] > FREQ_LIMIT) ++freq[0]; else ++freq[count[i]]; } for(i = 'a'; i <= 'z'; i++){ if (count[i] > FREQ_LIMIT) ++freq[0]; else ++freq[count[i]]; } printf("frequency : nominateds\n"); for(i = 1; i < (FREQ_LIMIT + 1); i++){ printf("%9d : ", i); for(j = 0; j < freq[i]; j++) putchar('*'); putchar('\n'); } printf("%7s%2d : ", "over", FREQ_LIMIT); for(j = 0; j < count[0]; j++) putchar('*'); putchar('\n'); return 0; }