愛知県立三谷水産高等学校 教諭 山田学

海洋情報技術〔プログラミング〕

指導書

令和７年度大学入学共通テスト『試作問題』を解説
TinyBasic ソフトウェアのダウンロード先

https://tbasic.org/
ファイルをダウンロードし、展開したら、実行ファイルを生徒の実習用フォルダや USB メモリにコピーして使用する。

ソフトウェアの起動をダブルクリックすると、ソフトウェアが起動する。

プログラムを入力する
ウィンドウ

実行結果が表示されるウィンドウ

大学入試用プログラミング言語「ＤＮＣＬ」
高校で学習するプログラミングは、プログラム言語の習得が目的ではなく、プログラム的な思考力やアルゴリズムの理解が目的となります。このため、各学校で用いられるプログラム言語は、Python や、VBA、C 言語、BASIC など様々なものとなります。
しかし、特定の言語に特化した出題をすると，他の言語でプログラミングを習った人が不利となるため、大学入試では、共通テスト用プログラム表記である、疑似コードを用います。このプログラム表記は，何か特定のプログラミング言語を習ったことがあれば，容易に習得できる表記法になっているため、どの言語でプログラミングを学んでも十分理解することができます。

1

海洋情報技術〔プログラミング〕
プログラミング問題

第３問

愛知県立三谷水産高等学校 教諭 山田学

解説
お金を払う際の硬貨の枚数と、お釣りとして受け取る硬貨の枚数を最小にする方法を考えます。
46 円を支払う場合、と支払えばちょうどとなりますが、を支払って、お釣りをもらう方が、やり取りする枚数は少なくなります。

これを上手な払い方としています。
このプログラムを作成するために、金額を入力すると、枚数が最小となる硬貨枚数が返ってくる関数【枚数】を考えます。
枚数（金額）とすると、硬貨の枚数が返されます。

枚数（1） ＝ 1 円玉 1 枚＝ 1枚

枚数（6） ＝ 5 円玉 1 枚 1 円玉 1 枚 ＝ 2 枚
枚数（21）＝ 10 円玉 2 枚 1 円玉 1 枚
では、枚数（46）＝ ア＝ 3枚は何枚になるでしょう。

答えは、上記の図と同様で 6 枚となります。

上手な払い方としては、51 円を支払って、5 円のお釣りをもらうため、客と店間で交換される硬貨枚数の合計イは、枚数(51)＋枚数(5) となります。

これを、商品価格をＸ、お釣りをＹとしたとき、枚数（ウ）＋枚数（エ）は、枚数（Ｘ＋Ｙ）＋枚数（Ｙ）となります。
46 円分の硬貨を払うよりも、お釣りＹ円をもらってでも、枚数が最小となることを考えます。
今回のプログラムでは 100 円以下の商品を想定しているため、枚数（Ｘ＋Ｙ）＋枚数（Ｙ）のＹを 0～99 まで変化させながら、最も枚数が少ないものを答えとします。

3愛知県立三谷水産高等学校 教諭 山田学

5愛知県立三谷水産高等学校 教諭 山田学

解説
実際に硬貨の枚数を計算するプログラムを考えます。
金額が 46 円のときの 10 円の枚数を考えるとき、オ

10 円玉の枚数は、46 ÷ 10 で ４枚

カ残りは、
46 ％ 10 で ６円 となります。 ※演算子％は割った余り（剰余）となります。

プログラムを考えます。

繰り返し内の処理は、maisu に 各硬貨の枚数を加算していくので、硬貨の枚数を計算するときは、金額の大きい硬貨から行います。
（計算例）46 円の場合

クは maisu 、ケは nokori÷kouka[i] となり、コは nokori％kouka[i] となります。

１回目

46 円 ÷

100 円硬貨＝０枚

残り 46 円

２回目
３回目

46 円 ÷
46 円 ÷50 円硬貨
10 円硬貨＝＝０枚
４枚

残り 46 円残り 6 円

４回目

6円 ÷

5 円硬貨

＝１枚

残り 1 円

Cls

５回目

1円 ÷

1 円硬貨

＝１枚

残り 0 円

Dim Kouka(5)

