【オンライン講座】2025年共通テスト「情報Ⅰ」ついに実施!プログラミング問題(第3問)問3を実際にプログラミング !

2025年1月19日、大学入学共通テスト「情報Ⅰ」 がついに実施されました!オンライン授業では、第3問の問3 を Luaを使ってプログラミング します。
今回の共通テスト問題では、配列のインデックスが「1」から始まるようになっており、同じくLuaも1からスタートする言語 であるため、適したプログラミング言語として使用しました。

こんなことが学べます!

✅ 共通テスト2025 情報Ⅰのプログラミング問題(第3問)問3について
✅ Luaで実際にコードを書いて問題を解く体験
✅ 大学入試レベルのプログラミング思考を身につける

 

※プログラミング問題(第3問)の全問題の解説を知りたい方は、以下のページをご覧ください。

🔗 共通テスト2025 情報Ⅰ「第3問」プログラミング解説ページ

日時: 2025/03/08(土) 17:30 ~ 18:30
場所: オンライン講座
対象: KIDSPROスクール生、KIDSPRO eラーニングをご利用の方
必要なもの: Webブラウザーにつながるパソコン
費用: 無料

※プログラミングも行いますので、myCompilerにアクセスしておいてください。

myCompiler とは?

myCompiler は、オンラインで簡単にコードを書いて実行できる便利なツールで、C, C++, Java, Python, JavaScript(Node.js), Luaにも対応しています。

共通テスト2025 情報Ⅰ 第3問 問3(過去問)の解説

第3問 問3

 

第3問 問3の解答と解説

「ケ」の正解・・・① (kougeihin)

「コ」の正解・・・④ (kougeihinsu)

「サ」の正解・・・② (Nissu[kougeihin] - 1)

「シ」の正解・・・⓪ (Nissu[kougeihin])

プログラムの問題「ケ」「コ」「サ」「シ」を解く手順

手順1
プログラムの概要を確認
問3の文章(26ページ)から、表1 各工芸品の制作日数(再掲)を用いて、図2のような各工芸品の担当と期間を表示するプログラムを作る問題と言うことが分かります。問題「キ」のプログラムでは、工芸品5の担当を部員を割り当てるプログラムでしたが、今回のプログラムではすべての工芸品に担当部員を割り当てることができます。

より分かりやすく図解すると、以下のようなステップで各工芸品の担当者と期間を割り当てるプログラムです。

手順2
変数や配列の意味を確認

各変数の説明は26ページに記載されているので、確認しましょう。

Nissu = [4, 1, 3, 1, 3, 4, 2, 4, 3]工芸品の順番順に制作日数を並べた配列、工芸品1は制作日数4日、工芸品2は1日、・・・、工芸品8は4日、工芸品9は3日。

kougeihinsu = 9工芸品の総数。

kougeihin工芸品の番号。

Akibi = [1, 1, 1]各部員が空きになる日付を管理する配列、どの部員は割当前は1日目が空きとなるので、Akibiの各要素を1に初期設定している。

buinsu = 3部員の総数。

tantou = 1担当部員を部員1に初期設定する。

buin部員番号。

手順3
(05)~(11)行目の「・・繰り返す」を理解し、「ケ」「コ」を推測

26ページの「(05)~(11)行目で各工芸品に対して順に担当と期間を決めていく」という記載から、(05) 行目の「「ケ」を1から「コ」まで1ずつ増やしながら繰り返す」は、各工芸品の担当と期間を決めるfor文ということが分かります。

このことから、1ずつ増やしながら繰り返す変数「ケ」は工芸品の番号を表すkougeihin、繰り返しの上限値「コ」は工芸品の総数「9」が格納されているkougeihinsuと考えることができます。つまり、「ケ」の答えはkougeihin「コ」の答えはkougeihinsuです。

手順4
(10)行目の「表示する」を理解し、「サ」を推測
「表示する」という記載からも推測できるように、図2に示された「各工芸品の担当と期間を一覧にしたメールの文面」を表示するためのプリント文であることが分かります。

次に、Akibi[tantou] + 「サ」が、「各工芸品の担当と期間を一覧にしたメールの文面」のどの部分に対応するかを確認します。上図から分かるように、Akibi[tantou] + 「サ」は、「工芸品1 ⋯部員1:1日目~4日目」の最後の日付部分に対応しています。工芸品1の行では「4」日目、工芸品2は「1」日目、工芸品3は「3」日目と表示されている部分です。

「工芸品1 ⋯部員1:1日目~4日目」の最後の日付は工芸品1の製作が完了する日を意味するので、表1の「各工芸品の製作日数」と図2の「各工芸品の担当と期間を一覧にしたメールの文面」から、Akibi[tantou] + 「サ」「サ」を推測しましょう。なお、Akibi[tantou] には、担当部員(tantou)の空き日が格納されています。

メールの文面に記載されている担当部員のAkibi[tantou]の値を確認し、Akibi[tantou] + 「サ」「サ」の値を算出してみましょう。Akibiの各要素の初期値はAkibi = [1, 1, 1]なので、最初の割り当て時におけるAkibi[1]、Akibi[2]、Akibi[3]の値はすべて「1」Akibi[1] = 1、Akibi[2] = 1、Akibi[3] = 1です。

