共通テスト(情報) 過去問
令和6年度(2024年度)追・試験
問32 (<旧課程>情報関係基礎(第3問) 問3)

このページは閲覧用ページです。
履歴を残すには、 「新しく出題する(ここをクリック)」 をご利用ください。

問題

共通テスト(情報)試験 令和6年度(2024年度)追・試験 問32(<旧課程>情報関係基礎(第3問) 問3) (訂正依頼・報告はこちら)

次の文章を読み、問いに答えよ。

Aさんはゲーム会社に勤務しており、複数のプレイヤーが参加するゲームでのプレイヤーの順番(以下、手番と呼ぶ。)を管理するプログラムを開発している。ここでは図1に示すように、「高橋」を先頭として「高橋」→「石村」→「天野」→「小池」→「渡辺」の順で時計回りに手番が進み、最後の「渡辺」の次は「高橋」に戻り、再び同じ順で手番が繰り返される例について考える。

Aさんは「プレイヤーの情報は配列で管理するが、ゲームでの手番は配列の並びにかかわらず、自由に順序を設定できるようにしてほしい」と指示を受けた。そこで、表1のように列1にはプレイヤーの名前、列2には「次のプレイヤー」の行番号を格納するデータの構造を考えた。列2は図1の矢印に相当し、「高橋」の次のプレイヤーを指し示す矢印は「石村」を指しているので、表1における「高橋」の行の列2には「石村」の行番号である3が入る。「石村」の次のプレイヤーは「天野」なので、「石村」の行の列2には( ア )が入る。最後の「渡辺」の次のプレイヤーは先頭の「高橋」なので、「渡辺」の行の列2には( イ )が入る。なお、設問の都合により、表1の一部は値を「?」で隠している。

Aさんは、表1をPlayerという名前の2次元配列で扱うことにした。表1の行番号と列番号を添字として用い、Player[<行番号>,<列番号>]と表す。ただし、行番号と列番号に0は用いないこととする。5行目の「高橋」を例にすると、名前は5行1列にあるため、Player[5,1]に「高橋」を格納し、次のプレイヤーの行番号は5行2列にあるため、Player[5,2]に3を格納する。
Aさんはこの配列を用いて、ゲームに参加しているすべてのプレイヤーの名前を、先頭から手番の順に表示する手続きを図2のように書いた。変数sentoは先頭のプレイヤーの行番号を、変数nはゲームの参加者数を、それぞれ格納している。変数pを用いて手番の並びをn人分たどりながら、(03)行目でプレイヤーの名前を表示する手続きとなっている。

図2 プレイヤーの名前を手番の順に表示する手続き
(01)p←sento
(02)iを1からnまで1ずつ増やしながら,
(03)¦( ウ )を表示する
(04)¦p←( エ )
(05)を繰り返す

( ウ )にあてはまるものを1つ選べ。
問題文の画像
  • sento
  • p+1
  • Player[p,p]
  • Player[p,1]
  • Player[p,2]
  • Player[sento,p]
  • Player[i,1]
  • Player[i,2]
  • Player[i,p]

正解!素晴らしいです

残念...

この過去問の解説 (3件)

01

(表1)を、player[<行番号>,<列番号>] と2次元配列を用いて表すことを念頭に置いて、問題を考えていきます。

Aさんは、この2次元配列を用いて手番の順に先頭からプレイヤー名を表示する手続きを(図2)のように考えています。この手続きの内容を順番に追っていきます。

まず、(01)行で、変数 p に先頭プレイヤーの行番号(先頭プレイヤーである「高橋」の行番号「5」)が格納されます。このことから、変数 p はプレイヤーの(表2)における行番号を保持する変数であることが予想されます。次に、(03)行から(04)行までを人数分繰り返すわけですから、(ウ)の空欄に入るのは、プレイヤーの名前のデータということになります。(表1)の中で、プレイヤーの名前のデータがあるのは1列目なので、(ウ)に入るのは player[■ ,1] と表すことができます。次に"■"の部分には名前データの行番号が入りますが、最初は、先頭プレイヤー「高橋」の行番の「5」が入ることになりますが、変数 p にすでに代入されているので、「5」ではなく、「p」を使います。(player[5,1]としてしまうと、行番号の「5」は変わらないので、5回とも「高橋」の名前が表示されてしまい、不都合が生じます)

よって、(03)行は、「player[p,1]を表示する」となります。

 