この処理を、BASIC プログラムで記述してみましょう。

For I=0 To 4 Step 1
Read Kouka(I)となります。

Next
硬貨の金額は、あらかじめ配列に格納されています。

Data 1,5,10,50,100

kouka = [1,5,10,50,100]
ここで注意したいのは、配列の添え字は 0,1,2,3,4 となることです。

kingaku = 46
maisu = 0

よって、キは、ｉを４から０まで１ずつ減らしながら繰り返す：となります。

nokori = kingaku
For I=4 To 0 Step -1

繰り返し内の処理を、プログラム的に記述すると、
初期値 maisu = 0 , nokori = kingaku

Next

１回目

nokori 円 ÷ kouka[4]円硬貨 ＝ ０枚

nokori = nokori ％ kouka[4]２回目

nokori 円 ÷ kouka[3]円硬貨 ＝ ０枚

nokori = nokori ％ kouka[3]３回目

nokori 円 ÷ kouka[2]円硬貨 ＝ ４枚

nokori = nokori ％ kouka[2]４回目

nokori 円 ÷ kouka[1]円硬貨 ＝ １枚

nokori = nokori ％ kouka[1]５回目

nokori 円 ÷ kouka[0]円硬貨 ＝ １枚

nokori = nokori ％ kouka[0]となります。
7maisu = maisu + Int(nokori/kouka(I))
nokori = nokori Mod kouka(I)Print maisu

配列を宣言します。
硬貨の金額を順番に配列に格納しています。

硬貨の金額の大きいほうから処理します。
Basic では、割り算の結果に少数が含まれるため、少数以下切り捨てをする Int()で囲います。
また、剰余は％ではなく、Mod を使用します。

愛知県立三谷水産高等学校 教諭 山田学

9愛知県立三谷水産高等学校 教諭 山田学

解説BASIC プログラムで記述したプログラムを関数化します。
Function MAISU(Kingaku)
Dim Kouka(5)For I=0 To 4 Step 1
Read Kouka(I)Next
Data 1,5,10,50,100
maisu = 0
nokori = kingaku
For I=4 To 0 Step -1
maisu = maisu + Int(nokori/kouka(I))
nokori = nokori Mod kouka(I)Next
MAISU = maisu
End Function

Kingaku は関数呼び出し時に受け取るため、ここで記述する。

関数の戻り値として指定する。

サは tsuri 、シは 0 、スは 枚数(shiharai)、セは 枚数(tsuri) となる。
そして、maisu が、今までの最小値 min_maisu より少なければ、これで、プログラム中から、maisu を 最小値とするため、ソは maisu、タは min_maisu となる。

maisu = MAISU(46)のように記述すれば、46 円の硬貨枚数が maisu に格納されるようになる。
BASIC プログラムで、これを記述すると以下のようになる。
やり取りする硬貨の枚数が最小となる支払額を求めるプログラムを考える。
〔変数〕

商品の価格

kakaku

お釣りtsuri

最小の枚数min_maisu

お金を支払ってお釣りをもらう際に、やり取りする硬貨の枚数が最小のものを探す。
つまり、支払う金額は kakaku + tsuri となり、お釣りとして受け取る金額は tsuriである。このため、MAISU(kakaku + tsuri)+MAISU(tsuri) が最小となるものを探せばよいこととなる。
商品の価格 kakaku は変わらないため、お釣りの額 tsuri を 0 から 99 まで変動させながら、やり取りする硬貨の枚数 maisu を計算し、最小の枚数が解となる。

11kakaku = 46
min_maisu = 100
For tsuri = 0 To 99 Step 1
shiharai = kakaku + tsuri
maisu = MAISU(shiharai) + MAISU(tsuri)
If maisu < min_maisu Thenmin_maisu = maisu
End If
Next
Print min_maisuFunction MAISU(Kingaku)
Dim Kouka(5)For I=0 To 4 Step 1
Read Kouka(I)Next
Data 1,5,10,50,100
maisu = 0
nokori = kingaku
For I=4 To 0 Step -1
maisu = maisu + Int(nokori/kouka(I))
nokori = nokori Mod kouka(I)Next
MAISU = maisu
End Function

関数部分