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;
}