読者です 読者をやめる 読者になる 読者になる

1-14.c

演習 1-14 入力中の異なる文字の頻度をヒストグラムにプリントするプログラムを書け。

ひさびさにやってみた。関数はまだ登場しないページだから使わなかった。
大文字小文字を区別しないアルファベット26字と、0〜9の数字ひとまとまり、それ以外で区別して表示。

#include <stdio.h>

main()
{
        int c, i;
        int charcount[28]; /* アルファベット26字+数字(ひとまとめ)+その他 */
        for (i = 0; i <= 27; i++)
                charcount[i] = 0;

        while ((c = getchar()) != EOF) {
                if ((c >= 'a') && (c <= 'z'))
                        charcount[c-'a']++;
                else if ((c >= 'A') && (c <= 'Z'))
                        charcount[c-'A']++;
                else if ((c >= '0') && (c <= '9'))
                        charcount[26]++;
                else
                        charcount[27]++;
        }

        for (i = 0; i <= 27; i++) {
                if (i <= 25) {
                        printf("%c  :", 'A'+i);
                        for (; charcount[i] > 0; charcount[i]--)
                                printf("#");
                        printf("\n");
                } else if (i == 26) {
                        printf("num:");
                        for (; charcount[26] > 0; charcount[26]--)
                                printf("#");
                        printf("\n");
                } else if (i == 27) {
                        printf("oth:");
                        for (; charcount[27] > 0; charcount[27]--)
                                printf("#");
                        printf("\n");
                }
        }
}


$ ./a.out < 1-14.c
A :###################
B :
C :#####################################
D :##
E :##############
F :#####################
G :#
H :################
I :###################################
J :#
K :#
L :#######
M :##
N :#############################
O :####################
P :#########
Q :
R :###########################
S :######
T :##########################
U :##############
V :
W :#
X :
Y :
Z :##
num:##################################
oth:#########################################(後略