自動販売機をプログラミングする-フローチャートやいろいろな設計自動販売機も中に入っているコンピュータで動作しています。今回の授業では、どのようなプログラムが動いているか考えてみましょう。

自動販売機って、どこにでもあって便利だよね

今回は、Scratchで自動販売機のプログラムを作って、プログラムはどのように設計するか見ていきましょうプログラムなどは、「高校「情報科」の教材・指導案作ってみました。」
http://www.beyondbb.jp/ Zipの教材内に入っています。

Ver 1.0 2017/02/15© Go Ota, 2014
1No.1 一番簡単な自動販売機
開始

100円

金額 0000

簡単な仕組みの自動販売機
・100円玉を1枚だけ入れられる・商品は1つだけ・商品切れランプは無し
・お金返却ボタンは無し
・つり銭切れランプは無し
・お金を入れて一定時間たったら自動的にお金返却は無し

まず、始めの一番簡単な自動販売機について考えてみましょう。お金を入れることと製品のボタンを押すことしかできません。
このプログラムの動作をフローチャー
トで表すと右の図のようになります。

No

お金が投入される
Yes

金額を100円にする

No飲み物ボタンが押される
Yes

No

お金が100円入っている
Yes

飲み物缶を出す2

フローチャートの書き方
プログラムの開始と終わり

処理の流れの表記(アルゴリズム)
分岐型
逐次型(直線型)
No

(開始)
処理1
処理2
(終了)

条件

No条件

Yes

Yes

Yesの処理Yesの処理Noの処理

処理3プログラムや人間の判断などのアルゴリズムは基本的に、逐次型、分岐型、ループ型の組み合わせで表現できますね。

ループ型(繰返し型)

ループの処理ループの処理

終了条件

Yes

NoNo

終了条件

ループの処理Yes

無限ループ

後判断ループ前判断ループ3

演習: 一番簡単な自動販売機を作ってみよう。

では、一番簡単な自動販売機をScratchで作ってみましょう。
こんな簡単なしくみでも、ちゃんとした見栄えを考えると大変かもしれませんね。

4

プログラムサンプル1A。[Vending01A]

自動販売機の動きだけをテキストでやってみました。
5プログラムサンプル1B。[Vending01B]

自動販売機のグラフィクを少しだけ追加してみました。
6

プログラムサンプル1C。[Vending01C]

お金を入れたり、ボタンを押したりできるようにすると、少しプログラム自体も複雑になってきます。

7

開始

ちょっとだけ複雑な自動販売機
Yes

100円
売り切れ

金額 0000

簡単な仕組みの自動販売機
・100円玉を1枚だけ入れられる・商品は1つだけ・商品切れランプは有り
・お金返却ボタンは無し
・つり銭切れランプは無し
・お金を入れて一定時間たったら自動的にお金返却無し

もう少し複雑な自動販売機を考えてみましょう。売切れランプを追加します。
フローチャートも少し複雑になりますね。ポイントは、開始直後と「飲み物缶を出す」の後の二か所に、商品の確認をして売切れランプの処理が入ることにあります。初めに品物が無い場合もありますから商品がある
No

売切れランプOn

No

お金が投入される
Yes

金額を100円にする
No

飲み物ボタンが押される

No

お金が100円
入っている

Yes

Yes

飲み物缶を出す
No

商品がある
No

売切れランプOn

8

演習: もうちょっとだけ複雑な自動販売機

120円

返却

売り切れ

金額 0000

簡単な仕組みの自動販売機
・100円玉を1枚だけ入れられる・商品は1つだけ・商品切れランプは有り
・お金返却ボタンは有り
・つり銭切れランプは無し
・お金を入れて一定時間たったら自動的にお金返却無し
もう少し複雑な自動販売機を考えてみましょう。お金返却ボタンを追加します。
この自動販売機のプログラムを作ってみてください。
(早く終わった人は、複数の缶がある場合も作ってみてください。)

今までやったフローチャートにとらわれずに、いろいろな方法でプログラムができると思いますので知恵を絞ってみてください。

9

作ったプログラムを見てみよう A～Eまであるよ
どんなプログラムができましたか?
自動販売機といっても、いろいろな方法でプログラミングできます。そのいくつかを、その設計図といっしょに見ていきましょう。

10

開始

A:単純なフローチャートをもとにした
プログラム

Yes

商品がある
No

売切れランプOnNo

お金が投入される

Yes

金額をxxx円にする

返却ボタンの追加では、お金が現在投入されたとか、金額表示を0円にするなどの処理も必要ですね。
このぐらいになるとフローチャートもごちゃごちゃして判りにくくなりますね。

No

返却ボタンが押された
Yes
お金が投入されている
Yes
お金を返却する

No

金額を0円にする。

NoNo

No

飲み物ボタンが押される
Yes
お金が100円入っている
Yes
飲み物缶を出す商品がある
No
売切れランプOn

11

プログラムサンプル2A。[Vending02A]

