見出し画像

IchigoJam BASICで共通テスト「情報」に備えよう② DNCLとIchigoJam BASICについて

 本記事はMAZDA Incredible Lab 松田孝さんの連載【IchigoJam BASICで共通テスト「情報」に備えよう】の2回目です。1回目「プログラミング教育の課題」はこちらをご覧ください。

身近な出来事をプログラムで表した共通テストの設問


 前回は、小中高を通じてテキストプログラミングの学習時間が少なく、共通テスト対策に不安があることをお伝えしました。今回はその共通テストの試作問題をもう少し具体的に見ていきましょう。

 試作問題の第3問では、「客がある商品を購入した時に支払う硬貨の枚数と受け取る釣り銭の枚数の合計を最小にする払い方」のプログラムを考えます。計算を簡単にするために、「100 円 以下の買い物とし、使う硬貨は 1 円玉、5 円玉、10 円玉、50 円玉、100 円 玉のみで 500 円玉は使わない」前提となっています。
 
 例えば、46円の商品を買った時の「支払う硬貨の枚数と受け取る釣り銭の枚数の合計」の最小値は何枚だと思いますか?
 
 答えは3枚です。「10円、10円、10円、10円、5円、1円」と6枚で支払うより、「50円、1円」の2枚を支払い、5円硬貨(51円-46円)1枚を釣り銭として受け取った方がやり取りする枚数が少ないからです。

 この考え方を使って、100円以下の買い物をした時に「払う硬貨の枚数と受け取る釣り銭の枚数の合計を最小にする」プログラムをDNCL(共通テスト手順記述標準言語。詳細は1回目の記事参照)という言語で作成します。
 本問はまさに、購買における硬貨のやり取り(枚数)という社会事象を、情報の動き(プログラム)として表現するというコンピュータサイエンスの問題です。

IchigoJam BASICを学んでいれば、DNCLが小学校高学年でも理解できるようになる


 さて以下は、「客がある商品を購入した時に支払う硬貨の枚数と受け取る釣り銭の枚数の合計を最小にする払い方」を求める前段として、「目標の金額ちょうどになる最小の硬貨枚数を計算するプログラム」を問うた問題(第3問の問2)です。例えば、46円であれば、6を返すプログラムです。各行の意味は図の通りになります。

 解答にあたっては問題文をよく読んで空欄を埋めることになりますが、IchigoJam BASICを学んでいれば、関連するコマンドやアルゴリズム等が思い起こされ、問題文のプログラムを容易に読むことができるようになります。今回であれば、図のように想起されます。

 拙著『IchigoJamでできるテキストプログラミングの授業』のアニメーションやゲーム作りに挑戦した小学校高学年の児童たちに、上記問題文のプログラムをIchigoJamBASICに置き換えて説明すれば、十分に理解することができると思います(配列は巻末付録3に、変数はアニメーション「線香花火」、繰り返しはゲーム「高跳び」から登場してきます)。

DNCLをIchigoJam BASICに置き換えてみる


 さて上記問題は、第3問の問2にある先生(T)と生徒(S)の会話文と解答例示箇所を参照して「キ」「ク」「ケ」「コ」を埋めると、次のようなプログラムになります。

 そしてこのDNCLをIchigoJam BASICでプログラムを書き直すと、例えば、次のようになります。

 言語の仕様が異なることと、IchigoJam BASICでは変数をアルファベット1文字(kingakuはK、maisuはM、nokoriはN)で表すことから、プログラムの表記は同じではありませんが、内容は同じです。一目でDNCLの(1)から(7)が、IchigoJam BASICの行番号に対応していることがわかります。解説については、記事の最後に参考として付けています。興味のある方は目を通してみてください。

無料でプログラムを実際に試せる


