プログラミング入門 - wide project · 2004. 11. 9. · プログラミング入門...

90
プログラミング 6 マルチタスク : [email protected] N205 2004 プログラミング 6 マルチタスク – p.1/90

Upload: others

Post on 12-Sep-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

プログラミング入門第6回「例外と簡単なマルチタスク処理」

講師:斉藤賢爾[email protected]

∆ 棟 N205

2004 年度秋学期

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.1/90

Page 2: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

今日のメニュー

はじめに

前回のおさらい

課題レビュー

Cricketにおける例外とマルチタスク処理

練習問題 1: 機敏な計算機

練習問題 2: スロットマシン

課題の出題

実習

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.2/90

Page 3: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

はじめに今週の配布物

みなさんのコメントから

どこまで来たかな?

今日のゴール

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.3/90

Page 4: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

今週の配布物次のものをみなさんに配布します

Cricket本体 × 1 個 (+電池)

赤外線インタフェース × 1 個 (+電池)

シリアルケーブル × 1 本

モーター (グレイ: 中速,赤: 低速) ×各 2 個

モーターケーブル × 2 本

4 桁ディスプレイ × 1 個

バスケーブル × 1 本

タッチセンサー × 1 個

光センサー × 1 個

反射センサー (距離センサー) × 1 個

授業が終わったら回収します

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.4/90

Page 5: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

みなさんのコメントから©1

ifや waituntilの使い方を忘れてしまって、1から nまで足すプログラムを書けなかった

復習怠るべからず

⇒ 繰り返して練習することが大切です授業時間だけでは練習の機会が少なく、授業時間外だと Cricketが使えない、という問題もありますが、前回、紹介した UCB Logoなどを活用してみてください研究室に来てくれたら、Cricketを使ってもらってもよいと思っています私 (斉藤)がいる時間を確認して来てくださいね

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.5/90

Page 6: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

みなさんのコメントから©2

出題内容に即して、部品に分けたものを書こうとしたが、どうしてもエラーが出て読み込めないために普通に書いただけになった

ぜひとも一度解説いただきたいと考える

⇒ 多分、解説しても問題は解決しません同じ説明を繰り返すだけですし、おそらく、自分でも説明を読み返してみて、それでも問題は解決しなかったのでしょうから、もう一度説明を受けることで問題が解決する可能性は薄いです

しかし、ソースコードを見せてもらえば、どこがエラーになったか分かり、問題を解決することができます問題があったら、ソースコードを見せるのが基本です

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.6/90

Page 7: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

授業調査から

今までの段階で授業に対してどのように感じますか予習も復習もいらない感じ

⇒ これが嘘だということは、実感しましたね!

今後この科目に期待することは何ですかクラスメイトと仲良くなりたい

⇒ これから共同作業することも増えてきます論理的に考える練習

⇒ 努めて頭の体操もしていきたいですが . . .問題解決そのものが論理的な思考を必要とします

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.7/90

Page 8: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

どこまで来たかな?

第 1 回 9/29 Cricket入門

第 2 回 10/ 6 フローチャートで理解する

第 3 回 10/13 PADによるアルゴリズムの表現

第 4 回 10/20 簡単なルールで動くロボットの制作

第 5 回 10/27 手続きと段階詳細化

第 6 回 11/10例外と簡単なマルチタスク処理

第 7 回 11/17 状態遷移図によるシステムの記述

第 8 回 12/ 1 Cricketにおける赤外線通信

第 9 回 12/ 8 プロデューサ/コンシューマモデルによる設計

第 10 回 12/15 データの収集と利用

第 11 回 12/22 デザインワークショップ I ∼設計と実装第 12 回 1/10 デザインワークショップ II ∼テストしよう第 13 回 1/17 デザインワークショップ III ∼発表

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.8/90

Page 9: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

今日のゴール

簡単なマルチタスク処理を利用したプログラムを作れるようになる前回学んだ「手続き」とは別の種類の、プログラムの分割の方法です

難しく見える点では、全日程を通して今日がピークかも知れませんこれ以上複雑なことは Cricketには用意されていません

「手続き」もそうですが、難しく見える反面、覚えることでプログラミングが簡単になるという効果があります分割した方が内容を把握しやすくなるからです

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.9/90