フローチャートをもとにしたプログラムです。これもかなりぐちゃぐちゃしてきましたね。
12

B/C サブルーチンでフローチャートをすっきりせたプログラム
メインルーチンサブルーチン1

サブルーチン2

開始

売切れランプの処理

返却ボタンの処理

売切れランプの処理
No

Yes

お金が投入される
Yes

No

Yes
お金が100円入っている
Yes
飲み物缶を出すYes
お金が投入されている
Yes
お金を返却する

戻るNo

金額を0円にする。

サブルーチンの終わりは「戻る」

返却ボタンの処理

飲み物ボタンが押される

返却ボタンが押された

売切れランプOn

金額をxxx円にする

No

No

商品がある
No

戻る

フローチャートが複雑になってきたら、サブルーチンを使いましょう。これは、を使って、フローチャートを分けることができます。サブルーチンに対して、大元のものをメインルーチンと呼びます。

売切れランプの処理

人間は沢山の情報をいっぺんに扱うことができません。そこでチャンクという個別の情報の塊にして扱います。

13

B/C サブルーチンでもっとフローチャートをすっきり
メインルーチンサブルーチン4

サブルーチン3

開始

飲み物ボタンの処理

お金投入の処理

売切れランプの処理

お金投入の処理
返却ボタンの処理

No

飲み物ボタンが押される
Yes
お金が100円入っている
Yes
飲み物缶を出すNo

No

お金が投入される
Yes

金額をxxx円にする
戻る

売切れランプの処理
飲み物ボタンの処理

サブルーチン3
つり銭切れを入れた場合戻る

サブルーチンをもっと作るとメインルーチンがもっとすっきりします。こうすると、この時点の自動販売機のプログラムは1つのメインルーチンと4つのサブルーチンから構成されます。
また、つり銭切れの機能を入れる時は、とりあえず、お金の投入にサブルーチンを入れておいて、後で中身を考えることもできます。

お金投入の処理No

お金が投入される
Yes

金額をxxx円にする
つり銭切れの処理
戻る

14

B/C 構造化設計でプログラミング考えてみる上のモジュールが下のモジュールを利用
している

自動販売機

3つの処理がループになっていることを表す①
売切れランプの処理をする。

お金投入後の処理をする。

返却ボタンの処理をする。

飲み物ボタンの処理する。
①

つり銭切れの処理をする。

①につながって、「売切れランプ…」を利用

フローチャートはコンピュータのプログラムを設計する一つの手法ですが、あまり大きなプログラムには向いていません。現在では多くの設計手法がありますが、構造化設計は古いものですが、手軽に利用できます、また現在の設計手法の考え方のベースになっています。
フローチャートは処理の流れを中心に考えますが、構造化設計はモジュール(サブルーチン)の構造や関係を中心に表現します。この構造を考えると上図のようにシンプルなものになります。

参考図書:ソフトウェアの複合/構造化設計,G.J. マイヤーズ(1978)

15

プログラムサンプル2B。[Vending02B]

モジュール(サブルーチン)使ったプログラムです。随分すっきりしたように見えます。
16

プログラムサンプル2C。[Vending02C]

メッセージで呼ばれる各モジュールは各スプライトのスクリプトを参照してください。

同じくモジュール使ったプログラムです。モジュールはScratchの各スプライトに入れて、メッセージで呼び出しています。
17

D 割り込み処理でプログラムを考えてみる
割り込み処理レジスタ処理(ネコ)

入金

飲み物ボタン

缶出し

売切れボタン

金額変更
表示変更

返却

金額変更
表示変更

飲み物選択

金額変更
表示変更
缶出し
表示変更

割り込み処理は多くのコンピュータを内蔵した製品で使用されています。
ここではUMLのステート図を使って、動作を表現してみました。
18

プログラムサンプル2D。[Vending02D]

割り込みの通知をする各モジュールは各スプライトのスクリプトを参照してください。

各スプライトをクリックすることで割り込みをメッセージで通知するプログラムです。各イベントの発生に対してのプログラムがすっきりします。
19

E オブジェクト指向っぽくプログラミングしてみる
入金

缶飲料制御

+入金(100)
返却+入金(0)

売切れボタン+売り切れボタン変更()- 金額- 在庫数+金額変更()+在庫数変更()飲み物ボタン+飲み物ボタン変更()

缶出し+缶出し()現在多くのプログラムがオブジェクト指向をもとに開発されています。オブジ
ェクトは個々のプログラムがある役割を持って、それが協働して動くことにより大きな仕事をするものです。ここでは、Scratchのスクリプトごとに機能をもたせるようにプログラミングしてみました。
また、その動作をUMLのオブジェクト図類似したもので表現してみました。
20

プログラムサンプル2E。[Vending02E]↑飲み物ボタン↑缶飲料制御各スプライトのスクリプトを参照してください。

各スプライトごとの役割がはっきりしています。
21

自動販売機さん、いつもご苦労様です

何気ない自動販売機でも、いろいろなプログラムの作り方がありますね。

22