1-13.c

演習 1-13 入力した単語の長さをヒストグラム(度数分布図)にしてプリントするプログラムを書け。ヒストグラムは横に書くほうが簡単だが、縦書に挑戦してみるのもよい。

ちょっと難しかったので(度数分布図なんて知らない)、割合の計算はしないでカウントしたらひとつ#を足していく単純なものにしました。長さが20以上の単語は20としてカウント。すこし読みづらいけど横のグラフと縦のグラフどちらも表示。

#include <stdio.h>
#define IN 1
#define OUT 0

main()
{
        int c, flag = OUT;
        int word[20];
        int length = 0;
        int max = 0;
        int i, x, y;

        for (i = 0; i < 20; i++)
                word[i] = 0;
        while ((c = getchar()) != EOF) {
                if (c == ' ' || c == '\t' || c == '\n') {
                        if (flag == IN) {
                                flag = OUT;
                                if (length <= 20)
                                        ++word[length-1];
                                else
                                        ++word[19];
                                if (word[length-1] >= max)
                                        max = word[length-1];
                                length = 0;
                        }
                } else {
                        if (flag == IN) {
                                length++;
                        } else {
                                flag = IN;
                                length++;
                        }
                }
        }

        for (y = 0; y < 20; y++) {
                printf("%2d: ", y+1);
                for (x = 0; x < word[y]; x++)
                        printf("#");
                printf("\n");
        }
        for (y = max; y > 0; y--) {
                for (x = 0; x < 20; x++)
                        if (word[x] >= y)
                                printf(" # ");
                        else
                                printf("   ");
                printf("\n");
        }
        for (x = 1; x <= 20; x++)
                printf("---");
        printf("\n");
        for (x = 1; x <= 20; x++)
                printf("%2d ", x);
        printf("\n");

}


$ ./a.out < 1-13.c
1: #####################################################
2: ##############################################
3: ############################
4: ####################
5: ######
6: ####
7: ####
8: #####
9: ####
10: #
11: ###
12: ##
13: ####
14: #
15: ##
16:
17: #
18:
19:
20:
#
#
#
#
#
#
#
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# # #
# # #
# # #
# # #
# # #
# # #
# # #
# # #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # # #
# # # # # #
# # # # # # # # # #
# # # # # # # # # # #
# # # # # # # # # # # # #
# # # # # # # # # # # # # # # #

                                                                                                                      • -

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20


合っているのか自信が無い!

$ ./a.out
a a a aa aaa aaaa
(Ctrl-D)
1: ###
2: #
3: #
4: #
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
#
#
# # # #

                                                                                                                      • -

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20


合ってるかな