第3問-問2を一緒に解答しよう

問2はいよいよ「DNCL」を使ったプログラムの問題です。

プログラムの問題か⋯ちょっと不安だな。

そうだよね。「DNCL」って初めて見たし、どんな感じなんだろう。

そんなに心配しなくても大丈夫ですよ。

最初に「DNCL」がどんな言語なのか確認しましょう。

共通テスト手順記述標準言語 (DNCL)とは

共通テスト手順記述標準言語 (DNCL)とは共通テスト「情報I」で出題されるプログラム言語で次の特徴があります。

DNCLの特徴

  • 大学入学共通テスト「情報Ⅰ」で使われる疑似言語
  • 特定のプログラミング言語ではなく、アルゴリズムを表すための表記
  • プログラムの「処理の流れ」を読み取ることが目的
  • 変数、条件分岐、繰り返しなどの基本的な考え方を扱う
  • PythonやJavaScriptなどの文法知識がなくても読めるよう工夫されている
  • 実際に実行するための言語ではなく、問題を解くための表記

大学入試センターの正式な言語の説明は次のリンクから確認できます。

DNCLでの表記例は次のとおりです。

  引用:令和7年度大学入学共通テスト 試作問題「情報」の概要

変数とか代入は「Python」と変わらないですね。

8,9番の制御文って「if」とか「while」とかですよね?

「もし⋯」とか「⋯の間繰り返す」って日本語になっている。

いいところに気づきましたね。

Pythonに近い部分とそうでないところは日本語で記述されているので戸惑うところはないと思います。

詳しくは問題の解説で確認しますので早速問2から確認していきましょう。

問2の問題

今回の出題テーマ

「DNCL」を使った配列操作

この問題は、IP02-06 配列を使ったプログラムの内容が含まれています。学習は「Python」で行いましたが、基本的なところは「DNCL」も「Python」も変わりません。

配列って複数のデータをまとめて扱うものだったよね?

そうそう。 配列名[添字] っていう使い方をしてました。

そういった考え方や使い方は「Python」と同じですが一つだけ注意が必要です。

「DNCL」は配列の先頭が1から始まることもあります。問題文に記述があるので必ず確認しましょう。

問2 次の文章を読み,空欄 カ ,ク に当てはまる数字をマークせよ。また,空欄 キ に入れるのに最も適当なものを,後の解答群のうちから一つ選べ。

 K さんはまず,次の規則(再掲)に従い,いくつかの工芸品がすでに割り当てられた状況で,その次の工芸品の担当部員を表示するプログラムを作ることにした。

最も早く空きになる部員(複数いる場合はそのうち最小の番号の部員)が,空きになった日付から次の工芸品を担当する。

 最も早く空きになる部員の番号を求めるために,各部員が空きになる日付を管理する配列 Akibi を用意する。この配列の添字(1から始まる。)は部員の番号であり,要素はその部員が空きになる日付である。

 例えば,図1の状況では,配列 Akibi は図3のようになる。図1で部員1は5日目に空きになるため,図3で要素 Akibi[1]は5となる。同様に要素 Akibi[3]は カ となる。

図1 割当図(工芸品4まで)(再掲)

図3 図1の状況に対応する配列 Akibi

 図3において,要素 Akibi[ ウ ]が配列 Akibi の最小の要素であることから,部員 ウ が最も早く空きになることがわかる。

 この考え方に基づき,K さんは配列 Akibi の要素と,部員数が代入された変数 buinsu を用いて,次に割り当てる工芸品の担当部員を表示するプログラムを作成した(図4)。ここでは例として,(01)行目で図3のように配列Akibi を設定している。

図4 次に割り当てる工芸品の担当部員を表示するプログラム

 仮に部員数が変わったとしても,配列 Akibi と変数 buinsu を適切に設定すれば,このプログラムを用いることができる。部員が 5名に増えた場合,(01)行目を例えば Akibi = [5, 6, 4, 4, 4] に,(02)行目をbuinsu = 5 に変更して図4のプログラムを実行すると,(06)行目の代入が ク 回行われ,「次の工芸品の担当は部員3です。」と表示される。

キ の解答群

⓪ buin < tantou

① Akibi[buin] < Akibi[tantou]

