(C言語)分布を表示する

( 子の本棚にC言語入門の本が落ちてたので、勉強してみよっと )

 

【 実行プログラム 】

実行プログラム

 

【 ソースプログラム 】

#include <stdio.h>

#define NUMBER 99

int main(void)
{

    int  i, j;
    int  num;
    int  tensu[NUMBER];
    int  bunpu[11] = {0};

    printf("対象人数を設定ください");
    do {
        scanf("%d", &num);
        if (num < 1 || num > NUMBER)
            printf("【 1以上%d以下 】の範囲となります", NUMBER);
    } while (num < 1 || num > NUMBER);

    puts("点数を入力ください");
    for (i = 0; i < num; i++) {
        printf("%2d番:", i + 1);
        do {
            scanf("%d", &tensu[i]);
            if (tensu[i] < 0 || tensu[i] > 100)
                printf("【 0~100点 】の範囲となります");
        } while (tensu[i] < 0 || tensu[i] > 100);
        bunpu[tensu[i] / 10]++;
    }

    puts("\n----- 分布グラフ -----");
    printf("      100:");
    for (j = 0; j < bunpu[10]; j++)
        putchar('*');
    putchar('\n');

    for (i = 9; i >= 0; i--) {
        printf("%3d - %3d:", i * 10, i * 10 + 9);
        for (j = 0; j < bunpu[i]; j++)
            putchar('*');
        putchar('\n');
    }

    return (0);

}

 

【 まなび 】

■ int tensu[NUMBER];

 個人ごとの点数を格納するための配列。

 NUMBER は、#defineオブジェクト形式マクロで管理。

 

■ int bunpu[11] = {0};

 分布(範囲)に該当する件数を格納するための配列。

 0 で初期化。

 

■ bunpu[tensu[i] / 10]++;

 10の位以上を基準値として割り出し、該当する分布の配列を1ずつカウント。

 87点なら、tensu[i] / 10 により 8を算出し、配列bunpu[8]に1カウントつけている。

 

■ printf("%3d - %3d:", i * 10, i * 10 + 9);

 分布表のラベルを順番に生成していっている。

 

■ for (j = 0; j < bunpu[i]; j++)

 配列bunpuに格納されたカウント数の分だけ、putchar('*');を表示。

 

 

************************************************
【 演習5-7 】

縦方向の分布グラフの表示を行うプログラムを作成せよ。

演習5-7
#include <stdio.h>

#define NUMBER 99

int main(void)
{

    int i, j;
    int num;
    int max = 0;
    int tensu[NUMBER];
    int bunpu[11] = {0};

    printf("対象人数を設定ください");
    do {
        scanf("%d", &num);
        if (num < 1 || num > NUMBER)
            printf("【 1以上%d以下 】の範囲となります", NUMBER);
    } while (num < 1 || num > NUMBER);

    puts("点数を入力ください");
    for (i = 0; i < num; i++) {
        printf("%2d番:", i + 1);
        do {
            scanf("%d", &tensu[i]);
            if (tensu[i] < 0 || tensu[i] > 100)
                printf("【 0~100点 】の範囲となります");
        } while (tensu[i] < 0 || tensu[i] > 100);
        bunpu[tensu[i] / 10]++;
    }

    puts("\n----------- 分布グラフ ----------");

    for (j = 0; j < 11; j++ )
        if(bunpu[j] > max)
            max = bunpu[j];
   
    for (i = max; i > 0; i--) {
        for (j = 0; j < 11; j++ )
            if(bunpu[j] >= max)
                printf(" * ");
            else
                printf("   ");
        max--;
        putchar('\n');
    }

    puts("---------------------------------");
    puts(" 0 10 20 30 40 50 60 70 80 90 100");

    return (0);

}

 

で、できた・・・なかなかに難しかった。