プログラミング入門 - wide project · 2004. 11. 9. · プログラミング入門...
TRANSCRIPT
プログラミング入門第6回「例外と簡単なマルチタスク処理」
講師:斉藤賢爾[email protected]
∆ 棟 N205
2004 年度秋学期
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.1/90
今日のメニュー
はじめに
前回のおさらい
課題レビュー
Cricketにおける例外とマルチタスク処理
練習問題 1: 機敏な計算機
練習問題 2: スロットマシン
課題の出題
実習
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.2/90
はじめに今週の配布物
みなさんのコメントから
どこまで来たかな?
今日のゴール
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.3/90
今週の配布物次のものをみなさんに配布します
Cricket本体 × 1 個 (+電池)
赤外線インタフェース × 1 個 (+電池)
シリアルケーブル × 1 本
モーター (グレイ: 中速,赤: 低速) ×各 2 個
モーターケーブル × 2 本
4 桁ディスプレイ × 1 個
バスケーブル × 1 本
タッチセンサー × 1 個
光センサー × 1 個
反射センサー (距離センサー) × 1 個
授業が終わったら回収します
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.4/90
みなさんのコメントから©1
ifや waituntilの使い方を忘れてしまって、1から nまで足すプログラムを書けなかった
復習怠るべからず
⇒ 繰り返して練習することが大切です授業時間だけでは練習の機会が少なく、授業時間外だと Cricketが使えない、という問題もありますが、前回、紹介した UCB Logoなどを活用してみてください研究室に来てくれたら、Cricketを使ってもらってもよいと思っています私 (斉藤)がいる時間を確認して来てくださいね
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.5/90
みなさんのコメントから©2
出題内容に即して、部品に分けたものを書こうとしたが、どうしてもエラーが出て読み込めないために普通に書いただけになった
ぜひとも一度解説いただきたいと考える
⇒ 多分、解説しても問題は解決しません同じ説明を繰り返すだけですし、おそらく、自分でも説明を読み返してみて、それでも問題は解決しなかったのでしょうから、もう一度説明を受けることで問題が解決する可能性は薄いです
しかし、ソースコードを見せてもらえば、どこがエラーになったか分かり、問題を解決することができます問題があったら、ソースコードを見せるのが基本です
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.6/90
授業調査から
今までの段階で授業に対してどのように感じますか予習も復習もいらない感じ
⇒ これが嘘だということは、実感しましたね!
今後この科目に期待することは何ですかクラスメイトと仲良くなりたい
⇒ これから共同作業することも増えてきます論理的に考える練習
⇒ 努めて頭の体操もしていきたいですが . . .問題解決そのものが論理的な思考を必要とします
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.7/90
どこまで来たかな?
第 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
今日のゴール
簡単なマルチタスク処理を利用したプログラムを作れるようになる前回学んだ「手続き」とは別の種類の、プログラムの分割の方法です
難しく見える点では、全日程を通して今日がピークかも知れませんこれ以上複雑なことは Cricketには用意されていません
「手続き」もそうですが、難しく見える反面、覚えることでプログラミングが簡単になるという効果があります分割した方が内容を把握しやすくなるからです
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.9/90
©p マルチタスクとは©1マルチタスク (multitask)
1 台のコンピュータで複数の作業 (タスク)を同時に処理すること
プロセッサ (中央処理装置)がひとつしかないコンピュータでは、細かい時間でタスクを切り替えて、複数、同時に処理しているように見せかけます
パソコンもマルチタスク処理を行なっていますただし、みなさんがマルチタスクを実感するのは、大抵、複数のアプリケーション (メーラやWebブラウザなど)を実行しているときですそれぞれの処理は独立していて、みなさんの頭の中で関係づけられています
複数のタスクが協調してひとつの目的を達成するという、マルチタスクの醍醐味みたいなものは分かりにくいと思います
今日は、マルチタスクの醍醐味を体験してくださいといっても、Cricketは簡単なマルチタスク処理しかできませんから、簡単な例で体験してもらうことになります
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.10/90
©p マルチタスクとは©2電波の受信
電波強度の監視
着メロ再生
伝言再生アニメーション再生
ボタン操作受け付け
電池残量の監視
例: 携帯電話
さまざまなタスクが同時に動いて携帯電話を実現しています
もし、ひとつの処理の流れとして書こうとすると . . .
とても複雑になります反応が遅くなります
優先順位の高いタスクは、他のタスクに割り込むことができます伝言を再生しているときに着信があったら、伝言の再生を中断して着メロを再生します着メロの再生中に受信ボタンが押されたら、着メロの再生を中断して通話を始めます
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.11/90
今日の体験メニュー
次の練習問題や課題で体験します1. 前回作った、1から nまで数を足し合わせる計算機の動作を機敏にしてください (練習問題)
2. スロットマシンを作ってください (練習問題)3. センサーが感知する周囲の情報を、何らかの形で人間に伝えるロボットを作ってください (課題)
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.12/90
今日のメニュー
はじめに
前回のおさらい
課題レビュー
Cricketにおける例外とマルチタスク処理
練習問題 1: 機敏な計算機
練習問題 2: スロットマシン
課題の出題
実習
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.13/90
前回のおさらい手続きとその呼び出し
Cricket Logo
今週の TIPS
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.14/90
©p 手続きとはあるまとまった処理に名前をつけたものです
意味のある名前で扱うことにより、人間がプログラムの内容を把握しやすくなります
呼び出して利用できる、プログラムの部品です日常的に使われる手続き (住民票の異動など)は、特定の窓口に情報を渡すと、何かまとまった処理がその向こう側で行なわれます
同じように、手続きに対して情報を渡して何かをしてもらったり、手続きから情報を得ることができます
部品を交換することで、改造がしやすくなります
トップダウンとボトムアップトップダウン: 問題をブレークダウンしていきます (段階詳細化)
ボトムアップ: 使える部品から考えていきます
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.15/90
©L 手続きの定義と©o 呼び出し
手続きを定義するには . . .
(proc)ブロックを使いますこのかたち自体はおなじみですねクリックして手続きの名前を入力できます
手続きの中で (stop)ブロックを用いると、その場でその手続きを終了します
loopと組み合わせて、一般的な反復のかたちの代わりに用いることができます
手続きを呼び出すには . . .
(call)ブロックを使いますクリックすると、現在定義されている手続きの名前が切り替わっていきます先に、procブロックで手続きを定義している必要があります
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.16/90
©L 今週の TIPS
(proc)ブロックの使い方procブロックに手続きの中身を付けていないと、ダウンロード時に “Missing ablock”というエラーになります
blankブロックでよいので付けておくと、エラーを回避できます
手続きの名前が、“display” など、既存のブロックの名前と重なると正常に動作しません既存のブロックの名前を手続きの名前に使わないようにしましょう
(call)ブロックの使い方手続きの名前に空白や ‘.’ があると、プログラムを開いたときに正しい手続きの名前を読み込めません手続きの名前には英数字だけを用いるようにしましょう
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.17/90
©p 一般的な反復の©o 代わりの書き方
一般的な反復
条件 処理
条件が真の間、繰り返し処理を行ないます1. 条件を判定します2. 真なら処理を行ない、偽なら反復を抜けます3. 1に戻ります
Cricketでの、代わりの書き方
general_repeat = loop¬条件 ��
��STOP
処理
手続きになっている必要があります
‘¬’は論理否定 (not)を表しますプログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.18/90
©p Logo言語とは
MITで開発されたプログラミング言語です初心者でも扱いやすいように設計されていますCricket Logo/LogoBlocksは、Logo言語に基づいています
ギリシャ語の logos (言葉)が語源です
Lispというプログラミング言語を元にしていますLispはとても強力な言語として知られています難しいことを簡単に表現できて、かつ、いろいろなことを表現できます
Logoはこども向けということで、過小評価されることが多いようですが、実は同様に強力な言語です
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.19/90
©L Cricket Logoの特徴
Cricket LogoBlocksでできることが全部できますCricket LogoBlocksは、Cricket Logoを視覚化したものです
3個以上の変数を宣言して用いることができます
手続きに引数 (後述)を渡すことができます
手続きから戻り値 (後述)を受け取ることができます
Cricket Logoを用いるためには、Jackalアプリケーションを使います
LogoBlocksとは同時に使えませんので注意してください
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.20/90
©L Jackalアプリケーショ©o ンの使い方
ここにスタートボタンが押されたときに実行される手続きの呼び出し形を書きます。
ここにプログラムを書きます。プログラムは手続きの定義の並びです。
ここにコマンドを入力して�Cricket�を操作できます。
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.21/90
©p 引数と戻り値ひきすう引 数とは
手続きに渡す情報です (Cricket Logoの場合は数)
実引数と仮引数があります実引数: 手続きを呼び出すときに実際に指定する数· 例: wait 30, display this
仮引数: 手続きを定義するときに仮に名前をつけて使う数· Logo言語では、:nのように ‘:’ を付けた名前で表します
戻り値とは
手続きが結果として返してくれる値です (Cricket Logoの場合は数/真偽値)例: switcha (タッチセンサー aが押されているかを返します)
手続きの呼び出し形は、実行時に戻り値で置き換わると考えてください(x + 3) × (x + 2)などの式を考えると分かりやすいでしょう
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.22/90
©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
おさらい: 1から nまで足す計算機を作る
Cricket Logoで作ります
引数と戻り値を使います
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.24/90
©L 数を入力する (input)
;スイッチが押される間に数えた数を返します。to input
waituntil [switcha]setcount 0loop [
wait 10if not switcha [
output count ;手続きを終了して、数えた数を返します。]setcount count + 1beep
]
end
呼び出し形は inputです
呼び出し形は、入力した値を持つ数として扱えますプログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.25/90
©L 数を確認する©o (confirm)
; :nを表示し、そのまま返します。to confirm :n
display :nwait 30output :n
end
Logo言語では、仮引数を ‘:’ で始まる名前で書きます
上の例では :nで、実引数として指定される数を :nと仮に名前をつけて使います
呼び出し形は confirm数です
呼び出し形は、入力した値を持つ数として扱えます
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.26/90
©L 足し合わせる (sum)
; 1から :nまで足し合わせた数を返します。to sum :n
output ((:n + 1) * :n) / 2
end
呼び出し形は sum数です
呼び出し形は、足し合わせた結果の数として扱えます
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.27/90
©L 結果を表示する©o (out)
; :nを表示します。to out :n
display :n
end
呼び出し形は out数です
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.28/90
©L トップレベル (run)
; count: 入力する値を数えるために用います。global [count]
;入力した数を確認の上、足し合わせて結果を表示します。;センサーポート a: タッチセンサー。;バスポート: 4 桁ディスプレイ。to run
loop [out sum confirm input
]
end
変数がひとつ減りました
手続きの間の関係が明確になりました
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.29/90
今日のメニュー
はじめに
前回のおさらい
課題レビュー
Cricketにおける例外とマルチタスク処理
練習問題 1: 機敏な計算機
練習問題 2: スロットマシン
課題の出題
実習
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.30/90
課題レビュー課題をふりかえる
提出状況と傾向・総評
今週の Thumbs Up!
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.31/90
課題5. 組曲「冬の情景」
あなたの想う、冬の情景をタートルグラフィクスで描いてください。
条件UCB Logo (後述)を用いてください。· UCB Logoでは、注釈に日本語が使えないので、英語かローマ字で注釈を書いてください
図形を部品としてとらえて、図形を描く手続きを組み合わせて描いてください。
例えば、三角形と縦線で表した針葉樹を並べて描くなど、単純な図形を組み合わせて描いてみましょう。三角形を描く手続き triangle を定義しますtriangle と縦線を組み合わせて、針葉樹を描く手続き coniferを定義しますconifer を何度も呼び出して針葉樹林を描きます
これから体験してもらう樹木曲線を使ってもよいでしょう。
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.32/90
提出状況と傾向
18人中 6人提出 (SOI学生含む)全員出しましょう (出足が鈍く、心配しました)難しかったですか?SOI学生からの投稿もお待ちしております
傾向と総評手続きを定義できた人が少なかったですきっちり復習しますので、次の課題で是非チャレンジしてください人間にとって読みやすいプログラムという面では、全員、もうちょっと努力が必要と思います
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.33/90
組曲「冬の情景」
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.34/90
今週の Thumb Up!
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.35/90
柳川晋伊知郎さんの作品
「冬の情景」
山と森を描いてくれました手続きを定義できています引数も使えています変数名は、長くても意味のある名前を用いると読みやすくなります注釈を充実するともっとよかったと思います後述するスロットマシンのテンプレートを参考にしてください字下げ (indentation)も活用してください
PADに直したときに縦の位置が揃うように行の書き始めをずらします
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.36/90
今日のメニュー
はじめに
前回のおさらい
課題レビュー
Cricketにおける例外とマルチタスク処理
練習問題 1: 機敏な計算機
練習問題 2: スロットマシン
課題の出題
実習
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.37/90
Cricketにおける例外とマルチタスク処理
例外とは
マルチタスクとは
Cricket での例外/マルチタスク処理
whenブロックの動作を確かめる
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.38/90
©p 例外とは例外 (exception)
プログラムの実行中に、例外的な状況が発生して、それ以上そのまま実行を続けられなくなること実行は中断して、例外処理を行ないます
例: 何かの数を 0で割った場合 (Cricketでは結果を 0にします)
Cricketでは、例外の条件をプログラマが自由に定義できます
例外処理プログラマが自分で定義できます
例外処理が終わると、中断したところからプログラムの実行が再開します
プログラムに対する割り込み処理だと考えられます何か変なことが起こったら割り込んでプログラムの実行を中断し、事態を収拾してからプログラムの実行を再開します
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.39/90
©p 身近な例外と例外処理
http://www.jfa.or.jp/laws/ill_f.html
ファウルが起こったら警告される
ファウルの対処にもルールがある
ルール =プログラム
ルールはプログラマが決める
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.40/90
©p マルチタスクとは©1マルチタスク (multitask)
1 台のコンピュータで複数の作業 (タスク)を同時に処理すること
プロセッサ (中央処理装置)がひとつしかないコンピュータでは、細かい時間でタスクを切り替えて、複数、同時に処理しているように見せかけます
パソコンもマルチタスク処理を行なっていますただし、みなさんがマルチタスクを実感するのは、大抵、複数のアプリケーション (メーラやWebブラウザなど)を実行しているときですそれぞれの処理は独立していて、みなさんの頭の中で関係づけられています
複数のタスクが協調してひとつの目的を達成するという、マルチタスクの醍醐味みたいなものは分かりにくいと思います
今日は、マルチタスクの醍醐味を体験してくださいといっても、Cricketは簡単なマルチタスク処理しかできませんから、簡単な例で体験してもらうことになります
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.41/90
©p マルチタスクとは©2電波の受信
電波強度の監視
着メロ再生
伝言再生アニメーション再生
ボタン操作受け付け
電池残量の監視
例: 携帯電話
さまざまなタスクが同時に動いて携帯電話を実現しています
もし、ひとつの処理の流れとして書こうとすると . . .
とても複雑になります反応が遅くなります
優先順位の高いタスクは、他のタスクに割り込むことができます伝言を再生しているときに着信があったら、伝言の再生を中断して着メロを再生します着メロの再生中に受信ボタンが押されたら、着メロの再生を中断して通話を始めます
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.42/90
©L Cricketでの©o 例外/マルチタスク処理
Cricketでは、例外とマルチタスク処理をひとつの機構で実現しています
例外/マルチタスク処理を記述するには . . .
(when)ブロックを用いますifブロックと同じように、条件と、条件が真のときの処理を書けます条件が真になるまで待ち、真になると通常の処理に割り込みます処理が終了すると、通常の処理が割り込まれた場所から再開します
whenブロックは loopより前で使う必要がありますwhenブロックを使用する箇所で、例外/マルチタスク処理を定義して、それを有効にしていると考えてください
whenブロックの使用には制限があります1 プログラムにつき 1 つしか使えません
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.43/90
©L whenブロックの©o 動作を確かめる
こんなプログラムです
通常の処理として、thisの値を 0からひとつずつ増やしていきます
thisが 10より大きくなるのを待ち構えて、beep音を鳴らします
2 通りの実行を試してください
1. beepのあとに何もしない
2. beepのあとで、thisを 0にする
不思議なことに気づいた人は?
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.44/90
©p PADで近似すると©o . . .©1
runタスク
run =
this := 0
when 起動
loop
thisを表示
this := this + 1
1 秒待つ
通常の処理です
「when起動」で whenタスクを起動します以後、whenタスクも同時に実行されます
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.45/90
©p PADで近似すると©o . . .©2
whenタスク
when = loop
¬ (this > 10) 何もしない
※ここで runタスクを停止します
beep
this := 0 ※これがないと、このあと永久待ちになります
※ここで runタスクを再開します
this > 10 何もしない
whenブロックで指定している処理を実行している間、runタスクの実行は止められます同時に動いているといっても、whenタスクが何もしていない間だけです1 度に動いているのはひとつのタスクだけだと単純に考えることができます
条件はエッジ検出 (状態が変わったことを検出)しますプログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.46/90
今日のメニュー
はじめに
前回のおさらい
課題レビュー
Cricketにおける例外とマルチタスク処理
練習問題 1: 機敏な計算機
練習問題 2: スロットマシン
課題の出題
実習
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.47/90
練習問題 1: 機敏な計算機この練習問題のねらい
前回の練習問題をおさらいします
Cricketにおけるマルチタスク処理を体験します
マルチタスク処理の効果のひとつである、反応の速さを体験します
やってみよう
おさらい
改造へのヒント
解答例
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.48/90
©p やってみよう1から nまで足し合わせる計算機を作ってくださいハードウェアの構成タッチセンサー (スイッチ)をセンサーポート aにつなぎます4 桁ディスプレイをバスポートにつなぎます
使い方 (仕様)1. スイッチを押し続けると、1 秒ごとにビープ音が鳴ります2. スイッチを離すと、ビープ音が鳴った回数 nが 4 桁ディスプレイに表示されますすぐに表示されるようにします←ここが改造ポイント
3. 3 秒後、1から nまで足し合わせた数が 4 桁ディスプレイに表示されます4. 何度でも繰り返して計算できます
更に機敏にするには . . .タイミングの秒数を短くします
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.49/90
おさらい機敏でない計算機
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.50/90
©p 考え方
loop
数を入力する (input)
数を確認する (confirm)
足し合わせる (sum)
結果を表示する(output)
4 つの手続きで実現します
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.51/90
©L 考え方
変数は次のように使います
this: 入力された数の受け渡し用
that: 出力する数の受け渡し用
sumは、以下のどちらの方法で実現しても構いません
愚直に繰り返して足し合わせる方法で実現する
公式を使って実現する
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.52/90
©L 数を入力する (input)
thisにビープ音のカウントを格納するのがゴールです
押されるまで loopの反復を続けます
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.53/90
©L 数を確認する©o (confirm)
this にはビープ音のカウントが入っています
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.54/90
©L 足し合わせる (sum)
1から thisまで足し合わせた数を thatに格納するのがゴールです
thisを減らしながら thatに足していきます
thisが 1になるまで足したら終了です
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.55/90
©L 足し合わせる (sum)©o ∼高速版
次の公式を用いた解です
sum =(n + 1)× n
2
このように、部品にすると、部品を交換することで改造しやすくなります
nを thisで受け渡してもらって、1から nまで足し合わせた結果を thatに格納する、というルールを守っていれば、どんな部品でも代わりになることができます
他の部品のことを気にする必要はありません
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.56/90
©L 結果を表示する©o (output)
thatに結果が入っています
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.57/90
改造へのヒント
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.58/90
©p 改造へのヒント©1考え方
runタスク最初、thisを 0にして、スイッチが押されるのを待ちますwhenタスクを起動しますその後は thisの値を増やし続けます
whenタスクスイッチが離されるのを待ちますconfirm → sum → outputを行ないますthisを 0にして、スイッチが押されるのを待ちますふたつのタスクは thisを介してコミュニケートします
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.59/90
©L 改造へのヒント©2
runタスクと whenタスクに共通の処理があります
thisを 0にして、スイッチが押されるのを待つことです
手続き guard を定義します
thisを 0に初期化します
スイッチが押されるのを待ちます
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.60/90
©p 改造へのヒント©3トップレベルと inputを改造してみましょうトップレベルの考え方
whenブロックを使います· スイッチが離されるのを待ちます· スイッチが離されたら、計算を行ないます
inputの考え方スイッチが押されているかどうかには無関係になります1 秒ごとにひとつずつ thisの値を増やし、beepを鳴らすことに専念します
confirm, sum, outputはそのままにします
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.61/90
©p 改造へのヒント©4
run =
guard
when 起動
input
input = loop
1 秒待つ
this := this + 1
beep
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.62/90
©p 改造へのヒント©5
when = loop
スイッチが押されている 何もしない
※ここで runタスクを停止します
confirm
sum
output
guard
※ここで runタスクを再開します
¬スイッチが押されている 何もしない
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.63/90
ここでスライドを止めてください
自分の力で考えよう!
クラスメイトと相談するのは OK
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.64/90
©L 解答例: トップレベル
whenブロックでスイッチが離されるのを待ち構えて計算を行ない、その後、次回の計算のために再び待ちに入ります
guard は次のことを行なう手続きでしたね
thisを 0に初期化します
スイッチが押されるのを待ちます
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.65/90
©L 解答例: inputひたすら thisの値を増やします
トップレベルの whenブロックで指定された処理が実行されている間は、停止します
その間に thisの値は 0に初期化されます
この手続きが動くのは、結局、スイッチが押されている間だけです
スイッチが離された瞬間に、whenタスクが割り込んでconfirm します
計算機の動作が機敏になったか確かめてみましょう
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.66/90
今日のメニュー
はじめに
前回のおさらい
課題レビュー
Cricketにおける例外とマルチタスク処理
練習問題 1: 機敏な計算機
練習問題 2: スロットマシン
課題の出題
実習
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.67/90
練習問題 2: スロットマシンこの練習問題のねらい
引続き、Cricketにおけるマルチタスク処理を体験します
タイマの使い方を学びます
やってみよう
大雑把に考える
タイマの使い方
スロットマシンの設計
ヒント
解答例
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.68/90
©p やってみよう1から 9までの数字を 3桁、揃えるスロットマシンを作ってくださいハードウェアの構成タッチセンサー (スイッチ)をセンサーポート aにつなぎます4 桁ディスプレイをバスポートにつなぎます
使い方 (仕様)1. スイッチを押すと、4 桁ディスプレイに 3 桁のデタラメな数が表示され、めまぐるしく変化します
2. 1 秒ごとに、次のことが起きます1 の位、10 の位、100 の位の順に数字が確定していきますビープ音が鳴ります
3. 数が 3 つ揃ったらあなたはラッキー!4. 何度でも繰り返し遊べます
Cricket Logoで作ってみましょう
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.69/90
©p 大雑把に考えるrunタスクは次のことを行ないますまず、スイッチが押されるのを待ちますそれから、スロットマシンのリールをめまぐるしく表示させます
whenタスクで次のことを行ないます1秒経過するのを待ち構えます1の位から順に、リールの数を確定します100の位まで確定したら、数を表示して、スイッチが押されるのを待ちます
ふたつのタスクの間でやりとりされる情報は?whenタスクから runタスクへ、確定された数が伝わる必要があります
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.70/90
©L 時間の経過を判定する©o (タイマを使う)
タイマをリセットするには . . .
resett手続きを使いますresettは reset timer の略です↓の timerの値を 0にして、タイマを開始します
タイマがリセットされてからの時間の経過を測るためには . . .
timer手続きを使います1
1000秒 (1 ミリ秒)の単位で、時間の経過を返します
数値が使える場所で使えます
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.71/90
©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
©p スロットマシンの設計テンプレートをダウンロードしてください
次の手続きは既に定義してありますrun (トップレベル)
getFixedValue (確定する数を求めます)
getReelValues (表示するリールの値を求めます)
次の手続きを定義してくださいprocessElapsed (1 秒ごとの処理を行ないます)
fixReelsを呼び出して実現します
fixReels (確定した数を変数 fixedに格納します)getFixedValueを呼び出して実現します
spinReels (表示する数を求め、実際に表示することを繰り返します)getReelValues を呼び出して実現します
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.73/90
©p トップレベル
run =
when 起動
初期化
¬スイッチ押下 何もしない
タイマリセット
リールを回転
when = loop
¬1秒経過 何もしない
経過処理
1秒経過 何もしない
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.74/90
©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
©L getFixedValue
to getFixedValue :noutput ((random % 9) + 1) * :n
end
:nで指定される桁 (確定する桁が 1)を確定した値を返します
その他の桁は 0です
random 手続きは、その都度、でたらめな数 (乱数)を返します
0∼ nの乱数がほしい場合は、randomで得られた数を n + 1で割った余りを求めます
‘%’は余りを計算する演算子です
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.76/90
©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
©p ヒント:©o elapsedのデザイン
リールに表示される数を確定することがゴールです次を行ないます
fixReelsを呼び出し、確定されたリールの値を fixedに格納します
ビープ音を鳴らします
fixedの値が 3 桁とも決まったら . . .
fixedの値を表示します· 3 桁揃ったらファンファーレ、のようなことをしてもよいですね
fixedの値を初期化しますスイッチが押されるまで待ちます
タイマをリセットします
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.78/90
©p ヒント:©o fixReelsのデザイン
確定するリールの値を fixedに格納することがゴールです次を行ないます
fixedの現在の値に応じて、確定するリールの値を決めて fixedに入れますfixedが 0なら、1 の位の値を決めます1 の位が決まっていたら、10 の位の値を決めます10 の位が決まっていたら、100 の位の値を決めます
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.79/90
©p ヒント:©o spinReelsのデザイン
リールを表示し続けることがゴールです次をひたすら繰り返します
getReelValues を呼び出してリールの値を求め、values に格納します
values を表示します
※ 直接 getReelValuesの戻り値を表示させるようにすると、whenによる割込みがうまく働かないようです
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.80/90
ここでスライドを止めてください
自分の力で考えよう!
クラスメイトと相談するのは OK
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.81/90
©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
©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
©L 解答例: spinReels
to spinReelsloop [
setvalues getReelValues fixeddisplay values
]
end
ひたすらリールを表示し続けます
processElapsed の処理中は処理が停止します
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.84/90
今日のメニュー
はじめに
前回のおさらい
課題レビュー
Cricketにおける例外とマルチタスク処理
練習問題 1: 機敏な計算機
練習問題 2: スロットマシン
課題の出題
実習
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.85/90
課題の出題課題 6. 機敏な自律ロボット
提出方法
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.86/90
課題6.機敏な自律ロボット
センサーが感知する周囲の変化に機敏に反応し、何らかの形で人間に伝えるロボットを作ってください
条件:センサー/アクチュエーターは自由に使ってくださいCricket Logoで記述し、手続きとマルチタスクを使用してください
注釈で、どんなプログラムなのかを説明する文章を添えてくださいどのポートに何をつけるかも注記してください
各自の課題 4. のプログラムを元にするとよいでしょう
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.87/90
提出方法
SOIのレポートシステムを用いて提出してくださいhttp://www.soi.wide.ad.jp/report/
Cricket Logoのソースファイルをアップロードしてください
〆切2004/11/15 23:59 JST
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.88/90
今日のメニュー
はじめに
前回のおさらい
課題レビュー
Cricketにおける例外とマルチタスク処理
練習問題 1: 機敏な計算機
練習問題 2: スロットマシン
課題の出題
実習
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.89/90
実習残りの時間、課題に励んでください
プログラミング入門第 6 回「例外と簡単なマルチタスク処理」 – p.90/90