ほぷしぃ

納得C言語!

[第12回]演習問題V 第3問の解答

演習問題V 第3問の解答


3 10人分のテスト点数

解答プログラム

//プログラムを書くときに赤色の(1),(2),(3),(4)は書かないでください

#include <stdio.h>

int main()
{
    //int型配列の宣言
 (1)int a[10][2];
    int b = 0 ,c = 0, d = 0 ;

    printf("点数を入力してください\n");

    //点数入力
    for(b=0;b<10;b++){
        printf("%d人目:",b+1);
     (2)scanf("%d",&a[b][0]);

        //0点未満、101点以上の入力で再度入力を求める
        if(a[b][0]<0 || a[b][0]>100){
            printf("入力エラー\nもう一度入力してください\n");
            b--;
            continue;
        }
    }

    //a[b][1]をで初期化
    //a[0][1]〜a[9][1]までとなる
    for(b=0;b<10;b++){
     (3)a[b][1]=1;
    }

    //順位決定のfor2重ループ
/*
a[b][0]とa[d][0]を比較し後者が小さければ後者の
a[d][1]に1を足す
すべてと比較をするので、小さいほうは常に足され
順位をつけることができる
*/
 (4)for(b=0;b<10;b++){
        for(d=0;d<10;d++){
            if(a[b][0]>a[d][0]){
                a[d][1]++;
            }
        }
    }

    //点数と順位の表示
    for(b=0;b<10;b++){
        printf("%d人目->点数:%3d順位:%3d\n",b+1,a[b][0],a[b][1]);
    }

    return 0;
}


解説

下線(1)

点数と順位を格納する2次元配列を準備します。
表にすると下のようになります

2×10の整数型2次元配列を宣言する

下線(2),(3)

a[b][0](下表の色がついている部分)に入力された変数を格納していきます
また、下線(3)でa[b][1]に1を格納していきます。

2次元配列に数値を格納する

下線(4)

ここで順位を決定しています。
a[0][0]とa[1][0]を比較し、a[1][0]が小さければa[1][1]を1足します。
この場合はa[1][0]が小さいのでa[1][1]を1足します。

a[0][0]とa[1][0]を比較しa[1][0]が小さければa[1][1]に1足す

次に、a[0][0]とa[2][0]を比較します。ここでもa[2][0](後者)が小さいのでa[2][1]を1足します。

比較を行い後者が小さいとき1足す

a[0][0]とすべて比較すると下表のようになりましたね。

a[0][0]と他をすべて比較

次にa[1][0]とa[0][0]を比較します。この場合はa[0][0]のほうが大きいので値に変化はありません。

前者が大きいので変化なし

a[2][0]も同じですね。a[1][0]とa[3][0]を比べてみましょう。
今度はa[3][0]が小さいので、1足されます。

比較を行い後者が小さいとき1足す

これをひたすら続けていきます。

比較を続けていく

この比較をa[9][0]まで続けていきます。

a[9][0]まで続ける

あとはa[b][1]で順位を表示させてあげればいいですね。


ヒント ページのトップ 第4問