IchigoJam BASICの素晴らしいところは、IchigoJam Webで作成したプログラムを無料で何度も試すことができる点です(通信料は利用者負担)。
 本プログラムも、RUN実行すれば、その結果である「6」が表示されます。試しに行番号20のK=46の46の値を1から99までの任意の数字に変えて、さまざまに試してみてください(この時、修正は必ずエンターキーを押して上書きすることが極めて重要なプログラミングスキルであることも体感できるはずです)。

 このように、IchigoJam BASICに慣れておけば、プログラムを読み解くことについて過度に恐れる必要はありません。IchigoJam BASICによるプログラミング体験を重ねておけば、問題にあるプログラムの関数の考え方や配列、変数、代入をはじめとする各種演算子、そして繰り返し等のプログラミングに関する知識と技能が、社会事象を表現するコマンドや、それらがアルゴリズムとなって構文を構成していたりすることが実感的に理解することができるからです。
 つまり、机上の理論として頭に入れる苦行ではなく、自身のプログラミング体験と重ね合わせた実感を伴った理解として入試教科「情報」のプログラミングに対応する力がしっかりと身につくのです。ここに小学校段階から、テキストプログラミング(IchigoJam BASIC)に触れておくアドバンテージがあります。

次回は、今回の解説を踏まえて、問3を一緒に考えていきたいと思います。

<参考>解説:DNCLをIchigoJam BASICで置き換え、問2を考えてみる


 改めて、以下がDNCLをIchigoJam BASICで置き換えた問2のプログラムです。なお、行番号30と60の「:」は、DNCLの「,」に対応し、コマンドをつなぎます。

<行番号10>
 行番号10のLETは複数のデータを格納する配列で、ここでは0番目が100、1番目が50、2番目が10、3番目が5、4番目が1という意味になります。問題では「1 5 10 50 100」で「4番目から0番目まで1ずつ減らしていく」ですが、IchigoJamでは 40 FOR I=40 TO 0 というコマンドが通らないため 、「100 50 10 5 1」と並べ「0から4まで1ずつ増やしていく」としました。

<行番号20 30> 
 行番号20と30のK、M、Nは変数で、1つのデータをしまう箱のイメージです。

<行番号40 50 60>
 行番号40から60は繰り返しです。FOR からNEXTで囲まれた箇所を繰り返します。Iというのは配列LETの何番目かを表す変数で、「I=0 TO 4」とすることで、0番目(100)から4番目(1)までを順番に代入しながら繰り返すことになります。

つまり、
100円玉(I=0)を使う枚数を調べる
→50円玉(I=1)を使う枚数を調べる
→10円玉(I=2)を使う枚数を調べる
→5円玉(I=3)を使う枚数を調べる
→1円玉(I=4)を使う枚数を調べる
→何枚使用したかを表示する
というプログラムが組まれています。

 行番号50でMにN/[I]の演算結果を足し、それを新たにMとします。
・行番号30のM=0より、最初の繰り返しではMは0です。
・Nは最初、行番号30でN=Kとなっていることから、Kと同じ46です。
 その46を「配列のI番目」で割ります。行番号10でLET[0]は100の値が代入されているので、N/[I]は46÷100で0となります(IchigoJam BASICでは小数は表しません)。したがって、M+N[I] は0+0で、左辺は0です。

<行番号60>
 行番号60の%は、剰余演算子でわり算のあまりを表します。つまりN%[I]で、N=46を[I]=100で割ったあまりを表すということです。46÷100=0あまり46となり、N=46となります。このN=46が2回目の繰り返しでNとして使われるのです。

ここで行番号40に戻ると、I=1の場合も、M=0、N=46のままです。

Mの数値が変化するのは3回目の繰り返しでI=2になった時、つまり10円玉の数を調べる時です。
 
行番号50のM=M+N/[I] の右辺は「0+46÷10」 となり、左辺のMは4になります。
行番号60のN=N%[I] の右辺は 「46÷10のあまり」となり、左辺のNは6になります。
これを、I=3(5円玉のケース)・I=4(1円玉のケース)でも繰り返していくとそれぞれの回でMの数が1つずつ追加され、M=6となります。
 

プログラムでやっていることを表にまとめてみました

 Iが0~4となるケースを繰り返した後、行番号70でMの値を表示します。PRINTコマンドは、DNCLが日本語表記するように「表示する」コマンドです。これで目標の金額ちょうどになる最小の硬貨枚数を計算して表示するプログラムができました。