納得C言語!
演習問題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),(3)
a[b][0](下表の色がついている部分)に入力された変数を格納していきます
また、下線(3)でa[b][1]に1を格納していきます。
下線(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[2][0]を比較します。ここでもa[2][0](後者)が小さいのでa[2][1]を1足します。
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足されます。
これをひたすら続けていきます。
この比較をa[9][0]まで続けていきます。
あとはa[b][1]で順位を表示させてあげればいいですね。