Page 10: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©p マルチタスクとは©1マルチタスク (multitask)

1 台のコンピュータで複数の作業 (タスク)を同時に処理すること

プロセッサ (中央処理装置)がひとつしかないコンピュータでは、細かい時間でタスクを切り替えて、複数、同時に処理しているように見せかけます

パソコンもマルチタスク処理を行なっていますただし、みなさんがマルチタスクを実感するのは、大抵、複数のアプリケーション (メーラやWebブラウザなど)を実行しているときですそれぞれの処理は独立していて、みなさんの頭の中で関係づけられています

複数のタスクが協調してひとつの目的を達成するという、マルチタスクの醍醐味みたいなものは分かりにくいと思います

今日は、マルチタスクの醍醐味を体験してくださいといっても、Cricketは簡単なマルチタスク処理しかできませんから、簡単な例で体験してもらうことになります

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.10/90

Page 11: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©p マルチタスクとは©2電波の受信

電波強度の監視

着メロ再生

伝言再生アニメーション再生

ボタン操作受け付け

電池残量の監視

例: 携帯電話

さまざまなタスクが同時に動いて携帯電話を実現しています

もし、ひとつの処理の流れとして書こうとすると . . .

とても複雑になります反応が遅くなります

優先順位の高いタスクは、他のタスクに割り込むことができます伝言を再生しているときに着信があったら、伝言の再生を中断して着メロを再生します着メロの再生中に受信ボタンが押されたら、着メロの再生を中断して通話を始めます

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.11/90

Page 12: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

今日の体験メニュー

次の練習問題や課題で体験します1. 前回作った、1から nまで数を足し合わせる計算機の動作を機敏にしてください (練習問題)

2. スロットマシンを作ってください (練習問題)3. センサーが感知する周囲の情報を、何らかの形で人間に伝えるロボットを作ってください (課題)

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.12/90

Page 13: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

今日のメニュー

はじめに

前回のおさらい

課題レビュー

Cricketにおける例外とマルチタスク処理

練習問題 1: 機敏な計算機

練習問題 2: スロットマシン

課題の出題

実習

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.13/90

Page 14: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

前回のおさらい手続きとその呼び出し

Cricket Logo

今週の TIPS

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.14/90

Page 15: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©p 手続きとはあるまとまった処理に名前をつけたものです

意味のある名前で扱うことにより、人間がプログラムの内容を把握しやすくなります

呼び出して利用できる、プログラムの部品です日常的に使われる手続き (住民票の異動など)は、特定の窓口に情報を渡すと、何かまとまった処理がその向こう側で行なわれます

同じように、手続きに対して情報を渡して何かをしてもらったり、手続きから情報を得ることができます

部品を交換することで、改造がしやすくなります

トップダウンとボトムアップトップダウン: 問題をブレークダウンしていきます (段階詳細化)

ボトムアップ: 使える部品から考えていきます

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.15/90

Page 16: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L 手続きの定義と©o 呼び出し

手続きを定義するには . . .

(proc)ブロックを使いますこのかたち自体はおなじみですねクリックして手続きの名前を入力できます

手続きの中で (stop)ブロックを用いると、その場でその手続きを終了します

loopと組み合わせて、一般的な反復のかたちの代わりに用いることができます

手続きを呼び出すには . . .

(call)ブロックを使いますクリックすると、現在定義されている手続きの名前が切り替わっていきます先に、procブロックで手続きを定義している必要があります

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.16/90

Page 17: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L 今週の TIPS

(proc)ブロックの使い方procブロックに手続きの中身を付けていないと、ダウンロード時に “Missing ablock”というエラーになります

blankブロックでよいので付けておくと、エラーを回避できます

手続きの名前が、“display” など、既存のブロックの名前と重なると正常に動作しません既存のブロックの名前を手続きの名前に使わないようにしましょう

(call)ブロックの使い方手続きの名前に空白や ‘.’ があると、プログラムを開いたときに正しい手続きの名前を読み込めません手続きの名前には英数字だけを用いるようにしましょう

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.17/90

Page 18: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©p 一般的な反復の©o 代わりの書き方

一般的な反復

条件 処理

条件が真の間、繰り返し処理を行ないます1. 条件を判定します2. 真なら処理を行ない、偽なら反復を抜けます3. 1に戻ります