・「工芸品1 部員1:1日目~4日目」 4 👈 Akibi[1] + 「サ」:(1+3)日目

・「工芸品2 部員2:1日目~1日目」 1 👈 Akibi[2] + 「サ」:(1+0)日目

・「工芸品3 部員3:1日目~3日目」 3 👈 Akibi[3] + 「サ」:(1+2)日目
このことから、工芸品1, 2, 3の割り当て時の「サ」はそれぞれ3, 0, 2となり、表1の工芸品の製作日数である4, 1, 3から1を引いた値になっていることが分かります。つまり、「サ」の答えは工芸品の製作日数から1を引いたNissu[kougeihin]-1です。

※開始日を1日目としているため、(製作日数)ではなく、(製作日数-1)を加えた日が製作期間の最終日となります。

手順5
(11)行目の「Akibi[tantou] = Akibi[tantou] +「シ」」を理解し、「シ」を推測
数学の世界においてAkibi[tantou] = Akibi[tantou] + 「シ」を方程式と考えると、両辺の値が常に一致する必要があるため、「シ」は「 0」 でなければ成り立たないように見えます。

しかし、プログラミングの世界ではこの式は 「Akibi[tantou]の値を更新する処理」 を意味します。簡単に言うと、「元の Akibi[tantou]の値に「シ」を足して、再びAkibi[tantou]に格納する」 ということになります。このことを踏まえて、各工芸品の担当者が確定した後の(11)行目でどのような処理をすべきか考えれば、「シ」が何であるか考えましょう。

Akibi[tantou] には、担当部員(tantou)の空き日が格納されており、各工芸品の担当者が確定した後は担当部員(tantou)の空き日を更新する必要があります。これは、手順1のプログラムの概要を確認すると分かりやすいと思います。例えば、工芸品1を部員1に割り当てたとき、部員1の空き日は1日から5日に更新されます。この5日は、割当前の空き日である1日に工芸品1の制作日数である4日を足して算出しています。

つまり、担当部員(tantou)の Akibi[tantou]の値に、割り当てられた工芸品(kougeihin)の制作日数 Nissu[kougeihin]を足せば、担当部員(tantou)の空き日を更新できます。よって、(11)行目のコードはAkibi[tantou] = Akibi[tantou] + Nissu[kougeihin]となります。このコードを実行すると担当部員(tantou)の空き日を更新できますね。「」の答えは Nissu[kougeihin]です。

プログラミングにおいて a = a + b は、数学の方程式のように a と a + b が常に等しいことを示すのではなく、a の現在の値に b を加え、その結果を a に更新する(置き換える)ことを意味します。JavaScriptやPythonなどのプログラミング言語では a += b のように記述できます。ただし、Lua ではこの書き方は使えません。

 

プログラミングしてみよう!

🎯すべての工芸品に担当部員を割り当てるプログラムを実際にLuaやScratchでプログラミングしてみましょう!できるだけ問題のプログラムの形式と同じにしたかったので、配列の長さを返すlocal buinsu = #Akibiは利用していないことご了承ください。

Lua:すべての工芸品に担当部員を割り当てるスクリプト

-- 工芸品ごとの作業日数(Nissu[kougeihin] に対応)
local Nissu = {4,1,3,1,3,4,2,4,3}

-- 工芸品の総数(9つ)
local kougeihinsu = 9

-- 各部員の空き日を表す配列(部員1が1日目、部員2が1日目、部員3が1日目からスタート)
local Akibi = {1, 1, 1}

-- 部員の総数(local buinsu = #Akibi は使用せずに指定)
local buinsu = 3

-- 各工芸品を順番に処理する
for kougeihin = 1, kougeihinsu, 1 do
    -- 最初は担当を部員1に設定
    local tantou = 1

    -- 部員2から順番に比較して、より早く空いている部員を担当にする
    for buin = 2, buinsu, 1 do
        -- もし現在の部員の空き日が、現在の担当の部員より早ければ(小さければ)担当を変更
        if (Akibi[buin] < Akibi[tantou]) then
            tantou = buin
        end
    end

    -- ↑ for 文の仕組み
    -- 担当を部員1に設定してから、順番に他の部員と「<=」ではなく「<」で比較しているため、
    -- 空き日が同じ場合には、番号の小さい部員が選ばれる。

    -- 担当部員と作業期間を表示
    print("工芸品" .. kougeihin .. "・・・部員" .. tantou .. ":" .. Akibi[tantou] .. "日目~" .. (Akibi[tantou] + Nissu[kougeihin] - 1) .. "日目")

    -- 担当した部員の空き日を更新(担当となった工芸品の製作日数分を追加)
    Akibi[tantou] = Akibi[tantou] + Nissu[kougeihin]
end

 

プログラムがエラーになったら!?

1. 変数名や関数名にスペルミスがないか確認しましょう。

2. for文やif文の構成が正しいか確認しましょう(luaであればdo, then, endの位置や個数に注意)。

3. 誤って全角文字を使っていないか確認しましょう。

4.「=」と「 – 」が間違っていないか確認しましょう。

5.「 [ 」「 { 」「 ( 」が間違っていなか確認しましょう。

プログラミング問題(第3問)の徹底解説!

※luaとScratchによるコードも記載してありますので、ぜひ御覧ください。