② Akibi[buin] > tantou

③ Akibi[buin] > Akibi[tantou]

問2の解説

問2は、DNCLを使った以下の内容が問われています。

  • 配列操作(初期値)
  • 判断の条件(if文の条件)
  • プログラムのトレース

Pythonで配列もif文もトレースもしているけど、DNCLでできるかな?

これも基本的なことしか問われていなそうだからできると思う。

大丈夫です。注意をしないといけないところはありますが、しっかり問題文を読めば解ける問題ばかりです。

早速解説を読んでいきましょう!


カ について考えよう

空欄【カ】は配列操作の問題です。

説明文に、配列の先頭の添字位置の記述があるので、読み飛ばさないようにしましょう!

配列に関する説明文(問題文の抜粋)

 最も早く空きになる部員の番号を求めるために,各部員が空きになる日付を管理する配列 Akibi を用意する。この配列の添字(1から始まる。)は部員の番号であり,要素はその部員が空きになる日付である。

あっ!配列の先頭の添字は1からなんですね。

Pythonとは違うから間違えないようにしないといけないですね。

ここから、配列について次のことが分かります。

配列についての情報

  • 「Akibi」は各部員の空きになる日付を管理する配列である。
  • 配列の先頭の添字は1である。
  • 添字の値は部員の番号である。
  • 要素(配列に入る値)は部員の空きになる日付

これを図3に当てはめてみましょう。

配列Akibiでは、部員1の空きになる日付は5日ということが分かります。

これは図1の情報と一致していることが分かりますね。

Akibi[2]は「3」が入ってますが、確かに図1を見ると部員2の空きになる日付は3だから図1の情報と図3の情報は一致してますね。

これは図1の情報と一致していることが分かりますね。

なるほどね。【カ】は部員3の空きになる日付が入るってことですね。


キ について考えよう

【キ】はDNCLで記述されたプログラムの穴埋めです。プログラムを確認しましょう。

プログラムの穴埋めをする場合は、そのプログラムは何を行っているのかを理解する必要があります。

プログラムの(07)行目を注目してください。

(07)行目のプログラム

(07)表示する("次の工芸品の担当は部員", tantou, "です")

これは、"次の工芸品の担当は部員"という文字と、変数tantouの値と、"です。"という文字を連結させて表示をしています。

問1で最も早い空きがある部員は「部員2」だったから、「次の工芸品の担当は部員2です。」と出したいってことですね。

その通りです。

(01)~(06)までのプログラムは結果である(07)行目を正しく表示するための処理です。

正しい結果を表示するために、「どのような手順を行うのか」を考えていくことが、プログラムを完成させるために大切なことです。

なるほど。そういうことであれば、(06)行までに変数tantouに「2」が入るような処理を作れば良いってことか。

はい、そうです。

各部員の「空きになる日付」は配列Akibiに入ってます。

部員2が担当するわけですが、どういう条件だったのかもう一度確認しましょう。

最も早く空きになる部員(複数いる場合はそのうち最小の番号の部員)が,空きになった日付から次の工芸品を担当する。

変数Akibiには、各部員の「空きになる日付」が入っているから、配列Akibiの最小値が、担当する部員ということですね。

つまりこの問題では,配列Akibiの中から「最小値の位置」を探しているわけですね。

それでは、変数を確認しながらプログラムを再度みていきましょう。

プログラムの先頭(01)~(03)は変数の定義をしています。

各変数は次のデータを表しています。

変数名 説明
Akibi

部員ごとの空きになった日付が登録されている配列。

添字位置が部員番号を表す。

buinsu

工芸品を製作する部員数を管理する。

部員1、部員2、部員3の3名なので初期値は3が代入されている。

tantou

工芸品を担当する部員番号を管理する。

初期値は、最初の部員番号の1が入っている。

この3つの変数と繰り返しの制御をする変数「buin」を使って、(04)~(06)の繰り返し処理で、変数tantouに工芸品を担当する部員番号を入れる処理を行います。

「空きになる日付」が一番早い、つまり値として一番小さい部員の番号を探すんですよね。

最小値を探すやり方は前に学習したよね。

情報活用編でやったよね。

