// cs_161_007.c
// http://t...content-available-to-author-only...h.net/test/read.cgi/tech/1354070278/7

#include<stdio.h>
#include<stdlib.h>

#define INPUT_FILE   "cs_161_007.c"
#define RANGE       (66)        // length of scale

#if RANGE < 1
#error RANGE < 1
#endif

int main()
{
    FILE *fp;
    int i, j;
    int counter[26];
    int ch;
    int sum;
    int max_ch_count;
    int max_ch_keta;
    int hist;

    // init
    for (i = 0; i < 26; i++) {
        counter[i] = 0;
    }
    sum = 0;

    // read & count
    if (NULL == (fp = fopen(INPUT_FILE, "r"))) {
        fprintf(stderr, "File \"" INPUT_FILE "\" open error.\n");
        exit(1);
    }
    while (1) {
        if (EOF == (ch = fgetc(fp))) {
            break;
        }
        if ('a' <= ch && ch <= 'z') {
            counter[ch - 'a']++;
            sum++;
        }
    }
    fclose(fp);

    // make max_ch_count & max_ch_keta
    for (i = max_ch_count = 0; i < 26; i++) {
        if (max_ch_count < counter[i]) {
            max_ch_count = counter[i];
        }
    }
    max_ch_keta = 1;
    i = max_ch_count;
    while (i >= 10) {
        max_ch_keta++;
        i /= 10;
    }

    // disp scale
    printf("File : " INPUT_FILE "\n");
    printf("  max count = %*d\n", max_ch_keta, max_ch_count);
    printf(" +");
    for (i = 0; i < RANGE; i++) {
        printf("-");
    }
    printf("+\n");

    // show result
    for (i = 0; i < 26; i++) {
        printf("%c:", (char) (i + 'a'));
        hist = (RANGE * counter[i] + max_ch_count - 1) / max_ch_count;
        for (j = 0; j < hist; j++) {
            printf("*");
        }
        for (; j < RANGE; j++) {
            printf(" ");
        }
        printf(":%5.1f%%=%*d\n", (double) counter[i] / sum * 100.0, max_ch_keta, counter[i]);
    }

    // end
    return 0;
}

// End of cs_161_007.c