また、次の(04)行ですが、変数 p に何らかの値を代入しています。上記の説明で述べた通り、変数 p はプレイヤーの行番号を保持する変数であることが予想され、最初は先頭プレイヤー「高橋」の行番号が格納されていました。前の(03)行で先頭プレイヤー「高橋」の名前が表示されたので、今度はその次に表示されるプレイヤーの行番号が格納されればよいということになりますが、それは(表2)の「高橋」のある行の2列目ということになります。よって、(04)行は、「p←player[p,2]」となります。

 

以上のように、1人のプレイヤーの名前を表示したら次に表示するプレイヤーの行番号を p に格納し、これを5回繰り返すことによって、5人分の名前を次々に手番の順に表示させることができます。

 

以上より、解答欄(ウ)には player[p,1] の選択肢の番号が入ります。

選択肢1. sento

sento には、先頭プレイヤー(「高橋」)の(表1)での行番号が格納されています。(03)行が「sento を表示する」だと、数字の「5」が表示され、プレイヤーの名前は表示されませんので、正しくありません。

選択肢2. p+1

最初sento には、先頭プレイヤー(「高橋」)の(表1)での行番号「5」が格納され、(01)行でその値が p に代入されているので p=5、したがって p+1=6 であり、(03)行を実行すると数字の「6」が表示され、プレイヤーの名前は表示されないので正しくありません。

選択肢3. Player[p,p]

変数 p には、先頭プレイヤー(「高橋」)の(表1)での行番号「5」が格納されています。

よって最初の(03)行の処理は「player[5,5]を表示する」となりますが、(表1)には5列目はないので、プレイヤーの名前が表示されることはありません。よって、正しくはありません。

選択肢4. Player[p,1]

最初の説明で述べた通り、正しい選択肢です。

選択肢5. Player[p,2]

player[p,2]は、(表1)の2列目のデータ、すなわち次のプレイヤーの行番号を表しているので、表示されるのは「名前」ではなく「番号」(数字)です。よって、正しくはありません。

選択肢6. Player[sento,p]

sento には、先頭プレイヤー(「高橋」)の(表1)での行番号「5」が格納され、(01)行でその値が p に代入されているので p=5 です。よって、最初はplayer[5,5]を表示することになりますが、(表1)で5列目はなく、プレイヤーの名前が表示されることはありません。よって、正しくはありません。

選択肢7. Player[i,1]

最初、i の値は「1」です。したがって、player[i,1]は、具体的にはplayer[1,1]となり、プレイヤー「小池」の名前を表示することになります。よって、正しくはありません。

選択肢8. Player[i,2]

最初、i の値は「1」です。したがって、player[i,2]は、具体的にはplayer[1,2]となり、次のプレイヤーの行番号、すなわち数字を表示することになります。よって、名前は表示されず、正しくはありません。

選択肢9. Player[i,p]

最初、iの値は「1」です。また、sento には、先頭プレイヤー(「高橋」)の(表1)での行番号「5」が格納され、(01)行でその値が p に代入されているので p=5 です。したがって、player[i,p]は、具体的にはplayer[1,5]となりますが、(表1)で5列目はなく、プレイヤーの名前が表示されることはありません。よって、正しくはありません。

まとめ

選択肢が多く、どれが正しいか迷うかもしれません。sento、p、i と変数が出てきますが、具体的な値(数値)を当てはめながら考えていくことが大事です。

参考になった数0

02

(03)行目でプレイヤーの名前を表示する手続きとなっている。

 

( ウ )では、プレイヤーの名前を指定します。

選択肢1. sento


先頭のプレイヤーの行番号です。

選択肢2. p+1


プレイヤーの行番号+1という数字です。

選択肢3. Player[p,p]


p=1のときPlayer[1,1]、p=2のときPlayer[2,2]、…となり、プレイヤーの名前を正しく指定できません。

選択肢4. Player[p,1]


プレイヤーの名前です。

選択肢5. Player[p,2]


次のプレイヤーの行番号です。

選択肢6. Player[sento,p]


sento行の名前や次のプレイヤーの行番号などです。

選択肢7. Player[i,1]


i行目のプレイヤーの名前です。
iは1からnまで1ずつ増えるので(図2(02))、手番の順に表示することができません。

選択肢8. Player[i,2]


i行目の次のプレイヤーの行番号です。

選択肢9. Player[i,p]