最小値の求め方は次のとおりです。

  • (04)行目で、変数buinの値を2~3まで一つずつ増やしながら配列Akibiの要素と最小値の要素を比較する。
  • 比較した結果、今の最小値より小さい要素が見つかったら、最小値を更新する。

最後に変数「tantou」を表示しているから、変数「tantou」が最小値ということですよね。

そうか、最初に部員1を最小の要素と仮定して、変数「tantou」に入れて、繰り返しは変数「buin」に2をいれて、部員2から比較をしているのですね。

分かった!

「Akibi」の「tantou」番目と「buin」番目を比べて、「buin」番目が小さかったら、「tantou」の値を更新すればいいってことですね!

よくできました。その処理を(05)行目と(06)行目で行っています。

ここまで理解できれば解答群から解答を選べますね。

キ の解答群

⓪ buin < tantou

① Akibi[buin] < Akibi[tantou]

② Akibi[buin] > tantou

③ Akibi[buin] > Akibi[tantou]


ク について考えよう

【ク】は部員数が5名に増えた場合にどうなるかを解答する問題です。

この場合は、プログラムを仮に実行したらどうなるか調べる「トレース」を行って解答を求めます。

部員が5名になり、配列Akibiが指定通りに変わったときのプログラムは次のとおりです。

部員数が5名の場合のプログラム

それでは、配列「Akibi」と担当を表す変数「tantou」、部員を表す変数「buin」の値を使ってどのようにプログラムが動いていくのか確認をしていきましょう。

プログラムを実行した直後の初期状態は次のとおりでです。

プログラム開始初期状態

ここに、変数の値を変えながらどのように処理していくか確認していくのですね。

はい、(04)行目の繰り返し処理を1回行った時に、どの様な処理をしていくかを確認しましょう。

繰り返し1回目

変数「tantou」には「1」、変数「buin」には「2」が入っていった状態で処理を進めます。

(05)行目の条件は、Akibi[buin] < Akibi[tantou]なので、Akibi[2] < Akibi[1]となります。

つまり、6 < 5となるので、条件は成り立ちません。

条件が成り立たない場合は、変数tantouへの代入はしなくていいのですよね?

はい、変数「tantou」は条件が成り立った場合のみ代入されているので、今回は更新されません。

繰り返し2回目

繰り返しの時に変数「buin」は1ずつ増えていくので、繰り返し2回目は変数「buin」には「3」が入ります。

(05)行目の条件は、Akibi[buin] < Akibi[tantou]なので、Akibi[3] < Akibi[1]となります。

つまり、4 < 5となるので、条件は成り立ちます。

条件が成り立つから、変数「tantou」の値を「buin」の値である「3」に更新するのですね。

はい、そうです。
ここで注目して欲しいのは同じ値(Akibi[3]とAkibi[4]の値がともに「4」)の場合は、条件が成立しないというところです。

ここは、条件の書き方によって変わるので注意をしてください。

繰り返し3回目

繰り返しの時に変数「buin」は1ずつ増えていくので、繰り返し3回目は変数「buin」には「4」が入ります。

(05)行目の条件は、Akibi[buin] < Akibi[tantou]なので、Akibi[4] < Akibi[3]となります。

つまり、4 < 4となるので、条件は成り立ちません。

条件が成り立たないってことは、変数「tantou」は更新しないで次の繰り返しに行うということですね。

はい、よくわかってますね。

次の繰り返しに進みましょう。

繰り返し4回目

繰り返しの時に変数「buin」は1ずつ増えていくので、繰り返し3回目は変数「buin」には「5」が入ります。

(05)行目の条件は、Akibi[buin] < Akibi[tantou]なので、Akibi[5] < Akibi[3]となります。

つまり、4 < 4となるので、条件は成り立ちません。

そうかー。最後の部員5も条件が成り立たないので変数「tantou」は更新しないのか。

はい、そうです。

これで繰り返しが終わったので、最後にどのような値が表示されるかはわかりますね。

A n s w e r

答えは、カ=④、キ=①、ク=① です。

DNCLもプログラムなので、Pythonと同じように処理手順を考えていけば、同じようにプログラムを記述することができます。

Well done!

次のステップに進みましょう!

次のステップに進む

← 前のステップにもどる