第53問 同じ点なら同じ順位(テストの順位づけ)
4人のテストの点数 ten(=[70, 90, 80, 90])を、一人ずつ「何位か」に直して表示しよう。順位は「自分より高い点の人が何人いるか」を数えて、その人数に1をたせば求められます。同じ点の人は同じ順位(90点は2人とも1位で、2位はいない)になるようにしよう(3か所の穴をうめよう)
難易度:★★★★★(5/難しい)。単元:条件分岐・繰り返し・配列。共通テスト「情報I」で使われるDNCL(共通テスト用プログラム表記)の穴埋め問題です。JavaScriptを有効にすると、このページでプログラムを組み立てて実行しながら解けます。
プログラム
ten = [70,90,80,90]
i を 0 から 3 まで 1 ずつ増やしながら繰り返す:
juni = [A]
j を 0 から 3 まで 1 ずつ増やしながら繰り返す:
もし ten[j] [B] ten[i] ならば:
juni = juni [C] 1
表示する(ten[i] + "点は" + juni + "位")
空欄 [A]・[B]・[C] に当てはまるものを、次の選択肢から選びます。
選択肢
ヒント
順位は「自分より上に何人いるか + 1」で求まります。だから juni は 1 からスタートし、内側のくり返しでは「自分より高い点(ten[j] > ten[i])」の人だけを 1 ずつプラスして数えます。= を入れないのがポイントで、同じ点の人はお互いを数えないので自然と同じ順位になります
解答
- 空欄 [A] …
1
- 空欄 [B] …
>
- 空欄 [C] …
+
よくある間違い
- [A]
0 [B]> [C]+ … 数え方は合っていますが、スタートが1つずれています。1番高い人は、自分より高い人が0人なので juni が 0 のままになり、90点が「0位」と出てしまいます。順位は1位から始まるので、最初に入れておくのは 1 です
- [A]
1 [B]>= [C]+ … >= にすると「自分と同じ点」も数えてしまいます。j は自分自身も通るので、どの人も必ず1人分多く数えて 70点は5位。さらに90点は2人いてお互いを数えあうので、2人とも3位になってしまいます。数えたいのは「自分より高い人」だけなので > を使います
- [A]
1 [B]< [C]+ … < だと「自分より低い人」を数えてしまうので、順番が逆さまになります。一番高い 90点が 3位、一番低い 70点が 1位 と出てしまいます。上に何人いるかを数えたいので > です
- [A]
1 [B]> [C]- … 人数を数えるのにひき算にしています。juni は 1 から始まるので、高い人が見つかるたびに 0、-1、-2 と減ってしまい、70点が「-2位」と出ます。1人見つかるごとに順位は下がる(数字は大きくなる)ので + です
- [A]
0 [B]>= [C]+ … >= で自分自身を余分に1人数えるぶんを、スタートの 0 が打ち消しています。点数がばらばらならこれでも合いますが、同じ点の人がいるとお互いを数えあってずれます。90点は2人とも2位になり、1位がいなくなってしまいます。「juni は1位からスタート」「数えるのは自分より高い人だけ(>)」が正しい組み合わせです
- [A]
0 [B]< [C]+ … どちらもちがいます。< だと低い人を数えて順番が逆さまになり、スタートが 0 なので「0位」が出てしまいます。juni は 1 から始め、自分より高い人(>)を数えましょう
この単元の解説動画
ほかの問題