Cricketでの、代わりの書き方

general_repeat = loop¬条件 ��

��STOP

処理 

手続きになっている必要があります

‘¬’は論理否定 (not)を表しますプログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.18/90

Page 19: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©p Logo言語とは

MITで開発されたプログラミング言語です初心者でも扱いやすいように設計されていますCricket Logo/LogoBlocksは、Logo言語に基づいています

ギリシャ語の logos (言葉)が語源です

Lispというプログラミング言語を元にしていますLispはとても強力な言語として知られています難しいことを簡単に表現できて、かつ、いろいろなことを表現できます

Logoはこども向けということで、過小評価されることが多いようですが、実は同様に強力な言語です

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.19/90

Page 20: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L Cricket Logoの特徴

Cricket LogoBlocksでできることが全部できますCricket LogoBlocksは、Cricket Logoを視覚化したものです

3個以上の変数を宣言して用いることができます

手続きに引数 (後述)を渡すことができます

手続きから戻り値 (後述)を受け取ることができます

Cricket Logoを用いるためには、Jackalアプリケーションを使います

LogoBlocksとは同時に使えませんので注意してください

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.20/90

Page 21: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L Jackalアプリケーショ©o ンの使い方

ここにスタートボタンが押されたときに実行される手続きの呼び出し形を書きます。

ここにプログラムを書きます。プログラムは手続きの定義の並びです。

ここにコマンドを入力して�Cricket�を操作できます。

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.21/90

Page 22: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©p 引数と戻り値ひきすう引 数とは

手続きに渡す情報です (Cricket Logoの場合は数)

実引数と仮引数があります実引数: 手続きを呼び出すときに実際に指定する数· 例: wait 30, display this

仮引数: 手続きを定義するときに仮に名前をつけて使う数· Logo言語では、:nのように ‘:’ を付けた名前で表します

戻り値とは

手続きが結果として返してくれる値です (Cricket Logoの場合は数/真偽値)例: switcha (タッチセンサー aが押されているかを返します)

手続きの呼び出し形は、実行時に戻り値で置き換わると考えてください(x + 3) × (x + 2)などの式を考えると分かりやすいでしょう

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.22/90

Page 23: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©p 手続きの呼び出しと©o 計算

to�random�����:

to�setvalues�:x����:����:����:

to�spinReels����loop�[��������setvalues�getReelValues�fixed��������:����]end

