共通テスト(情報) 過去問
令和6年度(2024年度)追・試験
問33 (<旧課程>情報関係基礎(第3問) 問4)
問題文
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つ選べ。
付箋
付箋は自分だけが見れます(非公開です)。
このページは閲覧用ページです。
履歴を残すには、 「新しく出題する(ここをクリック)」 をご利用ください。
問題
共通テスト(情報)試験 令和6年度(2024年度)追・試験 問33(<旧課程>情報関係基礎(第3問) 問4) (訂正依頼・報告はこちら)
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人分の名前を手番の順に次々と表示させることができます。
sento には、先頭プレイヤー(「高橋」)の(表1)での行番号である「5」が格納されています。(04)行が「p←sento」だと、次に(03)行の処理するときの手続き「player[p,1]を表示する」が具体的には「player[5,1]を表示する」となり、再び先頭プレイヤー(「高橋」)の名前が表示されることになり、正しくありません。
最初sentoには、先頭プレイヤー(「高橋」)の(表1)での行番号「5」が格納され、(01)行でその値がpに代入されているのでp=5、したがってp+1=6となります。これより、次の(03)行の処理「player[p,1]を表示する」が具体的には「player[6,1]を表示する」となりますが、player[6,1]は(表1)には存在せず、何も表示されません。よって、正しくはありません。
変数pには、先頭プレイヤー(「高橋」)の(表1)での行番号「5」が格納されています。
よって最初の(04)行の処理は具体的には「p←player[5,5]」となりますが、(表1)には5列目はないので、pに次に表示されるプレイヤーの行番号が正しく格納されることはありません。よって、正しくはありません。
変数pには、先頭プレイヤー(「高橋」)の(表1)での行番号「5」が格納されています。よって、player[p,1]は具体的にはplayer[5,1]となりますが、player[5,1]はプレイヤーの「名前」が格納されています。よってpに次に表示されるプレイヤーの「行番号」が正しく格納されることはありません。よって、正しくはありません。
最初の説明で述べた通り、正しい選択肢です。
sentoには、先頭プレイヤー(「高橋」)の(表1)での行番号「5」が格納され、(01)行でその値がpに代入されているのでp=5です。よって、「player[sento,p]」は、具体的には「player[5,5]」となりますが、(表1)で5列目はなく、次の(03)行の処理「p←player[5,5]」で、pに次に表示されるプレイヤーの行番号が正しく格納されることはありません。よって、正しくはありません。
最初、iの値は「1」です。したがって、player[i,1]は、具体的にはplayer[1,1]となりプレイヤー「小池」の「名前」を表しています。よって、次の(03)行の処理「p←player[i,1]によって、pに次に表示されるプレイヤーの「行番号」が正しく格納されることはありません。よって、正しくはありません。
最初、iの値は「1」です。したがって、player[i,2]は、具体的にはplayer[1,2]となりますが、(表1)を見るとその値は「4」です。したがって、次の(03)行の処理で、「player[4,1]すなわち、「渡辺」の名前が表示されてしまいます。よって正しくはありません。
最初、iの値は「1」です。また、sentoには、先頭プレイヤー(「高橋」)の(表1)での行番号「5」が格納され、(01)行でその値がpに代入されているのでp=5です。したがって、player[i,p]は、具体的にはplayer[1,5]となりますが、(表1)で5列目はなく、pに次に表示されるプレイヤーの行番号が正しく格納されることはありません。よって、正しくはありません。
(図2)の(04)行で、pに格納されるのは次に表示されるプレイヤーの「行番号」です。したがって、選択肢にある中で、player[○,■]の中で、■の部分が「2」以外は間違いとなります。(player[○,1]は(表1)の1行目で、「番号」でなく「名前」ですので!)
これで、選択肢を大きく絞ることができます。
参考になった数0
この解説の修正を提案する
02
図2はプレイヤーの名前を手番の順に表示する手続きなので、
(04)行目で次のプレイヤーの行番号を指定します。
✕
先頭のプレイヤーの行番号です。
✕
プレイヤーの行番号+1という数字です。
✕
p=1のときPlayer[1,1]、p=2のときPlayer[2,2]、…となり、次のプレイヤーの行番号を正しく指定できません。
✕
プレイヤーの名前です。
○
次のプレイヤーの行番号です。
✕
sento行の名前や次のプレイヤーの行番号などです。
✕
i行目のプレイヤーの名前です。
✕
i行目の次のプレイヤーの行番号です。
iは1からnまで1ずつ増えるので(図2(02))、手番の順に表示することができません。
✕
i行目の名前や次のプレイヤーの行番号などです。
参考になった数0
この解説の修正を提案する
03
この問題で覚えておくべきポイントは以下の通りです。
先頭のプレイヤーの行番号であるsentoを変数pに格納して、
iをカウントしてn人分たどりながら、
プレイヤーの名前を表示する処理を表したのが、
図2となります。
(03)には、
プレイヤーの名前を表示させるために、
( ウ )に入るべき変数は、
プレイヤーの名前が格納されている2次元配列の要素である、
Player[p,1]となります。
以下の記述にある通り、
処理の流れ的には、
(04)の処理を経た後、
iがnになるまで1ずつ増やしながら、
(03)の処理に戻り、
Player[p,1]を表示される処理が行われます。
(04)の処理の後、
(03)に戻った際に次の並びとなるプレイヤーの名前を表示させるためには、
(03)の前の処理である、
(04)では変数pに次の並びとなるプレイヤーの行番号が入る必要があります。
次の並びとなるプレイヤーの行番号は、
2次元配列Player[xxx,2]の要素を示しています。
上記に従うと、
(03)では、
Player[p,1]を表示
(04)では、
現在の行番号であるpの次の行番号を示す
Player[p,2]をpに代入
という流れになります。
なお、
2次元配列Playerの行番号が「i」である選択肢がありますが、
変数iは1からn人分増加する変数を示しています。
先頭のプレイヤーが「高橋」の場合に、
先頭だけを表示させると、
変数iは(02)の処理で1つ増えるため2となります。
(03)で「高橋」を表示させるためには、
Player[i, xxx]の形式の場合、
iは「高橋」の行番号である「5」が入る必要がありますが、
この段階でiは2なので、
2次元配列Playerの行番号が「i」となっていること自体、
誤りです。
不正解
sentoは先頭のプレイヤーの行番号を格納している変数のため、
次の並びとなるプレイヤーの行番号を示すものではありません。
不正解
プレイヤーの行番号を1つ加算した値(p+1)が、
pに代入されることを示しており、
一見正解に近いように見られます。
ただし、
現在の順番であるプレイヤーの次の行番号が、
1加算された値であれば問題ありませんが、
表1ではそのようになっていないため誤りです。
※行番号「5」である「高橋」の次の行番号は「3」
不正解
次の並びとなるプレイヤーの行番号は、
列番号「2」の2次元配列Playerの要素に格納されるため、
列番号「p」の部分が誤りです。
不正解
次の並びとなるプレイヤーの行番号は、
列番号「2」の2次元配列Playerの要素に格納されるため、
列番号「1」の部分が誤りです。
正解
冒頭の説明の通り、
Player[p,2]が選択肢としては、
正解となります。
不正解
次の並びとなるプレイヤーの行番号は、
列番号「2」の2次元配列Playerの要素に格納されるため、
列番号「p」の部分が誤りです。
不正解
冒頭の説明の通り、
2次元配列Playerの行番号が「i」となっていること自体、
誤りです。
不正解
冒頭の説明の通り、
2次元配列Playerの行番号が「i」となっていること自体、
誤りです。
不正解
冒頭の説明の通り、
2次元配列Playerの行番号が「i」となっていること自体、
誤りです。
参考になった数0
この解説の修正を提案する
前の問題(問32)へ
令和6年度(2024年度)追・試験 問題一覧
次の問題(問34)へ