i行目の名前や次のプレイヤーの行番号などです。

参考になった数0

03

この問題で覚えておくべきポイントは以下の通りです。

 

先頭のプレイヤーの行番号である、

sentoを変数pに格納して、

iをカウントしてn人分たどりながら、

プレイヤーの名前を表示する処理を表したのが、

図2となります。

 

図2 プレイヤーの名前を手番の順に表示する手続き

(01)p←sento

(02)iを1からnまで1ずつ増やしながら,

(03)¦( ウ )を表示する

(04)¦p←( エ )

(05)を繰り返す

 

以下の記述よりプレイヤーの名前は、

2次元配列であるPlayer[<行番号>, 1]に

格納されると記載されていることに着目します。

 

5行目の「高橋」を例にすると、名前は5行1列にあるため、Player[5,1]に「高橋」を格納し、

 

(03)の処理で、

プレイヤーの名前を表示させるためには、

表示させるべき変数は、

2次元配列Player[xxx,1]である必要があります。

 

次に(03)で表示させる2次元配列Player[xxx,1]の要素である、

行番号(xxx)には何を格納させるのかを考えます。

 

図2の手続きは、

ゲームに参加しているすべてのプレイヤーの名前を、

先頭から手番の順に表示する処理とあります。

 

(03)で表示させる2次元配列Player[xxx,1]の行番号(xxx)には、

先頭のプレイヤーの行番号を格納している、

sentoもしくはp(sentoの値を代入した値)が入ることになります。

 

例えば、

先頭のプレイヤーが「高橋」の場合に、

先頭だけを表示させる処理に着目しましょう。

 

1) 「高橋」の行番号である「5」をsentoに格納

2)  sentoの値をpに代入

3)  iを1つ増やす

4)  先頭のプレイヤーである「高橋」の名前を表示する

 

4)で表示させる変数としては、

Player[<高橋の行番号>,1]となります。

<高橋の行番号>はpであるため、

Player[p,1]で表すことができ、

正解である(03)で表示させるべき変数となります。

 

なお、

2次元配列Playerの行番号が「i」である選択肢(Player[i, xxx])がありますが、

変数iは1からn人分増加する変数を示しています。

 

先頭のプレイヤーが「高橋」の場合に、

先頭だけを表示させると、

変数iは(02)の処理で1つ増えるため2となります。

(03)で「高橋」を表示させるためには、

Player[i, xxx]の形式の場合、

iは「高橋」の行番号である「5」が入る必要がありますが、

この段階でiは2なので、

2次元配列Playerの行番号が「i」となっていること自体、

誤りです。

選択肢1. sento

不正解
sentoは先頭のプレイヤーの行番号を格納している変数のため、
プレイヤーの名前を示すものではありません。

選択肢2. p+1

不正解
sentoの値を代入した値がpですが、
p+1はプレイヤーの行番号を1つ加算した値のため、
プレイヤーの名前を示すものではありません。

選択肢3. Player[p,p]

不正解

2次元配列Playerの行番号は「p」で正しいですが、

プレイヤーの名前は、

列番号「1」の2次元配列Playerの要素に格納されるため、

列番号「p」は誤りです。

選択肢4. Player[p,1]

正解

冒頭の説明の通り、

Player[p,1]が選択肢として、

正解となります。

選択肢5. Player[p,2]

不正解

2次元配列Playerの行番号は「p」で正しいですが、

プレイヤーの名前は、

列番号「1」の2次元配列Playerの要素に格納されます。

2次元配列Playerの列番号「2」の要素には、

次のプレイヤーの行番号が格納されるため誤りです。

選択肢6. Player[sento,p]

2次元配列Playerの行番号は「p」で正しいですが、

プレイヤーの名前は、

列番号「1」の2次元配列Playerの要素に格納されます。

 

2次元配列Playerの要素には、

列番号「1」か「2」である必要がありますが、

それ以外の列番号が格納される可能性がある「p」は誤りです。

選択肢7. Player[i,1]

冒頭の説明の通り、

2次元配列Playerの行番号が「i」となっていること自体、

誤りです。

選択肢8. Player[i,2]

冒頭の説明の通り、

2次元配列Playerの行番号が「i」となっていること自体、

誤りです。

選択肢9. Player[i,p]

冒頭の説明の通り、

2次元配列Playerの行番号が「i」となっていること自体、

誤りです。

参考になった数0