to�getReelValues�:n����:����ifelse�:n�<�1�[��������output�(random�%�889)...����][��������:��������output�(random�%�89)�...���������:

・手続きの呼び出しは式の項の計算と同様に扱われる

・手続きの呼び出し形は手続きの計算結果で置き換わる

・引数は手続きを呼び出す前に計算される

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.23/90

Page 24: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

おさらい: 1から nまで足す計算機を作る

Cricket Logoで作ります

引数と戻り値を使います

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.24/90

Page 25: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L 数を入力する (input)

;スイッチが押される間に数えた数を返します。to input

waituntil [switcha]setcount 0loop [

wait 10if not switcha [

output count ;手続きを終了して、数えた数を返します。]setcount count + 1beep

]

end

呼び出し形は inputです

呼び出し形は、入力した値を持つ数として扱えますプログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.25/90

Page 26: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L 数を確認する©o (confirm)

; :nを表示し、そのまま返します。to confirm :n

display :nwait 30output :n

end

Logo言語では、仮引数を ‘:’ で始まる名前で書きます

上の例では :nで、実引数として指定される数を :nと仮に名前をつけて使います

呼び出し形は confirm数です

呼び出し形は、入力した値を持つ数として扱えます

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.26/90

Page 27: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L 足し合わせる (sum)

; 1から :nまで足し合わせた数を返します。to sum :n

output ((:n + 1) * :n) / 2

end

呼び出し形は sum数です

呼び出し形は、足し合わせた結果の数として扱えます

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.27/90

Page 28: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L 結果を表示する©o (out)

; :nを表示します。to out :n

display :n

end

呼び出し形は out数です

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.28/90

Page 29: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L トップレベル (run)

; count: 入力する値を数えるために用います。global [count]

;入力した数を確認の上、足し合わせて結果を表示します。;センサーポート a: タッチセンサー。;バスポート: 4 桁ディスプレイ。to run

loop [out sum confirm input

]

end

変数がひとつ減りました

手続きの間の関係が明確になりました

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.29/90

Page 30: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

今日のメニュー

はじめに

前回のおさらい

課題レビュー

Cricketにおける例外とマルチタスク処理

練習問題 1: 機敏な計算機

練習問題 2: スロットマシン

課題の出題

実習

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.30/90

Page 31: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

課題レビュー課題をふりかえる

提出状況と傾向・総評

今週の Thumbs Up!

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.31/90

Page 32: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

課題5. 組曲「冬の情景」

あなたの想う、冬の情景をタートルグラフィクスで描いてください。

条件UCB Logo (後述)を用いてください。· UCB Logoでは、注釈に日本語が使えないので、英語かローマ字で注釈を書いてください

図形を部品としてとらえて、図形を描く手続きを組み合わせて描いてください。

例えば、三角形と縦線で表した針葉樹を並べて描くなど、単純な図形を組み合わせて描いてみましょう。三角形を描く手続き triangle を定義しますtriangle と縦線を組み合わせて、針葉樹を描く手続き coniferを定義しますconifer を何度も呼び出して針葉樹林を描きます

これから体験してもらう樹木曲線を使ってもよいでしょう。

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.32/90

Page 33: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

提出状況と傾向

18人中 6人提出 (SOI学生含む)全員出しましょう (出足が鈍く、心配しました)難しかったですか?SOI学生からの投稿もお待ちしております

傾向と総評手続きを定義できた人が少なかったですきっちり復習しますので、次の課題で是非チャレンジしてください人間にとって読みやすいプログラムという面では、全員、もうちょっと努力が必要と思います

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.33/90

Page 34: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

組曲「冬の情景」

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.34/90

Page 35: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

今週の Thumb Up!

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.35/90

Page 36: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

柳川晋伊知郎さんの作品

「冬の情景」

山と森を描いてくれました手続きを定義できています引数も使えています変数名は、長くても意味のある名前を用いると読みやすくなります注釈を充実するともっとよかったと思います後述するスロットマシンのテンプレートを参考にしてください字下げ (indentation)も活用してください

PADに直したときに縦の位置が揃うように行の書き始めをずらします

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.36/90

Page 37: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

今日のメニュー

はじめに

前回のおさらい

課題レビュー

Cricketにおける例外とマルチタスク処理

練習問題 1: 機敏な計算機

練習問題 2: スロットマシン

課題の出題

実習

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.37/90

Page 38: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

Cricketにおける例外とマルチタスク処理

例外とは

マルチタスクとは

Cricket での例外/マルチタスク処理

whenブロックの動作を確かめる

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.38/90

Page 39: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©p 例外とは例外 (exception)

プログラムの実行中に、例外的な状況が発生して、それ以上そのまま実行を続けられなくなること実行は中断して、例外処理を行ないます

例: 何かの数を 0で割った場合 (Cricketでは結果を 0にします)

Cricketでは、例外の条件をプログラマが自由に定義できます

例外処理プログラマが自分で定義できます

例外処理が終わると、中断したところからプログラムの実行が再開します

プログラムに対する割り込み処理だと考えられます何か変なことが起こったら割り込んでプログラムの実行を中断し、事態を収拾してからプログラムの実行を再開します

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.39/90

Page 40: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©p 身近な例外と例外処理

http://www.jfa.or.jp/laws/ill_f.html

ファウルが起こったら警告される

ファウルの対処にもルールがある

ルール =プログラム

ルールはプログラマが決める

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.40/90

Page 41: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©p マルチタスクとは©1マルチタスク (multitask)

1 台のコンピュータで複数の作業 (タスク)を同時に処理すること

プロセッサ (中央処理装置)がひとつしかないコンピュータでは、細かい時間でタスクを切り替えて、複数、同時に処理しているように見せかけます

パソコンもマルチタスク処理を行なっていますただし、みなさんがマルチタスクを実感するのは、大抵、複数のアプリケーション (メーラやWebブラウザなど)を実行しているときですそれぞれの処理は独立していて、みなさんの頭の中で関係づけられています

複数のタスクが協調してひとつの目的を達成するという、マルチタスクの醍醐味みたいなものは分かりにくいと思います

今日は、マルチタスクの醍醐味を体験してくださいといっても、Cricketは簡単なマルチタスク処理しかできませんから、簡単な例で体験してもらうことになります

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.41/90

Page 42: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©p マルチタスクとは©2電波の受信

電波強度の監視

着メロ再生

伝言再生アニメーション再生

ボタン操作受け付け

電池残量の監視

例: 携帯電話

さまざまなタスクが同時に動いて携帯電話を実現しています

もし、ひとつの処理の流れとして書こうとすると . . .

とても複雑になります反応が遅くなります

優先順位の高いタスクは、他のタスクに割り込むことができます伝言を再生しているときに着信があったら、伝言の再生を中断して着メロを再生します着メロの再生中に受信ボタンが押されたら、着メロの再生を中断して通話を始めます

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.42/90

Page 43: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L Cricketでの©o 例外/マルチタスク処理

Cricketでは、例外とマルチタスク処理をひとつの機構で実現しています

例外/マルチタスク処理を記述するには . . .

(when)ブロックを用いますifブロックと同じように、条件と、条件が真のときの処理を書けます条件が真になるまで待ち、真になると通常の処理に割り込みます処理が終了すると、通常の処理が割り込まれた場所から再開します

whenブロックは loopより前で使う必要がありますwhenブロックを使用する箇所で、例外/マルチタスク処理を定義して、それを有効にしていると考えてください

whenブロックの使用には制限があります1 プログラムにつき 1 つしか使えません

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.43/90

Page 44: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L whenブロックの©o 動作を確かめる

こんなプログラムです

通常の処理として、thisの値を 0からひとつずつ増やしていきます

thisが 10より大きくなるのを待ち構えて、beep音を鳴らします

2 通りの実行を試してください

1. beepのあとに何もしない

2. beepのあとで、thisを 0にする

不思議なことに気づいた人は?

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.44/90

Page 45: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©p PADで近似すると©o . . .©1

runタスク

run =

this := 0  

when 起動

loop   

thisを表示 

this := this + 1

1 秒待つ  

通常の処理です

「when起動」で whenタスクを起動します以後、whenタスクも同時に実行されます

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.45/90

Page 46: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©p PADで近似すると©o . . .©2

whenタスク

when = loop

¬ (this > 10) 何もしない

※ここで runタスクを停止します

beep     

this := 0    ※これがないと、このあと永久待ちになります

※ここで runタスクを再開します

this > 10    何もしない

whenブロックで指定している処理を実行している間、runタスクの実行は止められます同時に動いているといっても、whenタスクが何もしていない間だけです1 度に動いているのはひとつのタスクだけだと単純に考えることができます

条件はエッジ検出 (状態が変わったことを検出)しますプログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.46/90

Page 47: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

今日のメニュー

はじめに

前回のおさらい

課題レビュー

Cricketにおける例外とマルチタスク処理

練習問題 1: 機敏な計算機

練習問題 2: スロットマシン

課題の出題

実習

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.47/90

Page 48: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

練習問題 1: 機敏な計算機この練習問題のねらい

前回の練習問題をおさらいします

Cricketにおけるマルチタスク処理を体験します

マルチタスク処理の効果のひとつである、反応の速さを体験します

やってみよう

おさらい

改造へのヒント

解答例

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.48/90

Page 49: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©p やってみよう1から nまで足し合わせる計算機を作ってくださいハードウェアの構成タッチセンサー (スイッチ)をセンサーポート aにつなぎます4 桁ディスプレイをバスポートにつなぎます

使い方 (仕様)1. スイッチを押し続けると、1 秒ごとにビープ音が鳴ります2. スイッチを離すと、ビープ音が鳴った回数 nが 4 桁ディスプレイに表示されますすぐに表示されるようにします←ここが改造ポイント

3. 3 秒後、1から nまで足し合わせた数が 4 桁ディスプレイに表示されます4. 何度でも繰り返して計算できます

更に機敏にするには . . .タイミングの秒数を短くします

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.49/90

Page 50: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

おさらい機敏でない計算機

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.50/90

Page 51: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©p 考え方

loop

数を入力する (input)  

数を確認する (confirm)

足し合わせる (sum)    

結果を表示する(output) 

4 つの手続きで実現します

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.51/90

Page 52: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L 考え方

変数は次のように使います

this: 入力された数の受け渡し用

that: 出力する数の受け渡し用

sumは、以下のどちらの方法で実現しても構いません

愚直に繰り返して足し合わせる方法で実現する

公式を使って実現する

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.52/90

Page 53: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L 数を入力する (input)

thisにビープ音のカウントを格納するのがゴールです

押されるまで loopの反復を続けます

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.53/90

Page 54: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L 数を確認する©o (confirm)

this にはビープ音のカウントが入っています

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.54/90

Page 55: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L 足し合わせる (sum)

1から thisまで足し合わせた数を thatに格納するのがゴールです

thisを減らしながら thatに足していきます

thisが 1になるまで足したら終了です

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.55/90

Page 56: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L 足し合わせる (sum)©o ∼高速版

次の公式を用いた解です

sum =(n + 1)× n

2

このように、部品にすると、部品を交換することで改造しやすくなります

nを thisで受け渡してもらって、1から nまで足し合わせた結果を thatに格納する、というルールを守っていれば、どんな部品でも代わりになることができます

他の部品のことを気にする必要はありません

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.56/90

Page 57: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L 結果を表示する©o (output)

thatに結果が入っています

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.57/90

Page 58: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

改造へのヒント

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.58/90

Page 59: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©p 改造へのヒント©1考え方

runタスク最初、thisを 0にして、スイッチが押されるのを待ちますwhenタスクを起動しますその後は thisの値を増やし続けます

whenタスクスイッチが離されるのを待ちますconfirm → sum → outputを行ないますthisを 0にして、スイッチが押されるのを待ちますふたつのタスクは thisを介してコミュニケートします

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.59/90

Page 60: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L 改造へのヒント©2

runタスクと whenタスクに共通の処理があります

thisを 0にして、スイッチが押されるのを待つことです

手続き guard を定義します

thisを 0に初期化します

スイッチが押されるのを待ちます

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.60/90

Page 61: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©p 改造へのヒント©3トップレベルと inputを改造してみましょうトップレベルの考え方

whenブロックを使います· スイッチが離されるのを待ちます· スイッチが離されたら、計算を行ないます

inputの考え方スイッチが押されているかどうかには無関係になります1 秒ごとにひとつずつ thisの値を増やし、beepを鳴らすことに専念します

confirm, sum, outputはそのままにします

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.61/90

Page 62: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©p 改造へのヒント©4

run =

guard  

when 起動

input  

input = loop

1 秒待つ   

this := this + 1

beep     

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.62/90

Page 63: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©p 改造へのヒント©5

when = loop

スイッチが押されている  何もしない

※ここで runタスクを停止します

confirm         

sum          

output         

guard         

※ここで runタスクを再開します

¬スイッチが押されている 何もしない

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.63/90

Page 64: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

ここでスライドを止めてください

自分の力で考えよう!

クラスメイトと相談するのは OK

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.64/90

Page 65: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L 解答例: トップレベル

whenブロックでスイッチが離されるのを待ち構えて計算を行ない、その後、次回の計算のために再び待ちに入ります

guard は次のことを行なう手続きでしたね

thisを 0に初期化します

スイッチが押されるのを待ちます

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.65/90

Page 66: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L 解答例: inputひたすら thisの値を増やします

トップレベルの whenブロックで指定された処理が実行されている間は、停止します

その間に thisの値は 0に初期化されます

この手続きが動くのは、結局、スイッチが押されている間だけです

スイッチが離された瞬間に、whenタスクが割り込んでconfirm します

計算機の動作が機敏になったか確かめてみましょう

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.66/90

Page 67: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

今日のメニュー

はじめに

前回のおさらい

課題レビュー

Cricketにおける例外とマルチタスク処理

練習問題 1: 機敏な計算機

練習問題 2: スロットマシン

課題の出題

実習

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.67/90

Page 68: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

練習問題 2: スロットマシンこの練習問題のねらい

引続き、Cricketにおけるマルチタスク処理を体験します

タイマの使い方を学びます

やってみよう

大雑把に考える

タイマの使い方

スロットマシンの設計

ヒント

解答例

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.68/90

Page 69: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©p やってみよう1から 9までの数字を 3桁、揃えるスロットマシンを作ってくださいハードウェアの構成タッチセンサー (スイッチ)をセンサーポート aにつなぎます4 桁ディスプレイをバスポートにつなぎます

使い方 (仕様)1. スイッチを押すと、4 桁ディスプレイに 3 桁のデタラメな数が表示され、めまぐるしく変化します

2. 1 秒ごとに、次のことが起きます1 の位、10 の位、100 の位の順に数字が確定していきますビープ音が鳴ります

3. 数が 3 つ揃ったらあなたはラッキー!4. 何度でも繰り返し遊べます

Cricket Logoで作ってみましょう

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.69/90

Page 70: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©p 大雑把に考えるrunタスクは次のことを行ないますまず、スイッチが押されるのを待ちますそれから、スロットマシンのリールをめまぐるしく表示させます

whenタスクで次のことを行ないます1秒経過するのを待ち構えます1の位から順に、リールの数を確定します100の位まで確定したら、数を表示して、スイッチが押されるのを待ちます

ふたつのタスクの間でやりとりされる情報は?whenタスクから runタスクへ、確定された数が伝わる必要があります

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.70/90

Page 71: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L 時間の経過を判定する©o (タイマを使う)

タイマをリセットするには . . .

resett手続きを使いますresettは reset timer の略です↓の timerの値を 0にして、タイマを開始します

タイマがリセットされてからの時間の経過を測るためには . . .

timer手続きを使います1

1000秒 (1 ミリ秒)の単位で、時間の経過を返します

数値が使える場所で使えます

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.71/90

Page 72: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L タイマの動作を©o 確かめる

to runresett

loop [waituntil [timer > 1000]beep

resett

]

end

約 1秒ごとに beep音を鳴らすプログラムです

毎回、タイマをリセットすることで、周期的に timer > 1000 の状態を作り出します

周期が「約」1 秒である理由は . . .

Cricketの処理による遅延が大きいです

細かなところでは、timer = 1000 のときがタイマがリセットされて 1 秒後ですが、timer > 1000 を待っています

timer = 1000 を待っても動くようですが、ちょうどのタイミングで検出しなければならなくなるので、一般には危険です

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.72/90

Page 73: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©p スロットマシンの設計テンプレートをダウンロードしてください

次の手続きは既に定義してありますrun (トップレベル)

getFixedValue (確定する数を求めます)

getReelValues (表示するリールの値を求めます)

次の手続きを定義してくださいprocessElapsed (1 秒ごとの処理を行ないます)

fixReelsを呼び出して実現します

fixReels (確定した数を変数 fixedに格納します)getFixedValueを呼び出して実現します

spinReels (表示する数を求め、実際に表示することを繰り返します)getReelValues を呼び出して実現します

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.73/90

Page 74: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©p トップレベル

run =

when 起動  

初期化   

¬スイッチ押下 何もしない

タイマリセット

リールを回転 

when = loop

¬1秒経過 何もしない

経過処理 

1秒経過  何もしない

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.74/90

Page 75: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L トップレベルglobal [fixed values]

to runwhen [timer > 1000][

processElapsed]setfixed 0waituntil [switcha]resett

spinReels

end

whenブロックで 1 秒経過するのを待ち構えて elapsed を実行します

タイマは、スイッチが押されるまで開始しません

変数の使い方は次の通りです

values: スロットマシンのリールに表示する 3 桁の数

fixed: 確定されたリールに表示されている数確定していないリールに対応する桁の数字は 0とします例: 000→ 001→ 021→321

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.75/90

Page 76: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L getFixedValue

to getFixedValue :noutput ((random % 9) + 1) * :n

end

:nで指定される桁 (確定する桁が 1)を確定した値を返します

その他の桁は 0です

random 手続きは、その都度、でたらめな数 (乱数)を返します

0∼ nの乱数がほしい場合は、randomで得られた数を n + 1で割った余りを求めます

‘%’は余りを計算する演算子です

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.76/90

Page 77: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L getReelValues

to getReelValues :n; 3 桁ともランダムな数で埋めます。ifelse :n < 1 [

output (random % 889) + 111][

;上 2 桁をランダムな数で埋めます。ifelse :n < 10 [

output ((random % 89) + 11) * 10 + :n;上 1 桁をランダムな数で埋めます。][

output ((random % 9) + 1) * 100 + :n]

]

end

:nで確定されていない桁 (値が 0)をランダムな数で埋めた数を返します

確定されたリールの桁はそのまま用いますプログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.77/90

Page 78: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©p ヒント:©o elapsedのデザイン

リールに表示される数を確定することがゴールです次を行ないます

fixReelsを呼び出し、確定されたリールの値を fixedに格納します

ビープ音を鳴らします

fixedの値が 3 桁とも決まったら . . .

fixedの値を表示します· 3 桁揃ったらファンファーレ、のようなことをしてもよいですね

fixedの値を初期化しますスイッチが押されるまで待ちます

タイマをリセットします

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.78/90

Page 79: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©p ヒント:©o fixReelsのデザイン

確定するリールの値を fixedに格納することがゴールです次を行ないます

fixedの現在の値に応じて、確定するリールの値を決めて fixedに入れますfixedが 0なら、1 の位の値を決めます1 の位が決まっていたら、10 の位の値を決めます10 の位が決まっていたら、100 の位の値を決めます

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.79/90

Page 80: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©p ヒント:©o spinReelsのデザイン

リールを表示し続けることがゴールです次をひたすら繰り返します

getReelValues を呼び出してリールの値を求め、values に格納します

values を表示します

※ 直接 getReelValuesの戻り値を表示させるようにすると、whenによる割込みがうまく働かないようです

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.80/90

Page 81: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

ここでスライドを止めてください

自分の力で考えよう!

クラスメイトと相談するのは OK

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.81/90

Page 82: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L 解答例: elapsed

to processElapsedfixReelsbeep

if fixed > 100 [display fixedsetfixed 0waituntil [switcha]

]resett

end

fixReelsにより fixedの値を求めます

fixedが 100 の位まで求まっていれば、結果を表示します

10 の位まで求まっている際のfixedの最大値は 99、100の位まで求まっている際の fixedの最小値は 111なので、例えば 100 との比較を行なえば十分です

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.82/90

Page 83: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L 解答例: fixReels

to fixReels;下 1 桁を確定します。ifelse fixed < 1 [

setfixed getFixedValue 1][

;下 2 桁までを確定します。ifelse fixed < 10 [

setfixed (getFixedValue 10) + fixed; 3 桁とも確定します。][

setfixed (getFixedValue 100) + fixed]

]

end

スロットマシンが開始された直後の fixedの値は 0です

この場合、1 の位を決めますプログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.83/90

Page 84: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

©L 解答例: spinReels

to spinReelsloop [

setvalues getReelValues fixeddisplay values

]

end

ひたすらリールを表示し続けます

processElapsed の処理中は処理が停止します

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.84/90

Page 85: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

今日のメニュー

はじめに

前回のおさらい

課題レビュー

Cricketにおける例外とマルチタスク処理

練習問題 1: 機敏な計算機

練習問題 2: スロットマシン

課題の出題

実習

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.85/90

Page 86: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

課題の出題課題 6. 機敏な自律ロボット

提出方法

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.86/90

Page 87: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

課題6.機敏な自律ロボット

センサーが感知する周囲の変化に機敏に反応し、何らかの形で人間に伝えるロボットを作ってください

条件:センサー/アクチュエーターは自由に使ってくださいCricket Logoで記述し、手続きとマルチタスクを使用してください

注釈で、どんなプログラムなのかを説明する文章を添えてくださいどのポートに何をつけるかも注記してください

各自の課題 4. のプログラムを元にするとよいでしょう

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.87/90

Page 88: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

提出方法

SOIのレポートシステムを用いて提出してくださいhttp://www.soi.wide.ad.jp/report/

Cricket Logoのソースファイルをアップロードしてください

〆切2004/11/15 23:59 JST

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.88/90

Page 89: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

今日のメニュー

はじめに

前回のおさらい

課題レビュー

Cricketにおける例外とマルチタスク処理

練習問題 1: 機敏な計算機

練習問題 2: スロットマシン

課題の出題

実習

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.89/90

Page 90: プログラミング入門 - WIDE Project · 2004. 11. 9. · プログラミング入門 第6回「例外と簡単なマルチタスク処理」 講師: 斉藤賢爾 ks91@sfc.wide.ad.jp

実習残りの時間、課題に励んでください

プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.90/90