最大値を求めるプログラムは作成しましたが、今回は順位を求めるプログラムを作成してみましょう。
配列に5人分の得点データが格納されているとします。
得点の高い方から順位を付けたいのですが、大きい順にソートすれば得点の高い順に並べることはできます。
でも、配列の0番目がA君の得点、1番目がB君の得点・・・としていた場合、ソートしてしまうとどれが誰の得点なのかわからなくなります。
※格納場所が変わってしまっている。
ソートせずに順位を付けるため、色々と考えてみましょう。
まず、0番目のデータ「62点」の順位だけを求めてみます。
ぱっと見て「3位」ということは分かると思いますが、コンピュータには手順が必要です。
1.順位を入れるための変数rankを準備し、初期値として1を格納します。 2.基準となる「62点」とその他の得点をすべて比較します。 3.「62点」より高い得点の場合、rankを1増やします。 4.すべての得点との比較が終わったらrankを表示します。 |
まずはこれだけの情報でプログラムを作ってみましょう。
<sample program 071-00>
#include <stdio.h> #define COUNT 5 int main(void) { int data[COUNT] = { 62, 34, 78, 85, 57 }; int rank = 1; /* ここにプログラムを書く */ printf("%d位です。\n", rank); return 0; } |
<実行結果1>
3位です。 続行するには何かキーを押してください・・・
解答例です。
<sample program 071-01>
#include <stdio.h> #define COUNT 5 int main(void) { int data[COUNT] = { 62, 34, 78, 85, 57 }; int rank = 1; int i; for (i = 1; i < COUNT; i++){ if (data[0] < data[i]){ rank++; } } printf("%d位です。\n", rank); return 0; } |
<実行結果1>
3位です。 続行するには何かキーを押してください・・・
では、上のプログラムを改良して、基準となる得点の添え字を入力出来るようにしましょう。
※入力範囲のチェック覚えていますか?配列の添え字を超えてアクセスするのは危険なことです。
入力用にindexという変数を追加しました。
残りの部分は考えてみてください。
<sample program 071-02>
#include <stdio.h> #define COUNT 5 int main(void) { int data[COUNT] = { 62, 34, 78, 85, 57 }; int rank = 1; int i; int index; /* 添え字の入力 */ /* 順位を求める */ printf("%d位です。\n", rank); return 0; } |
<実行結果1>
調べたい順位の添え字を入力してください:8 調べたい順位の添え字を入力してください:1 5位です。 続行するには何かキーを押してください・・・
解答例です。
<sample program 071-03>
#include <stdio.h> #define COUNT 5 int main(void) { int data[COUNT] = { 62, 34, 78, 85, 57 }; int rank = 1; int i; int index; do { printf("調べたい順位の添え字を入力してください:"); scanf("%d", &index); } while (index < 0 || index >= COUNT); for (i = 0; i < COUNT; i++){ if (data[index] < data[i]){ rank++; } } printf("%d位です。\n", rank); return 0; } |
<実行結果1>
調べたい順位の添え字を入力してください:8 調べたい順位の添え字を入力してください:2 2位です。 続行するには何かキーを押してください・・・
指定された得点の順位を計算するためには、すべての得点と比較しなければなりません。
実際には「指定された得点」と「それ以外の得点」を比較すれば良いのですが、上のプログラムでは指定された得点とも比較を行っています。
指定された得点同士の比較を行った場合、同じ数ですから順位が増えることはありませんので、特に問題にはなりません。
指定された得点同士を比較しないようにするには、以下のように変更すれば良いですが、if文が1つ増えるだけであまり意味は無いように思います。
<sample program 071-04>
#include <stdio.h> #define COUNT 5 int main(void) { int data[COUNT] = { 62, 34, 78, 85, 57 }; int rank = 1; int i; int index; do { printf("調べたい順位の添え字を入力してください:"); scanf("%d", &index); } while (index < 0 || index >= COUNT); for (i = 0; i < COUNT; i++){ if (index != i) { if (data[index] < data[i]){ rank++; } } } printf("%d位です。\n", rank); return 0; } |
<実行結果1>
調べたい順位の添え字を入力してください:2 2位です。 続行するには何かキーを押してください・・・
入力した添え字と調べる添え字が不一致の場合だけ比較を行います。
では最後に全員の順位を調べるプログラムを作成してみましょう。
順位を入れるための変数rankを配列にして初期値1を入れておきます。
全員の順位を計算するため、添え字は自動的に0番目から4番目を指すよう二重ループを使って作ってみてください。
<sample program 071-05>
#include <stdio.h> #define COUNT 5 int main(void) { int data[COUNT] = { 62, 34, 78, 85, 57 }; int rank[COUNT] = { 1, 1, 1, 1, 1 }; int i; int j; /* ここにプログラムを書く */ for (i = 0; i < COUNT; i++) { printf("data[%d] = %d : rank[%d] = %d\n", i, data[i], i, rank[i]); } } |
<実行結果1>
data[0] = 62 : rank[0] = 3 data[1] = 34 : rank[1] = 5 data[2] = 78 : rank[2] = 2 data[3] = 85 : rank[3] = 1 data[4] = 57 : rank[4] = 4 続行するには何かキーを押してください・・・
解答例です。
<sample program 071-06>
#include <stdio.h> #define COUNT 5 int main(void) { int data[COUNT] = { 62, 34, 78, 85, 57 }; int rank[COUNT] = { 1, 1, 1, 1, 1 }; int i; int j; for (i = 0; i < COUNT; i++) { for (j = 0; j < COUNT; j++) { if (data[i] < data[j]) { rank[i]++; } } } for (i = 0; i < COUNT; i++) { printf("data[%d] = %d : rank[%d] = %d\n", i, data[i], i, rank[i]); } } |
<実行結果1>
data[0] = 62 : rank[0] = 3 data[1] = 34 : rank[1] = 5 data[2] = 78 : rank[2] = 2 data[3] = 85 : rank[3] = 1 data[4] = 57 : rank[4] = 4 続行するには何かキーを押してください・・・
これで順位づけは完成です。
同じ得点が複数ある場合など、色々と試してみてください。