Q&A (電気電子)

【C++】分布グラフを縦方向に行うプログラム

今回C++でやってます。

Cでやるときは「scanf_s」を「scanf」に戻すのを忘れないでください。

できたのでメモです。

今回のプログラムは入力して配列に代入した値を0~100までで10ごとに階級分けし、度数分布表を「*」を用いて立て向きに表示する、というものです。

立て向きに表示するだけじゃん、とか思っていたのですが、出力画面の特性上上から下にしか描画できないので結構めんどくさい、と感じました。

プログラム

プログラムは以下の通りです。

Cでやるときは「scanf_s」を「scanf」に戻すのを忘れないでください。

#include <iostream>
# define NUMBER 80
int main()
{
    int no;
    int i, j;

    int bunpu_max;
    int maximum;

    int tensu[NUMBER];
    int bunpu[11] = { 0 };

    printf("人数を入力してください。");
    do {
        scanf_s("%d", &no);
        if (no < 1 || no>100) {
            printf("1~%dで入力してください。:", NUMBER);
        }
    } while (no < 1 || no>100);


    printf("%d人の点数を入力してください。\n", no);

    for (i = 0; i < no; i++) {
        printf("%2d番目:", i + 1);
        do {
            scanf_s("%d", &tensu[i]);
            if (tensu[i] < 0 || tensu[i]>100) {
                printf("0~100の間で入力してください。:");
            }
        } while (tensu[i] < 0 || tensu[i]>100);
        bunpu[tensu[i] / 10]++;
    }

    bunpu_max = bunpu[0];
    for(i = 1; i < 11; i++) {
        if (bunpu_max<bunpu[i]) {
            bunpu_max = bunpu[i];
        }
    }

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

    for (i = 0; i < 11; i++) {
        printf("%2dの分布:%d\n", i, bunpu[i]);
    }

    putchar('\n');

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

    printf("__________________________________\n");
    for (i = 0; i <= 10; i++) {
        printf("%3d",i*10);
    }

}

以下の部分がミソだったようです。結構思いつくのに時間がかかってしまいました。

紙と鉛筆はやっぱり必須なんですね。

if(bunpu_max-bunpu[j]>=i){
                printf("   ");
            }
            else {
                printf("  *");
            }

Cでやるときは「scanf_s」を「scanf」に戻すのを忘れないでください。

実行結果

実行結果は以下の通りです。

人数を入力してください。30
30人の点数を入力してください。
 1番目:98
 2番目:95
 3番目:96
 4番目:31
 5番目:46
 6番目:59
 7番目:85
 8番目:73
 9番目:59
10番目:91
11番目:35
12番目:100
13番目:15
14番目:68
15番目:23
16番目:56
17番目:98
18番目:18
19番目:578
0~100の間で入力してください。:98
20番目:54
21番目:97
22番目:49
23番目:79
24番目:32
25番目:39
26番目:85
27番目:91
28番目:43
29番目:82
30番目:0

---分布グラフ---


 0の分布:1
 1の分布:2
 2の分布:1
 3の分布:4
 4の分布:3
 5の分布:4
 6の分布:1
 7の分布:2
 8の分布:3
 9の分布:8
10の分布:1

                             *
                             *
                             *
                             *
           *     *           *
           *  *  *        *  *
     *     *  *  *     *  *  *
  *  *  *  *  *  *  *  *  *  *  *
__________________________________
  0 10 20 30 40 50 60 70 80 90100

間違えたプログラム

できそうでできなかったプログラムもメモとして残しておきます。

/*
#include <iostream>
# define NUMBER 80
int main()
{
    int no;
    int i, j;

    int bunpu_max;
    int maximum;

    int tensu[NUMBER];
    int bunpu[11] = { 0 };

    printf("人数を入力してください。");
    do {
        scanf_s("%d", &no);
        if (no < 1 || no>100) {
            printf("1~%dで入力してください。:", NUMBER);
        }
    } while (no < 1 || no>100);


    printf("%d人の点数を入力してください。\n", no);

    for (i = 0; i < no; i++) {
        printf("%2d番目:", i + 1);
        do {
            scanf_s("%d", &tensu[i]);
            if (tensu[i] < 0 || tensu[i]>100) {
                printf("0~100の間で入力してください。:");
            }
        } while (tensu[i] < 0 || tensu[i]>100);
        bunpu[tensu[i] / 10]++;
    }

    bunpu_max = bunpu[0];
    for(i = 1; i < 11; i++) {
        if (bunpu_max<bunpu[i]) {
            bunpu_max = bunpu[i];
        }
    }


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

    for (i = 0; i < 11; i++) {
        printf("%dの分布:%d\n", i, bunpu[i]);
    }

    putchar('\n');



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


}





人数を入力してください。15
15人の点数を入力してください。
 1番目:68
 2番目:95
 3番目:98
 4番目:100
 5番目:97
 6番目:94
 7番目:65
 8番目:365
0~100の間で入力してください。:25
 9番目:35
10番目:18
11番目:68
12番目:90
13番目:85
14番目:37
15番目:69

---分布グラフ---


0の分布:0
1の分布:1
2の分布:1
3の分布:2
4の分布:0
5の分布:0
6の分布:4
7の分布:0
8の分布:1
9の分布:5
10の分布:1

   * * *     *   * * *
       *     *     *
             *     *
             *     *
                   *
*/

アスタリスクの個数はあっているのですが、空白と*の描画順序が逆ですね。

-Q&A (電気電子)
-,