...

インテリジェントパッド

by user

on
Category: Documents
6

views

Report

Comments

Transcript

インテリジェントパッド
インテリジェントパッド
インタプリタによるパッド開発入門(第6版)
2010年4月
野口孝文
著
授業予定
1.
月
2.
月
日
日
3.
月
日
4.
月
日
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
月
月
月
月
月
月
月
月
月
月
月
月
月
月
月
月
月
月
月
月
月
月
月
月
月
月
日
日
日
日
日
日
日
日
日
日
日
日
日
日
日
日
日
日
日
日
日
日
日
日
日
日
言語,機械語,変換,C 言語
変数,スロット,コンピュータ,メモリ,ハードディスク,
プログラム,時計プログラム
イベントドリブン,手続きパッド,スロット,加算,書き方
カウンタ,
スロットとアクション関数,制御文 if,スロットの方,演算,
フクロウ時計
if 文,問題①~⑤
問題⑤~⑬
乱数,さいころ
さいころ 2 つ,関数
モグラ 1 匹
時間と得点
ピクチャフォルダ
レポートの書き方,乱数の変え方
モグラたたき最後
電卓初め
電卓,計算,+/-,変数の変化の表を示す,12+123
テスト返却,小数点
関数,for 文
関数,ラジアン,度
最終回,仕上げ
シューティング,いろいろな関数
ひっくり返す
レーダパッド,shootボタン
キーインパッド
得点
テスト返却,スタートボタン
絵
乱数
絵の付け方,スイッチ,ピクチャフォルダ
仕上げ
仕上げ
i
まえがき
コンピュータを使って,いろいろなことができるようになりました.ワープロや表計算
のアプリケーションソフトウエアに動画や音声を貼り付けることも簡単にできます.ネッ
トワーク機能を使って,インターネット上にあるデータを取り込むことも簡単にできます.
ツールの使い方を修得した人は,便利になったといいます.アプリケーションソフトウ
エアをより使いやすくするために,よく利用する機能ボタンのレイアウトを変更したり,
マクロ機能を利用し新しい機能を追加したりすることができます.そして,スクリプトプ
ログラムが利用できれば,ついには,長々としたプログラムを作成しお気に入りのシステ
ムができあがります.プラグインが利用できれば,C++や Basic といった言語を使って,プ
ログラムを作成してしまうでしょう.
きっと,プログラムを作った人は,簡単だったといいます.具体的な目的が,プログラ
ム作りの難しさという障害を乗り越える力になります.
では,初心者のプログラミング教育に,この複雑な開発環境を使うことができるでしょ
うか.開発環境が便利になればなるほど,初心者にとっては大変です.挑戦者の数パーセ
ントにとっては道具ですが,残りにとっては拷問の道具か睡眠薬です.
本書は,インテリジェントパッドの1つの部品である手続きパッドを使った,プログラ
ミングのための入門書です.インテリジェントパッドは,コンピュータ上に可視化したパッ
ドと呼ばれるオブジェクトを用い,さまざまなメディアを統一に扱うことを目指したシス
テムです.たくさんの機能部品が開発されており,この手続きパッドと組み合わせること
で,初心者でも興味深いアプリケーションを作ることができます.
ii
目
次
1. はじめに ....................................................................................................... 1
1.1
インテリジェントパッドとは何か ...................................................... 1
1.2
部品の組み合わせによるアプリケーションの開発 ............................. 2
1.3
パッド部品の開発 ............................................................................... 2
2. インテリジェントパッドの操作方法 ............................................................ 3
2.1
起動方法.............................................................................................. 3
2.2
パッドの生成....................................................................................... 4
2.3
スロット.............................................................................................. 4
2.4
スロット結合....................................................................................... 5
2.5
パッドの基本操作 ............................................................................... 5
2.6
時
計 ................................................................................................. 8
3. 手続きパッド .............................................................................................. 10
3.1
インタプリタ..................................................................................... 10
3.2
プログラム例..................................................................................... 10
3.3
問題 ................................................................................................... 10
4. 足し算のプログラム ................................................................................... 12
5. ふくろう時計のプログラム ........................................................................ 13
5.1
目玉の作成 ........................................................................................ 13
5.2
目玉を動かす..................................................................................... 13
5.3
問題 ................................................................................................... 16
6. 乱数とさいころ .......................................................................................... 17
6.1
乱数 ................................................................................................... 17
6.2
さいころ............................................................................................ 17
6.3
乱数でπの計算 ................................................................................. 19
6.4
問題 ................................................................................................... 19
ii
7. もぐらたたき .............................................................................................. 21
7.1
1匹もぐらのもぐらたたき ............................................................... 21
7.2
制限時間とカウント.......................................................................... 22
7.3
ピクチャフォルダパッドを用いたもぐらたたき ............................... 23
7.4
もぐらの出現確率を変える ............................................................... 23
7.5
問題 ................................................................................................... 24
8. 電
卓......................................................................................................... 26
8.1
ボタンパッドを使って,数字や記号の入力 ...................................... 26
8.2
小数点を含まない数値の入力............................................................ 26
8.3
クリアボタン..................................................................................... 27
8.4
演算ボタン ........................................................................................ 28
8.5
小数点を含む数値の入力................................................................... 29
8.6
数値入力部品..................................................................................... 31
8.7
for 文を使ってみよう ........................................................................ 33
8.8
問題 ................................................................................................... 34
9. シューティングゲーム................................................................................ 34
9. シューティングゲーム................................................................................ 34
10.
9.1
Dictionary 型スロット/Dictionary 型変数 ........................................ 35
9.2
モービルパッド ................................................................................. 36
9.3
いろいろな動きをするモービルパッド ............................................. 37
9.4
1つのパッドに2種類の動きをさせる ............................................. 37
9.5
問題 ................................................................................................... 38
9.6
複数のパッドを独立して動かす ........................................................ 38
9.7
レーダパッド..................................................................................... 39
9.8
シューティングゲーム ...................................................................... 40
9.9
シューティングゲームの例 ............................................................... 43
住所録 .................................................................................................. 45
10.1
個人データの登録 .......................................................................... 45
iii
10.2
指定位置データの取りだし ............................................................ 46
10.3
更新機能......................................................................................... 47
10.4
削除機能......................................................................................... 47
10.5
検索機能......................................................................................... 49
10.6
問題................................................................................................ 50
11.
スタック............................................................................................... 51
11.1
スタックの構造 .............................................................................. 51
11.2
単語の並べ替え .............................................................................. 52
11.3
問題................................................................................................ 53
12.
ポーランド記法 .................................................................................... 54
12.1
演算の優先順序 .............................................................................. 54
12.2
ポーランド記法への変換................................................................ 54
12.3
ポーランド変換のプログラム ........................................................ 56
12.4
問題................................................................................................ 57
13.
レゴの制御 ........................................................................................... 58
13.1
レゴコントロールパッド................................................................ 58
13.2
レゴで作った信号機の制御 ............................................................ 59
13.3
問題................................................................................................ 62
14.
お茶運びロボット ................................................................................ 63
14.1
江戸時代にあったロボット ............................................................ 63
14.2
ロボットの設計 .............................................................................. 64
14.3
プログラムの作成 .......................................................................... 65
14.4
お茶運びロボットの製作例 ............................................................ 66
14.5
問題................................................................................................ 66
文法...................................................................................................... 68
A.
A.1
使用可能な文字 .............................................................................. 68
A.2
文の構成要素 ................................................................................. 68
A.3
式と演算子 ..................................................................................... 73
iv
A.4
型指定子......................................................................................... 76
インタプリタ手続き文の構造............................................................... 80
B.
B.1
インタプリタの構成....................................................................... 80
B.2
スロット宣言 ................................................................................. 83
B.3
変数の宣言 ..................................................................................... 84
B.4
関数の宣言 ..................................................................................... 85
B.5
関数の定義 ..................................................................................... 86
B.6
スロットアクションの定義 ............................................................ 87
B.7
スロットアクションの動作 ............................................................ 89
B.8
組み込み定数 ................................................................................. 90
C.
制御文 .................................................................................................. 91
D.
組み込み関数........................................................................................ 96
D.1
数値操作関数 ................................................................................. 96
D.2
文字列操作関数 ............................................................................ 101
D.3
ファイル操作関数 ........................................................................ 104
D.4
ディクショナリ操作関数.............................................................. 106
D.5
スロットアクション操作関数 ...................................................... 113
D.6
出力制御操作関数 ........................................................................ 114
v
1.
はじめに
コンピュータの性能は,3年で4倍,10年で100倍の勢いで向上しています.また,
価格の低下もあって,様々な人がコンピュータを利用するようになりました.
一方これらのことが,プログラムの開発を困難にしています.すなわち,開発したシス
テムの操作性向上の要求や多様な機能の要求が,プログラムの規模を大きくしているから
です.これらの要求に応えるべく,現れた開発環境がオブジェクト指向プログラミングで
す.
私たちの周りには,様々な道具があります.その道具は,部品の組み合わせでできてい
ます.私たちは,その道具を見て,使い方を想像することができます.ときには,はじめ
て使う道具も簡単に使うことができたり,道具を組み合わせて使ったりします.
道具には,それぞれ機能があります.道具に対して行った操作に対し,道具は,ちゃん
と反応します.意図したとおりに動作することも,壊れることもあります.
オブジェクト指向は,実世界における道具や部品と同じように(内部状態と機能を一つ
にして扱う)プログラム部品を扱うという考え方です.
オブジェクト指向プログラミングは,1970年代に Smalltalk が開発されて以来,C++
や Java をはじめ多くの開発言語に取り入れられています.データと機能を1つのオブジェ
クトとして扱い,このオブジェクトにメッセージを送ることによって処理を行うという方
法は,
「部品を組み合わせてプログラムを作る」という考え方を可能にしました.また,オ
ブジェクトを定義しているクラス(プログラム)の再利用においても有効と考えられてい
ます.現在の多くのシステムやアプリケーションプログラムが,オブジェクト指向で作ら
れていることもこれを裏付けています.
しかし,プログラムをオブジェクト指向で開発しても,実世界の部品のように,部品の
再利用が進んでいません.私たちの住んでいる世界では,いろいろな部品や道具が標準化
されています.長さをメートルで計測したり,重さをグラムで表示したりしています.た
とえば,異なる2つの機械同士間で,ねじを交換することもできます.これに対しプログ
ラムの世界ではどうでしょう.
あるアプリケーションで使われている機能(オブジェクト)を異なるアプリケーション
にコピーしても,使うことはできません.このオブジェクトを利用するためには,オブジェ
クトが受け付けることができるメッセージを送らなければならないからです.すなわち,
これを実現するためには,機械を構成する部品と同様に標準化を行わなければなりません.
インテリジェントパッドは,この標準化を行いました.2章で,この標準化について述べ
ます.
1.1
インテリジェントパッドとは何か
インテリジェントパッドは,パッドと呼ばれるオブジェクトを,コンピュータの画面上
に可視化し,それらのパッドを直接操作によって組み合わせることにより,利用者が思い
のままに,新たな編集物や道具を作り出すことができる環境です.
パッドの中には,例えば文章や写真,動画や音といった様々なメディアと,それらを表
1
示したり編集したりする機能などが一緒に入っています.またボタンやスイッチ,スクロー
ルバーといったコントロールなどもあります.さらにデータベースやネットワークにアク
セスするといった縁の下の力持ち的なパッドも存在します.これらのパッドを組み合わせ
ることにより,例えば写真に解説を加えて写真集を作ったり,誰かが作った便利な道具を,
自分が使いやすいように手直ししたりといったことが簡単にできるようになります.この
時,利用者がやらなければいけないことは,必要なパッドを貼ったり,要らないパッドを
はがしたりするということだけです.
1.2
部品の組み合わせによるアプリケーションの開発
インテリジェントパッドには,数百種類の基本パッド部品が用意されています.基本パッ
ドは1枚のパッドで,単独または他の基本パッドと組み合わせて用います.基本パッド部
品を組み合わせたアプリケーションパッドもたくさんあります.新たな機能が必要なとき
には,既存のアプリケーションパッドを再編集して利用することもできます.既存のアプ
リケーションパッドを1つの部品として再利用することができます.
したがって,パッドの組み合わせは無数にあり,多くの場合,既存のパッドや既存のア
プリケーションを利用することで,新しいアプリケーションを開発することが可能です.
1.3
パッド部品の開発
利用者は,パッド部品や既にあるパッドアプリケーションを利用して,必要とする機能
をもつアプリケーションを作ることができることは,上で述べました.しかし,必要とす
る機能がないときは,パッド部品を作成しなければなりません.パッド部品の作成方法に
は,次の3つの方法があります.
①
基本パッドを組み合わせてパッドを作成する.
②
インタプリタ機能を持つパッドを利用して,新しい機能を持つパッドを作成する.
③
C++を用いて,新規の基本パッドを作成する.
1枚のパッドを基本パッドと呼びます.基本パッドを組み合わせて作成した複合パッド
もパッドと呼び,1枚のパッドと同様に部品として再利用することができます.①は,既
存のパッドやそれらを組み合わせて利用する方法です.
②は,基本パッドの1つである手続きパッドを利用して新しいパッドを定義する方法で
す.本書では,この方法を用いてアプリケーションを開発することについて述べます.
③は,②の方法では作成することができない機能や高速の処理速度を必要とする機能を
実現するときに利用します.
2
2.
インテリジェントパッドの操作方法
ここでは,インテリジェントパッドがコンピュータに組み込まれていることを前提に述
べます.インテリジェントパッドの組み込み方法は,以下のホームページを参考にしてく
ださい.
http://www.pads.or.jp/
http://www.kushiro-ct.ac.jp/ipad/
2.1
起動方法
インテリジェントパッドは,windows の
ボタンをマウスでクリックその後,
「プログラム(P)」 → 「IntelligentPad」
→
「IntelligentPad」
と,ボタンをクリックすることによって,システムを起動することができます.
もし,デスクトップ上に
アイコンがあれば,これをダブルクリックして起動
することもできます.
起動画面は,図 1-1 のようになります.
図 2-1
インテリジェントパッドの起動画面
3
2.2
パッドの生成
パッドの生成は,ツールボックスに表示されているアイコンをマウスでクリックし,マ
ウスカーソルを「+」にし,図1に示したウインドウ上でマウスをドラッグすることによっ
て行います.ドラッグの範囲によって,任意の大きさのパッドを生成することができます.
たとえば,絵を表示するイメージパッド
を生成して,絵のファイルをこのパッドの上
にドラッグ(ドラッグアンドドロップ)した結果を
図 2-2 に示します.
イメージパッドは,ファイルをドラッグアンドド
ロップすることによって,ファイルにあるデータを
取り込み,自身に表示する機能があります.このパッ
ドの内部には,取り込んだファイルのファイル名や
ディレクトリ名が保存されています.
直接ファイル名を指定して,絵を表示させること
もできます.その方法は次節で述べます.
2.3
図 2-2
パッドの生成と絵の表示
スロット
パッドには,2.2 節で述べたファイル名やデータを保存するスロットがあります.スロッ
トには,様々なデータが保存できるばかりでなく,他のパッドとスロット同士を結合して,
データを共有することができます.
さらに,スロットを結合することによって,スロットのデータが変更されたといったメッ
セージを伝えることもできます.パッド同士を組み合わせると同時に,このデータ共有と
メッセージの伝達機能を使って,それぞれのパッドが持つ機能を併せ持ったパッドを合成
することができます.
この事は,図 2-3 に示すようなビ
デオとテレビの関係に似ています.
ビデオは,映像を記録したり再現し
たりできます.テレビは,映像を表
示することができます.これらの装
スロット
主スロット
パッド
スロットの
結合
置の映像入力と映像出力のスロット
をケーブルで結合することによって,
図 2-3
ビデオで再生した映像をテレビで見
スロット結合
ることができます.
パッドは,複数のスロットを持っています.そして,パッドの上にパッドを貼ることに
よって,上方パッドのスロットの1つを下方パッドのスロットに結合することができます.
これらの操作において,上方パッドを子パッド,下方パッドを親パッドと呼びます.親
パッドには,複数の子パッドを貼付することができます.子パッドが親パッドに結合した
スロットを主スロットと呼びます.主スロットは,複数のスロットのうちただ一つ指定す
ることができます.
4
2.4
スロット結合
図 2-2 に示したイメージパッドには,<picturename>という名前のスロットがあり,ここ
に,ファイル名が保存されています.文字列パッドをイメージパッドに貼付し,スロット
結合して,ファイルの名前を確認してみます.文字列ぱっどには,文字列を表示したり,
キーボードから文字を入力したりする機能があります
その様子を図 2-4 に示します.ツールボックスから文字列パッドを指定し,イメージパッ
ドの上に生成します.すると,図左のような結合ウインドウが開きます.ここで,スロッ
ト一覧の中から<picturename>を選択し,
「結合する」ボタンをクリックします.これで,パッ
ド同士が結合し,図 2-4 の右のように,イメージパッドのスロットに保存されている文字
データが,文字列パッドに表示されます.
文字列パッドをマウスクリックして,キーボードから別のファイル名を入力することも
できます.ファイル名を入力後,キーボードのエンターキーを押すとイメージパッドには
別の絵が表示されます.
図 2-4
2.5
スロット結合
パッドの基本操作
すべてのパッドに対して,貼り合わせ,複写,消去等の操作を行うことができます.な
お,特に断らない限り,マウスボタンの操作は,左ボタンのこととします.
・ パッドのセレクト
マウスカーソルをパッド上に置いて,キーボードのシフトキーを押しながら,マウス
ボタンをクリックします.パッドの8方に黒い点が表示されます.この状態をセレクト
と呼びます.この状態にすると,マウス操作だけでパッドを移動したり,サイズを変更
したりできます.
・ パッドの移動
2つの方法があります.
1つは,マウスカーソルをパッド上に置いて,マウスの右ボタンをクリックすること
により,操作メニューを表示できます.メニューの中から,「移動」の項目を選択し,
5
マウスボタンをクリックしてください.パッドを移動させることができます.
もう1つは,パッドをセレクトし,ドラッグすることで,パッドを移動できます.
・ パッドのサイズ変更
パッドの移動と同様に,操作メニューを表示して,その中の項目「サイズ変更」を選
択することによって,パッドの大きさを変更することができます.
もう一つの方法として,パッドをセレクトし,8方の黒い点の上にマウスカーソルを
置き,ドラッグすることでも,パッドの大きさが変えられます.
・ パッドの複写と消去
パッドの移動と同様に,操作メニューを表示して,その中の項目「複写」や「消去」
を選択することでこれらの操作を行うことができます.
もう一つの方法として,パッドを選択し,コントロールキーを押しながら D のキー
を押すことでパッドの複写ができます.コントロールキーを押しながら X のキーを押
すことでパッドの消去ができます.
・ スロット結合
パッドの移動で,移動先(マウスカーソル)が他のパッド上のときは,そのパッド(親
パッド)に貼付されます.またそのとき,スロット結合のウインドウが表示されます.
結合先を選択し,「結合する」のボタンを押すと,親パッドにスロット結合されます.
すでに,スロット結合されているときに,結合先を変更するには,操作メニューの中
の「関係付け」の項目を選択してください.
・ 主スロットの変更
上のスロット結合では,子パッドの主スロットを変更することができません.任意の
スロットを親パッドと結合させるには,予め結合させたいスロットを主スロットに変更
しておく必要があります.なお,既に親パッドとスロット結合しているときに,主スロッ
トの変更を行うと,スロット結合が解除されます.
子パッドの複数のスロットを親パッドに結合することはできません.以下に,主ス
ロットの変更方法を述べます.
操作メニューの中の「プロパティ」項目を選択します.プロパティウインドウが表示
されたら,「スロット」タブをマウスボタンでクリックします.ウインドウにスロット
の名前が表示され,その一つにピンク色の「
」チェックマークがついています.この
スロットが現在の主スロットです.
主スロットにしたいスロット名の上にマウスカーソルを置き,クリックします.「主
スロット」ボタン,「適応」ボタンを順にクリックすることで,主スロットが変更され
ます.
・ パッドの色や枠線の変更
操作メニューの中の「プロパティ」項目を選択します.プロパティウインドウが表示
されたら,「表示属性」タブをクリックします.「背景色」ボタンや,「前景色」ボタン
でパッドの色を変更できます.
「幅」の項目で,枠線の太さを変更することができます.
6
・ パッドの保存
作成したパッドは,ファイルに保存することができます.
パッドをセレクトし,その後,操作メニューの中の「ファイル」項目を選択します.
さらに,
「上書き保存」,
「名前をつけて保存」という項目が表示されます.
「名前をつけ
て保存」を選択します.そうすると,保存のためのウインドウが表示されます.適当な
名前をつけて保存ボタンを押すと,その名前に拡張子「.pad」が付けられてファイルに
保存されます.
なお,パッドは,セレクトしたパッドとその子パッドが保存されます.
・ 保存したパッドの生成
保存したパッドは,インテリジェントパッドデスクトップにあるメニュー項目「ファ
イル」の中の「パッドを開く」を選択することによって生成することができます.
・ パッドのグループ化と解除
グループ化することによって,貼り合わされたパッドを1枚のパッドとして扱えるよ
うにします.グループ化を行うと,マウスによる操作性が変更されるだけで,パッドの
機能が変更されるわけではありません.
操作メニューを表示して,その中の項目「編集」項目を選択します.さらに,
「グルー
プ化」,「グループ化解除」という項目が表示されます.「グループ化」を選択すること
によって,選択したパッドとその子パッドがグループ化されます.解除も同様の操作で
できます.
グループ化したパッドをさらに他のパッドとグループ化した場合,すべてのグループ
を解除するには,解除操作を2回行う必要があります
ひと口メモ 2-1
パッドの起動
パッドを起動するには,そのパッドに対しメッセージを送る必要があります.メッ
セージは,既存のパッドを使って送ります.
ボタンパッドやスイッチパッドは,マウスのクリックによって起動するパッドで
す.マウスのイベントによって起動するといいます.このパッドと,スロットを結合
することによって,マウスイベントで起動ができるようになります.
文字列パッドは,キーボードから文字を入力することができます.また,キーイン
パッドは,キーボードイベントで起動するパッドです.
ちょっと変わったパッドに,タイマパッドがあります.このパッドは,一度時間を
セットすると,一定時間間隔でスロット結合した他のパッドを起動します.
7
2.6
時
計
パッドを組み合わせて時計を作ってみましょう.この時計は,コンピュータが管理し
ている時計機能から,時刻情報を取りだし表示します.時刻情報を取り出すパッドが,日
付パッドです.時刻の表示には,数値パッドを用います.以下に,時計パッドの作り方を
説明します.
①
日付パッド
②
を用意してください.
図 2-5 の(a)のように,日付パッドをインテリジェントパッドデスクトップ上に生成
,タイマパッド
,数値パッド
,文字列パッド
,ボタンパッド
します.日付パッドの隣に数値パッドを生成します.
③
つぎに,時計の文字の大きさを変更します.数値パッドの上にマウスカーソルを移
動して,マウスの右ボタンをクリックし,メニューを表示します(図 1-5 の(b) ).
メニューから「プロパティ」の項目を選択し,クリックします.そうすると,図 2-5
の(c)のプロパティウインドウが表示されます.プロパティウインドウから,表示属
性タブ,つぎにフォントのボタンをクリックします.さらに,文字の大きさと字体
を選択します.
(a)
(b)
<size>を選択
(c)
(d)
図 2-5
日付パッドと数値パッドの設定
8
④
数値パッドの小数点以下の数字を表示しないように設定します.図 2-5 の(d)のよう
に数値パッドの上に数値パッドを生成します.結合ウインドウが表示されますので,
<size>スロットを選択し,結合してください.そして,貼付した数値パッドをクリッ
クした後,キーボードから「0」を入力
し,エンターキーを押します.下の数値
パッドの表示に小数点以下の数値が表
示されないことを確認し,上の数値パッ
ドを消去します.
⑤
数値パッドを複写しながら,日付パッド
の上に貼付します.このとき,スロット
結合のウインドウが表示されますが,1
枚目は<hour>に,2枚目は<min>に,3
枚目は<sec>に結合します(図 2-6 の(a)).
⑥
(a)
これで,時計パッドができましたが,表
示時間が更新されません.日付パッドを
起動するためには,ボタンパッドを貼付
して,これを<now>スロットに結合しま
す.ボタンパッドをクリックする度に新
しい時間が表示されるようになります.
ボタンパッドの代わりにタイマパッ
ドを使ってパッドを起動することもで
きます.タイマパッドは,ボタンパッド
タイマパッド
ボタンパッド
を何度も押す代わりに,一定時間間隔で
(b)
パッドを起動します.
⑦
タイマパッドを日付パッドの上で生成
して,<now>スロットと結合します.ま
た,タイマパッドは初期値で,5秒間隔
で起動するように設定されているため
これを変更します.タイマパッドの上に
数値パッドを生成します.そして,
<interval>スロットと結合します.数値を
5から1に変更します(図 2-6 の(b)).
⑧
数値パッドの間に「:」の記号を文字列
パッドで表示したり,パッドの色や枠線
の表示を変更したりして,図 2-6 の(c)の
図 2-6
(c)
時計パッド
ような時計を作ることができます.この作業の間は,時計の機能を停止して行いま
す.タイマパッドは,これに貼付した数値パッドの値を 0 に設定すると停止します.
9
3.
手続きパッド
1.3 節で述べたように,パッドを組み合わせてアプリケーションを開発するとき,必要な
機能を持ったパッドがないときには,新たにパッドを作成する必要があります.
ここでは,インタプリタ機能が利用できる手続きパッドについて説明します.これを用
いると,新しいパッドを簡単に作ることができます.
3.1
インタプリタ
手続きパッドは,<program>,<errmsg>といったスロットを持つパッドです.<program>
スロットに,プログラムを記述することで,新しいスロット定義したり,プログラムを実
行したりできます.
プログラムは,C 言語に似たインタプリタ言語です.プログラムを記述すると即座に実
行可能な状態になります.プログラムの記述では,アルファベットや数字,記号が使える
ほか,漢字も利用することができます.
3.2
プログラム例
図 3-1 は,数値を入力すると,その
テキストパッド
値を10倍にして出力するプログラム
を定義したパッドです.
作り方を説明します.先ず,手続き
パッド
をインテリジェントパッド
デスクトップに生成します.その上に,
テキストパッド
数値パッド
手続きパッド
を生成して,手続き
パッドの<program>スロットに結合し
ます.
テキストパッドの上で,クリックし
図 3-1
手続きパッド
た後,キーボードからプログラムを打
ち込みます.プログラムに誤りがなければ,<x>と<y>のスロットができます.
つぎに,数値パッド
を2枚生成して,それぞれを<x>と<y>のスロットと結合します.
<x>スロットに結合した数値パッドに適当な数値を入力すると,もう一方の数値パッドに,
10倍された値が出力されます.
このプログラムは,<x>スロットに数値が入力されるとプログラムが実行されます.この
ように,スロットの状態が変わると,実行されるプログラム(関数)をアクション関数と
呼びます.図 3-1 のプログラムでは,このアクション関数を定義しています.
3.3
問題
①
四則演算,余り(*/+-%)を用いたプログラムを作ってください.
②
ボタンやタイマパッドを用いたカウンタのプログラムを作ってください.
10
ひと口メモ 3-1
スロットと変数
手続きパッドでは,データを記憶する入れ物として,スロットと変数を定義す
ることができます.
データを保存する機能に関して,このスロットと変数に違いはありません.異
なるのは,スロットは,他のパッドをこのスロットに結合して保存している値を
取り出したり,書き込んだりできることです.変数では,このようなことができ
ません.
スロットと変数の型
スロットや変数には,記憶できるデータの種類によって,型があります.利用
できる型について,表で示します.
データの内容
宣言文
スロット
変数
文字列
String
○
○
数値
Number
○
○
論理値
Boolean
○
○
ディクショナリ
Dictionary
○
○
文字
Char
×
○
イベント
Command
○
×
プログラム例
<name>スロットに結合した文字列パッドから文字を入力すると,文字数と文字
列に含まれる「a」の文字数が出力されるプログラムです.
slot String name;
slot Number x,y;
Number z;
action name()
{
Number i;
Char comp='a';
z = 0;
y = strlen(name);
for(i = 0; i<y; i = i+1)
{
if(name[i] == comp) z = z+1;
}
x = z;
}
11
4.
足し算のプログラム
図 4-1 に示すような足し算のプログラムを作りま
す.図で台紙になっているパッドが手続きパッドで
す.その上に貼付された3枚のパッドは,いずれも
数値パッドです.手続きパッドに定義したプログラ
図 4-1
ムをリスト 4-1 に示します.なお,プログラム作成
リスト 4-1
に用いたテキストパッドは,削除してあります.
3枚の数値パッドは,それぞれ左から<y>,<x>,
足し算のプログラム
slot Number x,y,z;
<z>のスロットと結合されています.左の数値パッド
action x()
から順に数値を「12」,「34」と入力すると一番右の
{
z = y + x;
数値パッドに和「46」が表示されます.
こんどは,真ん中のパッドから順に左のパッドへ
}
と,
「10」,
「20」と入力するとどうなるでしょう.右
リスト 4-2
のパッドには,「30」ではなく,「22」という値が表
slot Number x,y,z;
示されます.
これは,スロットの値が変わったときに起動する
アクション関数が,<x>スロットに対応したものしか
action x()
{
z = y + x;
定義していないためです.
リスト 4-2 に,2つのスロットのいずれから入力
}
しても,正しい答えが出力されるプログラムを示し
action y()
ます.
{
z = y + x;
}
ひと口メモ 4-1
エラー
プログラムに,間違いは付き物です.プログラムの間違いには,考え方の間違い「論
理的エラー」と文字の打ち間違い「文法的エラー」といったエラーがあります.手続
きパッドでは,文法的エラーが即座に分かります.
右の図のように,手続きパッドに2枚のテキストパッ
ドを,<program>スロットと<errmsg>スロットに結合しま
す.文法的なエラーがあると,<errmsg>スロットにエラー
の内容が保存されます.ただし,右図のように,誤りの
あった行に,エラーが現れるとは限りません.例では,
「y」と「;」間には,スペースがあっても良いからです.
12
「;」がない
5.
ふくろう時計のプログラム
5.1
目玉の作成
2章の 2.6 節で作成した時計パッドに目玉を
付け,ふくろう時計を作って見ましょう.
完成図を図 5-1 に示します.目玉が左と右を
向いている様子が分かるように,図の上と下に
1秒ごとの図を示してあります.
ふくろう時計は,時計の秒の値が奇数のとき
は,左向きの絵を,偶数のときは.右向きの絵
を表示しています.絵は,2枚の絵を交互に表
示することができるスイッチパッドを用いてい
ます.
では,作り方を説明します.
先ず,2枚の目玉の絵を作成します.絵を描
くためのプログラムを起動します.ここでは,
ウインドウズのアプリケーションである「ペイ
図 5-1
ふくろう時計
ント」を使います.絵のサイズを 100 ドット×
100 ドットに設定して,右向きの絵を作ります.
これに名前を付け,ファイルに保存します.
つぎに,黒目の部分を白で消去し,左向きの
目玉を作成します.これにも名前を付け,ファ
イルに保存します.
ペイントを終了し,インテリジェントパッド
を起動します.
スイッチパッド
を適当な大きさで,生成し
ます.このとき,スイッチパッドは白く表示さ
れています.
先ほど作成した,右向きの目玉のファイルを
図 5-2
絵の作成
スイッチパッドの上にドラッグします.
スイッチパッドをクリックします.このとき,スイッチパッドは黒く表示されます.先
ほど作成した,左向きの目玉のファイルをスイッチパッドの上にドラッグします.
目玉の表示部分はこれで完成です.
5.2
目玉を動かす
目玉を表示するスイッチパッドの主スロットは,<status>で,Boolean という型になって
います.Boolean は,2つの値(TRUE / FALSE)を記憶することができます.<status>に TRUE
を設定すると,左向きの目玉が,FALSE を設定すると,右向きの目玉が表示されます.
13
したがって,作成するプログラムは,時計パッドの<sec>スロットから数値を受け取り,
その値が,
奇数→スロットに TRUE を設定
偶数→スロットに FALSE を設定
という機能を実現すればよいことになります.
奇数/偶数の判定は,数値を2で割ったときの剰余を求めることで確認できます.余り
が1であれば奇数で,0であれば偶数ということになります.
プログラムをリスト 5-1 に示します.
リスト 5-1
手続きパッドにこのプログラムを定義し,エラーがない
ことを確認します.
slot Number in;
つぎに,この手続きパッドをセレクトし,主スロットを
<program>から<in>に変更します.
slot Boolean out;
action in()
ファイルに保存してある時計パッドをインテリジェント
{
パッドデスクトップに読み込みます.そして適当な大きさ
if(in%2==1) out=TRUE;
にサイズを変更してください.
else out=FALSE;
時計パッドの上に,今作成した手続きパッドを貼付し,
}
<sec>スロットに結合します.さらにその上に,先ほど作成
したスイッチパッドを貼付し,<out>スロットに結合します.
目玉を2つに増やすには,今作成した手続きパッドをセレクトし,複写して時計パッド
の上に貼付するだけでできます.このときもスロットは,<sec>スロットに結合します.
以上の操作で完成です.
ひと口メモ 5-1
if 文
ふくろう時計のプログラムのように,値が1のときは,×××の処理,0のときは,
△△△の処理,というように条件によって処理の内容を変えるとき使う命令に if 文が
あります.if 文は,右のプログラムのように使います.
条件式には,数値や文字の大小比較の式やその式を&&
(AND)や||(OR)といった論理演算子で結合した式が記述さ
れます.
右のプログラムでは,条件式1が真のときには実行文1
のみ実行されます.条件式1が偽のときは,条件式2が判
定され,条件式2が真であれば,実行文2のみが実行され
ます.さらに,条件式2も偽であれば,実行文3のみが実
行されます.
右のプログラムで,else if または,else を省略することが
if( 条件式 1 )
{
実行文1
}
else if( 条件式 2 )
{
実行文 2
}
else
{
実行文3
}
できます.else if を複数記述することもできます.
実行文が1行のときには,{ }を省略することもできます.
14
ひと口メモ 5-2
変数の名前/スロットの名前
リスト 4-1 の x,y,z やリスト 5-1 の in,out は,スロットに付けた名前です.同様に,
変数にも名前を付けることができます.スロットは,プログラムのはじめに,変数は,
プログラムのはじめや関数のはじめで,型と名前の宣言を行ってから使用することが
できます.
名前は,先頭が英字で始まる 64 文字以内の英数字,または,32 文字以内の漢字で
表します.ただし,次の文字列は,システムが使用しているため使用することができ
ません.
action
{
Number
Boolean
if slot
その他,{
break
Char
continue Command else Dictionary for
return String while }など,
組み込み関数名
組み込み定数名
}
ひと口メモ 5-3
式と演算子
変数や定数を各演算子で結合したものを式と呼びます.
A= B + C
A>=B
A= 3 + B*C
演算子の種類
演算子には以下のものがあります.
種 類
代入演算子
算術演算子
関係演算子
論理演算子
演算子
=
+
-
*
/
%
<
>
<=
>=
!=
==
!
&&
||
機
能
右辺の値を左辺に代入する
加算を行う
減算を行う
乗算を行う
除算を行う
余りを計算する
ある値より小さいか調べる
ある値より大きいか調べる
ある値以下か調べる
ある値以上か調べる
ある値と等しくないか調べる
ある値と等しいか調べる
結果が偽か調べる
論理積をとる
論理和をとる
15
5.3
問題
手続きパッドを使っていろいろな計算をするプログラムを作ってみましょう.
①
2つの数値を読み込んで,大きい方の数値を出力してください.
②
2つの数値を読み込んで,小さい方の数値を出力してください.
③
2つの数値を読み込んで,同じなら0を,異なっていれば1を出力してください.
④
2つの数値を読み込んで,大きい順に数値を出力してください.
⑤
3つの数値を読み込んで,一番大きい数値を出力してください.
⑥
3つの数値を読み込んで,大きい順に数値を出力してください.
⑦
入力した値が奇数の時に,その数を出力してください.
⑧
入力した値が偶数の時に,その数を出力してください.
⑨
入力した値が奇数の時には2倍,偶数の時には3倍の値を出力してください.
⑩
’A’という文字を入力すると1増え,’B’という文字を入力すると1減る,それ以外の
文字の時には変化しないプログラムを作ってください.
⑪
2つの文字列を入力し,長い方の文字列を表示してください.
⑫
y=ax2 + bx + c の判別式の値を表示してください.
⑬
1つの数値を入力し,整数部と小数部を別々に出力してください.
16
6.
乱数とさいころ
6.1
乱数
シューティングゲームやロールプレイングゲームで,敵がいつも同じところに現れたの
では,すぐに飽きてしまいます.ゲームを開始するごとに,敵が以前と異なったところに
現れるようにするために,さいころと同じような予想できない数値を作る必要があります.
このような数を乱数と呼びます.
簡単な乱数の作成は,大きな数のかけ算で作ります.たとえば,
123×0.123=15.129
123×0.129=15.867
123×0.867=106.641
という計算を繰り返します.計算結果のうち小数以下の数値を使います.この数値を乱数
の種と呼びます.種にかけ合わせる数にもっと大きな値をとり,種の有効桁数を増やすこ
とによって,偏りの少ない乱数ができます.
ボタンを押すと新しい乱数を出力するプログラムを,リスト 6-1 に示します.
<out>スロッ
トに結合した数値パッドには,はじめ小数以下の数値を入力
しておきます.(例
リスト 6-1
0.123456789)
図 6-1 に,完成したパッドの図を示します.ボタンパッド
slot Number out;
を押すことによって,数値が変化する様子を示してあります. slot Command b;
数値パッドの<size>スロットには,10 が設定してあります. action b()
{
6.2
さいころ
out=1234567*out%1;
乱数を利用して,さいころを作ってみましょう.はじめに, }
少数以下の乱数から,1 から 6 の数値を作ります.
乱数を6つに区分して,
0.0000000~0.1666666→1
0.1666666~0.3333333→2
0.3333333~0.5000000→3
手続きパッド
0.5000000~0.6666666→4
0.6666666~0.8333333→5
0.8333333~0.9999999→6
と変換します.この変換にも剰余の計算を使います.
例えば,乱数が 0.456789 のとき,
0.456789×6+1=3.740734
となるので, さらに剰余の計算
図 6-1
3.740734%1=0.740734
乱数パッド
を利用して小数以下の数を取り除くと,3 が得られます.
この方法を使って作ったプログラムをリスト 6-2 に示します.乱数の種は,<r>スロット
17
に結合した数値パッドから与えています.
リスト 6-2
図 6-2 にパッドを示します.2枚の数値パッドのうち,上
は,<r>スロットに結合し,下は,<out>スロットに結合して
slot Number r,out;
います.右のパッドは,ボタンパッドで,<b>スロットに結
slot Command b;
合しています.
action b()
では,この乱数パッドを使ってさいころを作ってみましょ
{
う.プログラムは,まったく変更しません.使うパッドは,
と,スクロール文字列パッド
ピクチャフォルダパッド
r=1234567*r%1;
out=r*6-r*6%1+1;
}
です.あとは,ペイントを使って6枚のさいころの絵
を作成し,名前を付け
てファイルに保存します.
ピクチャフォルダパッドは,複数の絵を登録す
ることができるパッドです.登録順に番号が振ら
れ,その番号を指定することで,対応する絵を表
手続きパッド
図 6-2
示させることができます.
整数値の乱数
図 6-3 に示すようにはじめに,ピクチャフォル
ダパッドを生成します.その上にボタンパッドを
貼付し,<foldersize>スロットに結合します.
ボタンパッドは,絵を表示するときの絵の大き
さを指定するのに使われています.ボタンパッド
を適当な大きさにします.
(ここでは,ボタンパッ
ピクチャフォルダパッド
ドを使用して大きさを指定していますが,この操
作に限り,いずれのパッドでもかまいません.)
つぎに,スクロール文字列パッドをピクチャ
フォルダパッドに貼付し,<addPicture>スロット
図 6-3
ピクチャフォルダパッド
に結合します.これで,絵を登録する準備が整い
ました.
先ほど作った絵のファイルを,
から順に,
ドラッグ&ドロップ
スクロール文字列パッドの上にドラッグします.
すると,図 6-4 のように,ボタンパッドに絵が表
示されます.以下,
の表示まで,ファイルを
ピクチャフォルダパッド
絵のファイル
図 6-4
絵の登録
順にドラッグします.
1から6まで登録が済みましたら,不要なスクロール文字列パッドを削除して,ピクチャ
フォルダパッドの大きさを,絵が表示されているパッドの大きに変形します.そして,こ
18
のピクチャフォルダパッドを乱数パッドに貼付し,<out>スロットに結合するとさいころの
できあがりです.ボタンパッドを押すと,さいころの目が変わります.
完成したパッドを図 6-5 に示します.
図のように,2つのさいころを作ること
もできます.このときには,2種類の乱数
を作る必要があります.変更したプログラ
ムをリスト 6-3 に示します.ここでは,<r>
スロットの初期値を,数値パッドからでは
なく,プログラムで与えています.
6.3
図 6-5
乱数でπの計算
乱数でπ(3.1425926…)を求めることが
手続きパッド
さいころパッド
リスト 6-3
できます.図 6-6 に示すように,正方形と
それに内接する円の図形を考えます.正方
slot Number r,out1,out2;
形は,一辺の長さが2とします.従って,
slot Command b;
正方形の面積は 4 になります.また,正方
r=0.1234567;
形に内接した円の半径は 1 になるので,面
積は, 1×1× π = π (3.1415926...) になります.
action b()
r に初期値を
{
与えます.
r=1234567*r%1;
図 6-6 のような正方形を床に描いて,高
い位置からそこに不規則にボールを落とし
out1=r*6-r*6%1+1;
したとき,正方形の内部やさらに円の内部
r=1234567*r%1;
に落ちるボールの数は面積に比例するはず
out2=r*6-r*6%1+1;
}
です.図 6-6 のように4つのボールが正方
形の中に入り,その内3つが円の中にはっ
たとすると,円の面積は,およそ3といえます.40 や 400,4000 ともっと数を増やすと,
πに近い値を得ることができます.
ここで,たくさんのボールを実際に落とすとなると大変です.そこで,ボールの代わり
に乱数を使ってボールが落ちる位置を作ります.ボールの落下位置は,正方形の左下を基
点にx座標と y 座標で表すことができます.この x と y の値を乱数で作ればいいのです.
この計算をシミュレーションといいます.
リスト 6-4 に 2 つの乱数を作るプログラムを示します.また,その結果をグラフパッド
に示したのが図 6-7 です.図 6-7 では,40 個の点を乱数で作り表示しています.その内 29
個が円の中に表示されています.従って,乱数で作った円周率は,29÷10=2.9 となります.
もっとたくさんの乱数を作ることで,より円周率に近い値を得ることができます.試して
みてください.
6.4
問題
① さいころのある目が,他の目よりも出やすくした「いかさまさいころ」を作ってみ
て下さい.
② 6.3 節の結果と①からよい乱数とは何かについて考えてみてください.
19
2
リスト 6-4
slot Dictionary list;
slot Command clr,clock;
slot Number n,seed;
Number rand();
action clr()
{
n=0;
clear(list);
}
action clock()
{
Dictionary temp;
Number x,y;
x=rand();
y=rand();
put(temp,"x",x);
put(temp,"y",y);
put(list,ftoa(n),temp);
n=n+1;
}
Number rand()
{
seed=123456789*seed%2;
return seed;
}
2
x
y
図 6-6
図 6-7
πの計算
シミュレーション結果
ひと口メモ 6-1
プログラムのスタイル
プログラム例を見ると,中括弧{}で囲まれた文が,2~3文字右に寄せられて記述
されています.これを字下げと呼びます.また,中括弧で囲まれた文をブロックと呼
びます.
ブロックの中に,ブロックが含めることもできます.字下げは,ブロックの範囲を
一目で分かるようにしています.字下げは,してもしなくても文法的エラーにはなり
ませんが,プログラムの見通しをよくするために行わなければいけません.
同時に,中括弧も{と}を対応が分かるように記さなければなりません.このテキス
トでは,上下に並ぶように記してあります.
20
7.
もぐらたたき
5章のふくろう時計で使用した,2枚の絵を交互に表示できるスイッチパッドと6章の
乱数パッドを組み合わせてもぐらたたきゲームを作ります.
7.1
1匹もぐらのもぐらたたき
はじめに,もぐらが1匹だけ,穴から出たり入ったりするパッドを作ります.ふくろう
時計で行ったように,もぐらの穴
ともぐら
の絵を2枚作り,スイッチパッドに絵
を登録します.
手続きパッドに,リスト 7-1 を定義し,タイマパッドを貼付,<clock>スロットに結合,
スイッチパッドを<a>に結合します.ここで,タイマパッドを<clock>スロットに結合した
のは,繰り返しもぐらを出したり引っ込めたりするためです.
プログラムリスト 7-1 を見ると,4行目に「Number random();」があります.これは,関
数の宣言文です.関数のプログラムは,下に定義してあります.乱数を作る機能を1つの
関数にしてあります.こうすることによって,名前の記述だけで乱数を生成することがで
きます.(アクション関数とユーザ定義関数は,一口メモ 7-1 を見てください)
アクション関数<clock>は,タイマによって,1秒に1回起動されます.関数が起動され
ると,乱数の関数を起動し,その値が1のときには,<a>スロットの値を TRUE にし,そう
でないときには FALSE にします.<a>スロットに結合したスイッチパッドは,その値によっ
て穴やもぐらを表示します.
乱数を計算する関数 random は,6章のさいころのプ
リスト 7-1
ログラムとほとんど同じです.1から6の乱数がほぼ
均等に作られるとすると,図 7-1 のもぐらたたきは,
6秒に1回の割合で穴から出てくることになります.
ここで作成したもぐらたたきパッドは,もぐらをた
たくと,引っ込みますが得点は計算されません.次節
で複数のもぐらと,カウントの計算をするプログラム
を作ります.
slot Number r;
slot Command clock;
slot Boolean a;
Number random();
r=0.123456789; 乱数の初期値
action clock()
{
if(random()==1) a=TRUE;
else a=FALSE;
タイマパッド
}
Number random()
スイッチパッド
{
r=123456789*r%1;
図 7-1
return r*6-r*6%1+1;
1匹もぐら
}
21
7.2
制限時間とカウント
制限時間と得点を計算する機能をプログラムリスト 7-1 に追加し,これをリスト 7-2 に示
します.<nokori>スロット,<ten>スロットおよび<start>スロットが追加されました.
<start>スロットには,ボタンパッドを結合し,ボタンを押すとアクション関数 start で,
残り時間や得点が初期値に設定されます.
アクション関数 clock が少し変更されました.残り時間が0のときは,なにもせずに終了
します.0以外のときは,残り時間から1を減じ,もぐらを乱数の値によって出現させま
す.
リスト 7-2
アクション関数 a が追加されました.これは,スイッ
チパッドをマウスでたたくと,起動します.もぐらを
slot Number r,nokori,ten;
表示しているときにたたくと,得点が加算されます.
slot Command clock,start;
穴が表示されているときにたたくと,得点が減らされ
slot Boolean a;
ます.
Number random();
r=0.123456789;
パッドを図 7-2 に示します.
action start()
{
a=FALSE;
nokori=10;
ten=0;
}
action clock()
{
if(nokori==0) return;
手続きパッド
nokori=nokori-1;
図 7-2 得点付きもぐらたたき
if(random()==1) a=TRUE;
else a=FALSE;
}
action a()
{
if(a==FALSE) ten=ten+1;
else ten=ten-1;
a=FALSE;
}
Number random()
{
r=123456789*r%1;
return r*6+1-r*6%1;
}
22
7.3
ピクチャフォルダパッドを用いたもぐらたたき
6 章のさいころで用いたピク
リスト 7-3
チャフォルダパッドを用いる
action clock()
と,複数の異なるもぐらが出て
slot Number r,nokori,ten;
くるもぐらたたきを作ること
slot Command clock,start;
if(nokori==0) return;
が出来ます.リスト 7-3 にプロ
slot Number na;
nokori=nokori-1;
グラムの例を示します.
slot Command ca;
if(random()==1) a=TRUE;
slot Boolean a;
else a=FALSE;
Number random();
na=random();
7.4
もぐらの出現確率を
変える
もぐらごとに出現確率を変
{
r=0.123456789;
}
action start()
action a()
{
{
えるには,まず乱数で作られる
a=FALSE;
if(a==FALSE) ten=ten+1;
数値を変えます.リスト 7-3 で
nokori=10;
else ten=ten-1;
ten=0;
a=FALSE;
関 数
random() の 中 の 式
「r*6+1-r*6%1;」を
}
}
「r*10+1-r*10%1;」と変更する
action clock()
action ca()
ことで,1 から 10 の値を作る
{
{
ことが出来ます.その後,アク
if(nokori==0) return;
if(na==1) ten=ten+1;
ション関数「action clock()」を
nokori=nokori-1;
else if(na==2) ten=ten+5;
リスト 7-4 のように変更します.
if(random()==1) a=TRUE;
else ten=ten-1;
else a=FALSE;
na=1;
}
}
Number random()
{
r=123456789*r%1;
return r*6+1-r*6%1;
}
リスト 7-4
if(random()<=2) a=TRUE;
Number random()
action clock()
else a=FALSE;
{
{
t=random();
r=123456789*r%1;
Number t;
if(t==1 || t==2) na=1;
return r*10+1-r*10%1;
if(nokori==0) return;
else if(t>=3 && t<=10) na=2;
nokori=nokori-1;
else na=3;
na=random();
}
23
}
7.5
①
問題
さらにもぐらを増やすには,どうしたらよいで
しょうか.
ヒントは,<a>スロットのほかに,<b>,<c>,…
とスロットを増やし,スロットに対応するアク
ション関数を定義すればできます.図 7-3 のよ
うなもぐらたたきを作ってみてください.
②
もぐらの出方(出現の割合)を変えるにはどう
したらよいですか.
③
最高得点を記録するようにしてください.
図 7-4 学生の作品1
図 7.5
学生の作品2
24
図 7-3
もぐらたたき
ひと口メモ 7-1
アクション関数
スロットに結合した他のパッドによって,スロットの値が変更されたときや,スロッ
トが Command 型で,イベントが送られたとき(ボタンパッド結合し,これが押された
とき)に起動される関数がアクション関数です.
スロットをプログラムのはじめで宣言すると,スロットに対応したアクション関数を
定義することができるようになります.スロットをデータ保存にしか利用しないときに
は,アクション関数を省略することができます.
アクション関数の名前は必ずスロット名と一致しなければいけません.アクション関
数は,次のような形式をしており,{}で囲まれる中に,必要なプログラムを記述するこ
とができます.
action abc()
{
/*任意のプログラム*/
}
組み込み関数
sin の計算や文字数の計算といったよく使われる機能は,予めシステムに関数として
組み込まれています.このような関数を組み込み関数と呼びます.組み込み関数は,関
数の名前と計算に必要な値を関数に渡すための引数を記述することで利用できます.た
とえば,sin 1.5 の計算は,次のプログラムで求められます.
x=sin(1.5);
ユーザ定義関数
組み込み関数にないが,よく使う機能を関数にして定義することができます.このよ
うな関数をユーザ定義関数と呼びます.
ユーザ定義関数を定義するには,スロットの宣言の後に関数を宣言し,その下で関数
を定義する必要があります.例を下に示します.
slot Number abc;
Number tashizan(Number, Number);
…
Number tashizan(Number x, Number y)
{
Number z;
z=x+y;
return z;
}
25
8.
電
8.1
ボタンパッドを使って,数字や記号の入力
卓
ボタンパッド
は,マウスのクリックを
感知して,コマンドスロットと結合したパッ
ドを起動する働きがありました.ボタンパッ
ドには,文字列を登録して,その文字を親
パッド(スロット結合したパッドのスロッ
ト)に設定する機能が有ります.
ボタンパッドに文字列を設定する方法を
説明します.
これらを順にクリック
図 8-1 文字列の入力
はじめに,ボタンパッドのプロパティを表示します.そして,スロットタブをクリック,
スロット名が表示されますので,その中から<keyentry>をクリックします(図 8-1).
さらにスロット値変更ボタンをクリックします.スロット値変更のウインドウ
が表示されますので,true をクリック,その後 OK ボタン,適用
ボタンをクリックすると,文字入力ができる状態になります.
この方法を使うと直接スロットの値を変更することができます.
文字入力は,ボタンパッドのセレクト状態を解除して(デスクトップウインドウの任意
の位置でマウスクリック),マウスカーソルをボタンパッドの上において,キーボードから
文字を入力します.
文字入力が済んだら,先ほどの操作と同じことを行い,<keyentry>スロットの値を FALSE
にします.
さらに,ここで主スロットを<string>に変更しておきます.
文字の大きさや色は,プロパティの中の表示属性を選択して変更します.
このようにして「0」~「9」の数字や,「+」「-」といった記号を表示したボタンパッド
作成します.図 8-2 のように作成したボタンパッドを文字列パッドに貼付し,<string>スロッ
トに結合して動作を確認します.ボタンパッドを押す
とそれぞれのボタンパッドに表示されている文字が,
文字列パッドにも表示されます.
これらのパッドは,次節以降で,電卓のボタンとし
て使います.
8.2
図 8-2
小数点を含まない数値の入力
文字列パッドとスロット結合
図 8-2 に示したパッドの貼り合わせでは,
1文字の数字しか入力することができません.
電卓や電話では,ボタンを押すとそれまでに打ち込んだ数値が左に移動(左シフト)して,
入力した値が追加されます.たとえば,
「1234」といった数値をどのようにして作ったらよ
26
いでしょうか.
すでに入力されている数値が左にシフトするということは,値を10倍するということ
です.123 という値が入力されているときに,4 のボタンが押されたら,123*10+4 という
計算を行えばよいことになります.
ここで問題があります.ボタンパッドから入力される数字は文字として表されています.
「a1b2c3…」と書かれた a や b といった文字と同じに扱われているのです.コンピュータ
の内部では,同じ「1」が文字として記憶する場合と,数値として記憶する場合があります.
ここでは,ボタンパッドから入力された「1」は,String 型のスロットに結合し,値を入力
することができますが,Number 型のスロットには入力することができません.
そのため,文字として入力した数字を数値に変換する必要があります.変換の方法には
いくつか有りますが,組み込み関数 ftoa()を使うのが簡単です.
以上を考慮したプログラムをリスト 8-1 に示します.これを手続きパッドに定義して,
<k1>スロットに数値を表示したボタンパッドを結合します.また,数値パッドを<ans>ス
ロットに結合します.このパッドを図 8-3 に示します.
数値パッドに 0.0 以外の数値が表示されているときには,
キーボードから数値パッドに 0 を入力してから,ボタンを
押してください.
リスト 8-1
手続きパッド
slot Number ans;
slot String kn;
action kn()
{
ans=ans*10+atof(kn);
}
図 8-3
8.3
クリアボタン
数値入力
リスト 8-2
図 8-3 のパッドにクリアボタンを追加します.クリアボ
タン(clr)の文字列は,8.1
slot Number ans;
節で述べた方法で作成し
slot String kn,kc;
ます.
action kn()
{
プログラムは,リスト
ans=ans*10+atof(kn);
8-2 に示します.クリアボ
タンの処理は,<kc>スロッ
}
トに結合し,数値ボタンと
action kc()
異なる関数で処理します. 図 8-4
ボタンが追加された
クリアボタンの追加
{
if(kc=="clr") ans=0;
}
パッドを,図 8-4 に示します.
27
8.4
演算ボタン
図 8-4 に示したパッドに,足し算機能と引き算機能を付加します.
次のような足し算を行う場合,電卓では,
「1」のボタンから「=」のボタンまでを,順に
押すことになります.
123+456=
途中「+」のボタンが押されたときには,一旦 123 という数値を保存し,新たに 4 から 6
の数値を受け付ける必要があります.そして,「=」のボタンが押されたとき,保存してい
た 123 と 456 を加算します.
すなわち,
「=」が押されたとき,それ以前に押されたボタンに対応した演算(ここでは
加算)を行う必要があります.そのため「+」
も保存する必要があります.
リスト 8-3
slot Number ans;
slot String kn,kc;
8-3 に示します.リスト 8-3 の関数 kc()では, Number temp;
String operator;
単項演算(clr)と二項演算(+,-)を分けて処 Boolean num;
理しています.
action kn()
図 8-5 に,パッドを示します.「+」ボタン {
if(num==FALSE)
と「-」ボタンパッド,「=」ボタンパッドは,
{
<kc>スロットに結合しています.
temp=ans;
num=TRUE;
ans=atof(kn);
}
else
{
ans=ans*10+atof(kn);
}
}
action kc()
{
if(kc=="clr")
{
ans=0;
図 8-5 電卓
operator="";
}
リスト 8-3 で,Boolean 型変数 num は,数
else
値ボタンの処理で,直前に「+」や「-」のボ
{
if(operator=="+") ans=temp+ans;
タンが押されたことを知るために用意してあ
else if(operator=="-") ans=temp-ans;
ります(押されたときには num が FALSE に
operator=kc;
なります).
temp=0;
}
上述の例では,
「2」と「3」ボタンの処理の
num=FALSE;
ときはそれまでに入力(ans に保存)されてい
}
る値を10倍した後,これに入力された値を
以上のことを考慮したプログラムをリスト
加算し変数 ans に保存します.
28
「+」が押されると,num が FALSE になります.
「4」ボタンが押されると,123 は変数 temp に保存され,変数 ans に 4 が保存され,変数
num が TRUE になります.こうして,2桁目以降の数値入力に対応する準備が整います.
これらの処理は,プログラムの上から 8~13 行目に対応します.
Numbar 型変数 temp と String 型変数 operataor は,数値と演算子の保存用です.上の例で
は,temp に数値「123」が,operator に文字列「+」が保存されます.
アクション関数 kn()は,数値ボタンパッドからの入力に対する処理を行っています.ま
た,アクション関数 kc()は,演算ボタンパッドからの入力に対する処理を行っています.
アクション関数 kc()で,「+」ボタンが押されたときは,関数のはじめの方の if 文では,
条件を満たさないため,なにも行われません.関数 kn()の最後の3行だけが実行されます.
すなわち,文字列「+」を変数 oprator に保存,数値入力が終わったことを num=FALSE で
記録,数値 123 を保存する変数 temp をクリア(この行は,なくてもよいが,
「+」ボタンが
押し続けられると最後に保存した値が加算され続けるためクリア)する.
次節では,この電卓で小数点を含む数値を扱えるようにします.
8.5
小数点を含む数値の入力
前節で示したプログラムによって,だいぶ電卓らしいパッドができあがってきました.
しかし,リスト 8-3 のプログラムでは,小数点が含まれる数を扱うことができません.
たとえば,
「123.456」という数値は,123 までは,保存している値を10倍し,これに入
力された値を加算して値を求めました.同様の考え方で,4 からは,入力した値を 1/10,
1/100 としながら,保存している値に加算します.
6 が入力されたときは,123.45 に 6 の 1/1000 倍した値 0.006 を加算します.
小数点付き数値の入力では,以上の処理が必要なため,小数点を押された後,入力され
た数が小数以下何桁目かを記録しておかなければいけません.
1/10,1/100 の計算は,組み込み関数 pow(10, n)を使います.n の値を-1,-2 とすることに
より,1/10,1/100 の値が求まります.
小数点入力に対応したプログラムをリスト 8-4 に示しま
す.また,完成した電卓パッドを図 8-6 に示します.図 86で,数値パッドの<size>スロットの値は,5 にしてあり
ます.
「.」ボタンパッドは,<kn>スロットに結合してあり
ます.
リスト 8-4 で,小数点の処理は,アクション関数 kn()で
行っています.また,小数点が入力された以降入力された
数値の桁を,Number 型変数 p に保存しています.その値
は,小数以下第 1 位のとき,-1,第 2 位のとき,-2,以下
第 n 位のとき-n となります.p が 0 のときは,まだ小数点
が入力されていないことを表しています.
したがって,小数点が入力されるまでは,リスト 8-3 で
図 8-6
示したのと同様の処理が行われます.
29
完成した電卓パッド
リスト 8-4
action kc()
{
slot Number ans;
slot String kn,kc;
Number temp,p;
String operator;
Boolean num;
action kn()
{
if(num==FALSE)
{
temp=ans;
num=TRUE;
if(kn==".")
単項演算の処理
if(kc=="clr")
{
ans=0;
operator="";
}
else if(kc=="√") ans=sqrt(ans);
else
{
if(operator=="+") ans=temp+ans;
else if(operator=="-") ans=temp-ans;
operator=kc;
temp=0;
二項演算の処理
}
num=FALSE;
}
{
ans=0;
演算子のボタンを押した直後に数値
p=-1;
ボタンまたは,小数点ボタンを押し
}
たときの処理
else
{
小数点ボタンを押したときの処理
ans=atof(kn);
p=0;
数値ボタンを押したときの処理
}
}
else if(kn==".")
数値ボタンを連続して押していると
{
きの処理
if(p==0) p=-1;
}
途中で,小数点ボタンを押したとき
else if(p<0)
の処理
{
小数点ボタンを押した後の処理
ans=ans+atof(kn)*pow(10,p);
p=p-1;
}
else
小数点ボタンを押していないときの
{
処理
ans=ans*10+atof(kn);
}
}
30
8.6
数値入力部品
インテリジェントパッドには,いろいろな数値入出力部品が用意されています.これら
の部品を電卓の入出力に用いることができます.表 8-1 に主な部品の名称や入出力範囲,
主スロット名等を示します.
表 8-1 に示したパッドは,表示パッドとしても用いることができます.
表 8-1
数値入力部品
部品名
アイコンおよびパッド
入出力範囲と説明
主スロット
有効桁数 16 桁の数 value
数値パッド
値.
0 から 1 の実数値.
スライダパッド
value
マウスの左右方向ま
たは縦方向のドラッ
グによって値を入力
することができる.
0 から 360 の実数値. value
タコメータパッド
マウスの操作によっ
て値を入力すること
ができる.
スロット <in> に入力 out
レンジパッド
した値をスロット
<min>および<max>に
設定した値で変換し
て<out>に出力する.
31
ひと口メモ 8-1
繰り返し文
繰り返し文には,for 文と while 文があります.
while 文
while (条件式)
{
繰り返し実行する文
}
条件式が成立している間,条件式の横の{}に囲まれた処理を繰り返し実行します.条件
式が偽になった時点で処理を中止し,次の処理を行います.
for 文
for (式 1; 条件式; 式 2)
{
繰り返し実行する文
}
式 1: 繰り返し回数の初期値を式で指定します.本パラメータは省略できません.
条件式: 繰り返し実行するための条件を式で指定します.本パラメータは省略でき
ません.
式 2: 繰り返し回数を更新する式を指定します.本パラメータは省略できません.
break 文
break 文は,それを囲んでいるもっとも内側の while 文または for 文の実行を終了させ,
その while 文または for 文の次の文の実行を行います.
continue 文
continue 文は,それを囲んでいるもっとも内側の while 文または for 文の文の終わりに
制御を移します.
繰り返し文の例
for 文による 1 から 10 までの和.
while 文による 1 から 10 までの和.
Number i,j;
:
i=1;
j=0;
while(i<11)
{
j=j+I;
i=i+1;
}
Number
i,j;
:
j=0;
for(i=1;i<11;i=i+1)
{
j=j+i ;
}
32
8.7
for 文を使ってみよう
8.5 節で示した電卓では,入力した数値に対し足し算や引き算や引き算の計算を行うこと
ができました.足し算や引き算は,二項演算です.また√の演算は,単項演算です.同様
に,sin や cos の関数も利用することができます.利用可能な関数は,付録 D の組み込み関
数に示してあります.前章の「ひと口メモ 7-1」で説明した関数の定義を使って,ユーザ自
身が新しい関数を定義することもできます.
この節では,ユーザ定義関数と「一口メモ 8-1」で説明した for 文を使って,電卓に新し
い演算ボタンを定義します.関数 sum は1からnまでの和を求める関数です.
リスト 8-5
関数の型
slot Number ans;
関数名
slot String kn,kc;
Number sum(Number n)
Number temp,p;
{
String operator;
Number
Boolean num;
j=0;
Number sum(Number);
引数
関数の定義
i,j;
for(i=1; i<=n; i=i+1)
関数の宣言
{
j = j+i ;
中略
}
action kc()
return j;
}
{
if(kc=="clr")
{
ans=0;
operator="";
}
else if(kc=="√") ans=sqrt(ans);
else if(kc==”sum”) ans=sum(ans);
else
{
if(operator=="+") ans=temp+ans;
else if(operator=="-") ans=temp-ans;
operator=kc;
temp=0;
}
num=FALSE;
関数の型はこの j の
型と一致する.
}
33
8.8
①
問題
リスト 8-4 では,小数点が続けて押されることを考慮していません.続けて押した
ときには,入力した値を 0 にするようにしてください.
②
かけ算やわり算の機能を付加してください.
③
sin 等の関数の機能を付加してください.
④
ラジアンとデグリーの切り替えボタンを付加してください.
ひと口メモ 8-2
図 8-7 学生の作品
数字が文字?
電卓パッドでは,数値の入力や演算子の入力にボタンパッドを使いました.ボタ
ンパッドには,文字を予め登録しておき,ボタンを押すことによってその文字を他
のパッドのスロットに代入するという機能が有ります.
電卓パッドのプログラムでは,計算結果や入力した数値は,Number 型のスロット
に記憶するようにしました.しかし,ボタンパッドから1つ1つ入力した数値は,
文字として入力しています.この数字は,アルファベットや記号と同様に扱われて
いるため,足し算などの演算や三角関数などの関数に代入することができません.
この数字を計算に使える数値に変換するのが,組み込み関数 atof()です.電卓パッ
ドでは,数字が入力されるたびに,この関数で数値に変換しています.
ひと口メモ 8-3
グローバル変数とローカル変数
手続きパッドのプログラムでは,プログラムのはじめと関数のはじめで,変数宣
言を定義できます.
変数宣言をプログラムのはじめで行うと,その変数は,いずれの関数内からも利
用することができます.このような変数をグローバル変数と呼びます.
変数宣言を関数のはじめで行うと,変数はその関数内でのみ利用できます.この
ような変数をローカル変数と呼びます.
異なる関数であれば,ローカル変数に同じ名前を使うことができます.
また,グローバル変数とローカル変数に同じ名前を使うこともできます.ただし,
関数内では,ローカル変数が優先されます.
34
9.
シューティングゲーム
9.1
Dictionary 型スロット/Dictionary 型変数
スロットを介して,複数のパラメータ値を送りたいとき,インテリジェントパッドでは,
パッド間で複数のスロット結合を許していないので,Dictionary 型のスロットを使います.
このスロット型は,パラメータ値に名前(キー)を付けて,1固まりのデータとして扱え
るので,データベースなどのデータ管理でも便利に使えます.Dictionary 型は,変数にも使
えます.
ここでは,動くパッド(モービルパッド)に,座標データを与えるために使用します.
座標データは,x 座標と y 座標を組にして扱う必
リスト 9-1
要があります.これを Dictionary 型でリスト 9-1
のように表すことができます.
slot Dictionary zahyo;
ここで,x,y がキー名で,0.5 は x や y と名前
slot Command init;
が付けられたパラメータ値になります.このデー
action init()
タ「座標」は,
{
x
0.5
put(zahyo, "x", 0.5);
y
0.5
put(zahyo, "y", 0.5);
}
と考えることができます.
この例では,パラメータ値は,Number 型の値で
リスト 9-2
すが,Dictionary 型の値を保存することができます.
リスト 9-2 の例では,Dictionary 型の変数 temp に
slot Dictionary zahyo;
値を代入し,さらにこれを Dictionary 型の<zahyo>
slot Command init,get;
スロットに代入しています.このデータ「座標」
slot Number x,y;
は,
action init()
ABC
x
y
0.5
0.5
{
Dictionary temp;
と考えることができます.このようなデータを2
put(temp, "x", x);
次元 Dictionary と呼びます.
put(temp, "y", y);
put(zahyo, "ABC", temp);
次節で説明するモービルパッドは,2次元
}
Dictionary で表されたデータを利用します.
2次元 Dictionary で表されたデータから,パラ
メータ値を取り出す方法は,リスト 9-2 のアクショ
action get()
{
Dictionary temp;
ン関数 get()のようにします.プログラムのように,
temp=getDictionary(zahyo,"ABC");
適当な Dictionary 変数に要素を取りだし,
さらに,
x=getNumber(temp,"x");
その要素の要素を取り出すことになります.
y=getNumber(temp,"y");
}
35
9.2
モービルパッド
モービルパッド
(1,1)
は,座標パラメータを
(0.5,0.5)
受け取ると,その座標値に自身を移動させ
るパッドです.このパッドは,他のパッド
の上でのみ動き回ることができます.
座標は図 9-1 のようになっています.左
下が(0,0)で,右上が(1,1)です.図 9-1 では,
モービルパッド
モービルパッドに移動先の座標値(0.5,0.5)
が与えられたときの様子を示しています.
では,モービルパッドをプログラムで動
(0,0)
図 9-1
かして見ましょう.プログラムは,リスト
任意のパッド
モービルパッドの座標系
9-3 です.手続きパッドにプログラムを定義した後,ボタンパッドを貼付し,<clock>スロッ
トに結合します.また,モービルパッドを<ido>に結合します.
これは,ボタンを押すとモービルパッドが左下から,右上に斜めに移動するプログラムで
す.プログラム中,0.1 というパラメータを変えると移動方向や移動速度が変わります.
また,ボタンパッドの代わりにハイタイマパッド
を用いると,自動的に移動するパッ
ドを作ることができます.
ハイタイマパッドは,スロットに<stop>,<start>,<interval>があります.<stop>,<start>
スロットには,ボタンパッドを結合してください.<interval>スロットには,数値パッドを
リスト 9-3
slot Dictionary zahyo;
ido;
結合してください.時間の間隔の単位はミリ秒になっ
ています.
作成したパッドを図 9-2 に示します.
slot Command clock;
slot Number x,y;
action clock()
ハイタイマパッド
{
<clock>
Dictionary temp;
if(x>1) x=0;
if(y>1) y=0;
x=x+0.1;
y=y+0.1;
モービルパッド
put(temp, "x", x);
put(temp, "y", y);
<zahyo>
put(ido,"1", temp); temp);
put(zahyo,"ABC",
}
図 9-2
36
手続きパッド
モービルパッドの移動
9.3
いろいろな動きをするモービルパッド
リスト 9-4
前節で示したモービルパッドは,直線運動をして
いましたが,プログラムの仕方によっていろいろな
slot Dictionary zahyo;
動きをさせることができます.
slot Command clock;
波のように揺れながら移動するモービルパッドを
slot Number x,y;
action clock()
作ってみましょう.
プログラムをリスト 9-4 に示します.リスト 9-3
{
とほとんど同じです.赤色で示した部分だけが違い
Dictionary temp;
ます.
if(x>1) x=0;
x=x+0.1;
このパッドの図を図 9-3 に示します.
y=0.2*sin(x*10)+0.5;
put(temp, "x", x);
put(temp, "y", y);
put(zahyo,"ABC", temp);
ハイタイマパッド
}
リスト 9-5
モービルパッド
手続きパッド
図 9-3
9.4
波形に移動するモービルパッド
1つのパッドに2種類の動きをさせ
る
リスト 9-4 を変更して,途中からモービルパッド
の動きを変えるプログラムの例をリスト 9-5 に示し
ます.トグルスイッチパッドを用意して,手続き
パッドのスロット<hit>に結合してください.トグル
スイッチパッドを押すとパッドの動きが変わりま
す.
この例題では,スロット<hit>を TRUE にするこ
とによって間接的にスロット<ochiru>を TRUE にし
ています.これは,9.7 節で述べる,レーダパッド
を利用するためです.
37
slot Dictionary zahyo;
slot Command clock;
slot Number x,y;
slot Boolean ochiru,hit;
action clock()
{
Dictionary temp;
x=x+0.01;
if(ochiru==TRUE)
{
y=y-0.1;
}
else
{
y=0.5;
}
if(x>1 || y<0)
{
x=0;
y=0.5;
ochiru=FALSE;
}
put(temp, "x", x);
put(temp, "y", y);
put(zahyo,"ABC", temp);
}
action hit()
{
if(hit==TRUE) ochiru=TRUE;
}
9.5
問題
リスト 9-6
リスト 9-6 に放物線状に移動するプログラム例を示し
ます.いろいろな動きをするプログラムに挑戦してみて
ください.
①
6章で作った乱数を利用して,いろいろなところか
ら現れるパッドを作って下さい・
②
途中から動きが変わるパッドを作って下さい.
9.6
複数のパッドを独立して動かす
前節までに,いろいろな動きをするパッドを作りまし
た.複数のパッドを同時の動かすにはどうしたらよいか
を考えてみましょう.
1つのプログラムで,複数のスロットに座標値を与え
ることもできます.しかし,1つのモービルパッドには,
1つのプログラムで対応した方が,プログラムが簡潔に
なり,見通しがよくなります.
slot Dictionary zahyo;
slot Command clock;
slot Number x,y,vx,vy,dt,a;
x=0;y=0;dt=0.05;vx=0;vy=0;
a=-0.5;
action clock()
{
Dictionary temp;
if(y<0)
{
x=0.0;y=0.0;dt=0.05;
vx=0.3;vy=0.7;a=-0.5;
}
x=x+vx*dt;
vy=vy+a*dt;
y=y+vy*dt;
put(temp,"x",x);
put(temp,"y",y);
put(zahyo,"ABC",temp);
}
前節で作成したパッドは,図 9-4 の(a)に示すように,
手続きパッドの上にモービルパッドを貼付しています.
モービルパッド
ハイタイマパッド
<list>
<counter>
<zahyo>
手続きパッド
ハイタイマパッド
<clock>
結線
<zahyo>
<list>
<clock>
手続きパッド
モービルパッド
(a)
図 9-4
<counter>
台紙パッド
(b)
手続きパッドとモービルパッドの関係
ここで,これらの親子関係を逆にしてみます.
図 9-4 の(b)のように,手続きパッドの主スロットを<zahyo>に変更しモービルパッドに貼
付し,<list>スロットに結合します.このままでは,動きませんので,台紙パッド
を適
当な大きさで生成し,その上にモービルパッドを貼付します.ハイタイマパッドは,手続
きパッドに貼付してもよいのですが,動いているパッドのハイタイマを停止する操作が難
しくなるので,結線という方法でスロット結合します.結線の方法は,一口メモ 9-1 を見
てください.
1つのハイタイマパッドで動作させるパッドが,複数あってもかまいません.ハイタイ
38
マパッドと結線でスロット結合すればOKです.
上述のようにして作成したモービルパッドは,複写するだけで,複数並行して動作させ
ることができます.シューティングゲームの敵や味方,ミサイルなどの動きは,それぞれ
のプログラムで定義すればよく,個別に動作を確認しながら開発することができます.
次の節では,こうして作った複数のパッドの関係(重なり等)を知る方法について解説
します.
9.7
レーダパッド
前節では,独立に動き回るパッドについて,作り方を説明しました.シューティングゲー
ムでは,
「向かってくる敵をミサイルで撃ち落とす」といった動作をさせなければなりませ
ん.これを実現するためには,次のような場合分けが必要になります.
①
敵とミサイルに一定の動きをさせます.
②
やがて敵とミサイルが衝突します.
③
敵とミサイルが爆発します.
④
敵とミサイルがきえます
このように,敵やミサイルは2つの表示と2つの動作(まっすぐ進むと消える)を実現
しなければいけません.また,そのきっかけは,衝突(パッドの重なり)です.
重なりを検知するパッドにレーダパッド
があります.このパッドは,一口メモ 9-1 で
述べた,共有複写を利用して重なりを検知します.レーダパッドは,レーダパッドを1つ
生成してから,それの共有複写を作ります.共有複写の数は,何枚でも可です.図 9-5 に
示すように複数のレーダパッドを作るには,共有複写したパッド,またはもとのパッドを
共有複写します.
レーダパッドには,<hit>と<search>というスロットがあります.定期的に重なりを調べ
るために,共有複写したレーダパッドの1つに,ハイタイマパッドを結合します.この結
合は1つで十分です.図 9-5 では,レーダパッドの<search>スロットとハイタイマパッドを
結線で結合しています.
<hit>スロットは,重なりがあると TRUE がセットされます.
図 9-5 では,重なりを調べるために,
レーダパッド
<hit>スロットにスイッチパッドを結合し
ています.スイッチパッドは,レーダパッ
ドが重なると,赤く表示されるように設定
してあります.
スイッチパッド
結線
上で述べた①は,すでに前節でも実現し
ハイタイマパッド
ています.9.4 節の問題の②に取り上げま
したが,2種類の動作をプログラムに定義
図 9-5
共有複写されたレーダパッド
しておき,レーダパッドからのデータの種
類によって動きを変えれば,上述の③や④が実現できます.次節で,簡単なシューティン
グゲームの例を示します.
39
9.8
シューティングゲーム
シューティングゲームの例を図 9-6 に示します.また,図の右には,パッドの貼り合わ
せを示します.一部,ボタンパッド等を省略してあります.
このゲームは,
「shoot」ボタンを押すと左下からパソコンの絵を表示したパッドが放物状
に打ち出されます.一方,敵のパソコンが毎回高さをランダムに,左端から現れます.パ
ソコン同士が当たると,弾のパソコンは,左下隅に消え,敵のパソコンは,下方に落下し
ます.
プログラムは,弾のプログラムと,敵のプログラムの2つです.これらをリスト 9-6 と
リスト 9-7 に示します.
イメージパッド
手続きパッド
レーダパッド
レーダパッドとハ
イタイマとの結線
は1つでよい.
共有複写
<hit>
<search>
<zahyo>
結線
<hit><clock>
<hit>
<list>
モービルパッド
<counter>
台紙パッド
図 9-6
ハイタイマパッド
シューティングゲームとパッドの貼り合わせ
ひと口メモ 9-1
結線によるスロット結合
基本的にパッドのスロット結合は,貼り合わせを行うことによって行います.しか
し,操作するパッドと操作されるパッドが離れていたり,小さかったりしたときに結
線という方法でスロット結合することができます.
パッドの特殊な複写に,共有複写というのがあります.共有複写されたパッドは,
見かけ上独立したパッドですが,スロットを共通にしています.一方のパッドからス
ロットデータを変更すると,他方のパッドのスロットデータも変更されたように見え
ます.結線はこの共有複写を利用して実現しています.
結線の仕方
結線は,パッドメニューの中から,
「関係」を選択し,
「結線」を選択します.する
と,パッドの中央から線が表示されますので,結合したいパッドの上でクリックしま
す.
40
弾のプログラム
リスト 9-7
slot Dictionary zahyo;
slot Command start,clock;
slot Number x,y,vx,vy,a,dt,v,th,deg;
slot Boolean stop,hit;
Void shoki();
deg=60;
弾の初期発射角度
action hit()
{
if(hit) shoki();
}
レーダパッドに
よって起動されま
す.敵に当たると,
初期位置に移動し
ます.
action start()
{
shoki();
stop=FALSE;
}
「start」ボタンに
よって起動されま
action deg()
{
th=deg/180*PI;
shoki();
}
角度をラジアンに
変換して th に
代入します.
action clock()
タイマによって起
{
動されます.
Dictionary el;
if(stop) return;
弾の位置を計算し
x=x+vx*dt;
ています.放物線
y=y+vy*dt;
を描くように移動
vy=vy+a*dt;
if(y<0.0) shoki();
します.
put(el,"x",x);
put(el,"y",y);
put(zahyo,"ABC",el);
}
弾の座標を表の型
す.
にしています.
Void shoki()
弾の初期位置,初
{
Dictionary el;
速度をセットしま
x=0.03;y=0.03;
す.
dt=0.1;v=1;a=-1;
vx=v*cos(th);
vy=v*sin(th);
stop=TRUE;
hit=FALSE;
put(el,"x",x);
put(el,"y",y);
put(zahyo,"ABC",el);
}
*リスト 9-7 では,deg,x,y,dt,v,aの初期値を関数 shoki()で与えています.
スタートボタンを押すことで,初期値が設定されます.
このプログラムを定義している手続きパッドに数値パッドを貼付しそれぞれのスロット
に結合して,直接代入することもできます(結線でも可能です)
.そのときには,関数 init()
内の,dt=0.1;,v=1;,a=-1;,の各行を取り除いてください.
41
敵のプログラム
リスト 9-8
slot Dictionary zahyo;
slot Command clock;
action clock()
タイマによって
{
起動されます.
Dictionary temp;
slot Number r,x,y,h,vx,vy,a,dt;
slot Command shoki;
slot Boolean hit,ochiru;
if(y<0 || x>1)
台紙の範囲を超
{
えると初期位置
Number random();
action hit()
if(hit==TRUE)
よって起動されま
{
す.弾に当たると,
ochiru=TRUE;
に戻ります.高
x=0.0;dt=0.05;
さ h は乱数で決
vx=0.5;vy=0;a=-2; めています.
ochiru=FALSE;
レーダパッドに
{
h=random();
}
if(ochiru==FALSE)
落下します.
落下の計算.
{
}
x=x+vx*dt;
}
y=h+0.02*sin(50*x);
押しボタンを結合
action shoki()
し,ただ一度実行
{
します.
}
敵の移動を計算
else
しています.
{
x=0.0;h=0.5;dt=0.05;
x=x+vx*dt;
vx=0.5;vy=0;a=-2;r=0.123456789;
y=y+vy*dt;
}
vy=vy+a*dt;
乱数の計算をして
Number random()
います.
{
r=123456789*r%1;
return r/2+0.5;
}
}
put(temp,"x",x);
put(temp,"y",y);
put(zahyo,"ABC",temp);
}
* スロットの初期値を以下のようにしてください.ボタンパッドを結線で<shoki>に結合
しマウスクリックすることで設定されます.
* 得点や残り時間は,別の手続きパッドを持ちます.リスト 9-9 の例ではスロット<count>
を敵を定義した手続きパッドの<ochiru>に結線で結合します.
リスト 9-9
slot Boolean count1,count2
slot Number point;
action count1()
{
if(count1==TRUE) point=point+1;
}
action count2()
{
if(count2==TRUE) point=point+5;
}
得点の値を変える
ことができます.
42
9.9
ハイタイマパッドの起動と停止
リスト 9-10 に 2 つの得点と残り時間を制御するプログラムを示します.図 9-7 は,パッ
ドの貼り合わせと結線の様子を示しています.ハイタイマーの<start>と<stop>にはコマンド
パッドを結合します.コマンドパッドの主スロットは<command>に変更しておく必要があ
ります.その後,それぞれのコマンドパッドを結線で,リスト 9-10 のプログラムを定義し
た手続きパッドの<timerOn>と<timerOff>に結合します.なお,手続きパッドの<clock>には,
1 秒に設定したタイマーパッドを結合します.
リスト 9-10
slot Boolean count1,count2;
slot Number point,nokori;
slot Command clock,start,timerOn,timerOff;
action count1()
{
if(count1==TRUE) point=point+1;
}
action start()
{
nokori=1000;
point=0;
¥update(timerOn);
}
action clock()
{
if(nokori<=0)
{
¥update(timerOff);
return;
}
nokori=nokori-1;
}
コマンドパッド
<timerOn> <timerOff>
タイマーパッド
得点およびハイタイマーの制御
図 9-7 得点および起動制
43
9.10 シューティングゲームの例
これまでに,いろいろなシューティングゲームが作られましたので,一部を紹介します.
授業の様子
図 9-8
授業の様子と学生の作品
44
10. 住所録
9 章の 9.1 節で Dictionary 型変数について,説明しました.Dictionary 型は,住所や名前,
年齢といった,組になったデータを扱うのに向いています.ここでは,この Dictionary 型
を使って住所録を作ります.
10.1 個人データの登録
はじめに,登録する項目を決めます.デー
表 10-1 住所録データ
タに対する検索機能や編集機能は,少しずつ
データ項目
追加していくことにします.簡単のため,表
10-1 に示した項目に限定します.項目の追加
は,変数の追加,データの書き込みや読み出
し手続きの追加で対応できます.
キー名
名
前
name
住
所
address
電話番号
phone
表 10-1 の基本データを登録するプログラムを作成します.各データは,文字列パッドか
ら入力し,追加ボタンを押すことで登録することにします.
プログラムをリスト 10-1 に示します.データを Dictionary 型スロットに追加するだけで
したら,これでOKです.リスト 10-1 の最後の行にある「ftoa(n)」は,数値 n を文字列に
変換する組み込み関数です.これで,一人分のデータを保存するときの「キー名」を作っ
ています.
このプログラムだけでは,データが正しく登録されているか分かりません.図 10-1 に示
すように,表パッド
を貼付し,<data>スロットに結合してみましょう.名前,住所,電
話番号を入力して,追加ボタンを押すと,表パッドにデータが追加されるのが分かります.
追加ボタンを押し続けると,同じデータが追加されます.表パッドの左から2列目の小数
点付き数値が,個人データのキー名になります.このキー名は,見かけ上数値に見えます
が,データ型は,String 型です.
文字列パッド
リスト 10-1
slot String name,address,phone;
slot Dictionary data;
slot Command append;
slot Number no;
action append()
{
Number n;
Dictionary temp;
put(temp,"name",name);
put(temp,"address",address);
put(temp,"phone",phone);
n=length(data);
put(data,ftoa(n),temp);
}
<name
ボタンパッド
<address>
<phone>
<append>
結合先スロット名
<data>
手続きパッド
図 10-1 住所データの登録
45
10.2 指定位置データの取りだし
図 10-1 の表パッドに示されている,個人データの番号を入力して,個人データを取り出
す機能を,リスト 10-1 のプログラムに追加します.この機能追加のプログラムを,リスト
10-2 に示します.
関数 setData(Number n)は,n を与えて,<data>ス
ロットの n 番目に,
「名前」
「住所」
「電話」データを
記録する機能を定義してあります.この機能は,元々
アクション関数「append」に定義されていましたが,
後の再利用を考慮して,新たな関数として再定義し
ました.その結果,アクション関数「append」が,
変更になりました.
関数 getData(Number n)は,n を与えて,<data>ス
ロットの n 番目に記録されているデータを取り出す
機能を定義してあります.アクション関数「no()」で
同じことを定義してもよいのですが,後の検索機能
等で再利用することを考慮しています.
図 10-2 に,パッドを示します.図で指定している
番号が,0 から始まっていることに注意してくださ
い.
番号を指定
<no>
結合先スロット名
リスト 10-2
slot String name,address,phone;
slot Dictionary data;
slot Command append;
slot Number no;
Void setData(Number);
Void getData(Number);
action append()
{
Number n;
n=length(data);
setData(n);
}
action no()
{
getData(no);
}
Void setData(Number n)
{
Dictionary temp;
put(temp,"name",name);
put(temp,"address",address);
put(temp,"phone",phone);
put(data,ftoa(n),temp);
}
Void getData(Number n)
{
Dictionary temp;
temp=getDictionary(data,ftoa(n));
name=getString(temp,"name");
address=getString(temp,"address");
phone=getString(temp,"phone");
}
手続きパッド
図 10-2 番号で取りだし
では,次節から,データの検索や編集について,説明します.
10.3 節では,更新機能について,10.4 節では,削除機能について,10.5 節では,検索機
能について説明します.
46
10.3 更新機能
更新機能は,追加機能とほとんど同じです.追加機能が,既にあるデータの最後にデー
タを(データの数を調べて)書き込むのに対し,更新
は,取り出したデータがあった位置に重ね書きします.
更新のプログラムを,リスト 10-3 に示します.パッ
ドを図 10-3 に示します.
データの更新
<update
結合先スロット名
手続きパッド
図 10-3 データの更新
10.4 削除機能
データの削除も,以下に示すように,更新と同様,
1行のプログラムで実現できます.
remove(data, ftoa(no));
この方法で,最後に追加したデータを削除したとき
には,問題なく追加や番号による検索ができます.
しかし,途中のデータ,例えば,図 10-3 の表パッド
に示されているデータのうち,キー名が「0.000」や
「1.000」が削除されると,追加の機能が使えなくなり
ます.
これは,追加機能でデータを追加する際に,新しい
キー名を既にあるデータの個数から作っているからで
リスト 10-3
slot String name,address,phone;
slot Dictionary data;
slot Command append,update;
slot Number no;
Void setData(Number);
Void getData(Number);
action append()
{
Number n;
n=length(data);
setData(n);
}
action update()
{
setData(no);
}
action no()
{
getData(no);
}
Void setData(Number n)
{
Dictionary temp;
put(temp,"name",name);
put(temp,"address",address);
put(temp,"phone",phone);
put(data,ftoa(n),temp);
}
Void getData(Number n)
{
Dictionary temp;
temp=getDictionary(data,ftoa(n));
name=getString(temp,"name");
address=getString(temp,"address");
phone=getString(temp,"phone");
}
す.上の例で,キー名「0.000」のデータが削除される
と,登録されているデータ2個になります.ここで追加をおこなうと,新しいキー名が
「2.000」となり,データの書き込を行っても,既にあるキー名が「2.000」のデータが更新
されるだけです.
データの並べ替え
この問題に対応するためには,使われていないキー名を利用するか,キー名を新たに振
47
り直す必要があります.ここでは,後者の方法を使います.
キー名の振り直しは,一番目から順にデータを取りだし,新しいキー名を付け再保存す
るという方法で行います.そのために新しい命令文として,繰り返しの命令を使います.
使い方は,一口メモ 10-1 に示します.
削除機能を追加したプログラムを,リスト 10-4 に示します.プログラム中 ngetKey(data,i)
は,Dictionarydata から i 番目のデータのキー名を取り出す,組み込み関数です.
パッドは,次節で検索機能を付加したものと合わせて図 10-4 に示します.
リスト 10-4
slot String name,address,phone;
slot Dictionary data;
slot Command append,update,delete;
slot Number no;
Void setData(Number);
Void getData(Number);
action delete()
{
Dictionary temp;
Number n,i;
remove(data,ftoa(no));
n=length(data);
for(i=0;i<n;i=i+1)
{
put(temp,ftoa(i),getDictionary(data,
ngetKey(data,i)));
}
data=temp;
}
action append()
{
Number n;
n=length(data);
setData(n);
}
action update()
{
setData(no);
}
action no()
{
getData(no);
}
Void setData(Number n)
{
Dictionary temp;
put(temp,"name",name);
put(temp,"address",address);
put(temp,"phone",phone);
put(data,ftoa(n),temp);
}
Void getData(Number n)
{
Dictionary temp;
temp=getDictionary(data,ftoa(n));
name=getString(temp,"name");
address=getString(temp,"address");
phone=getString(temp,"phone");
}
48
10.5 検索機能
名前を入力して,住所や電話番号を表示する,検索機能を追加します.検索方法は,個
人データを順に取り出し,さらに名前データを取り出し入力データと比較し,一致したデー
タが見つかるまで繰り返すという単純なものです.検索の途中で一致したデータが見つか
ると,住所録データを(関数 getData()で)取り出し終了します.
完成した住所録を図 10-4 に示します.
リスト 10-4
slot String name,address,phone;
slot Dictionary data;
slot Commandappend,update,delete,search;
slot Number no;
Void setData(Number);
Void getData(Number);
action search()
{
Dictionary temp;
Number n,i;
n=length(data);
for(i=0;i<n;i=i+1)
{
temp= getDictionary(data,
ngetKey(data,i));
if(name==getString(temp,"name"))
{
no=i;
getData(no);
break;
}
}
}
action delete()
{
Dictionary temp;
Number n,i;
remove(data,ftoa(no));
n=length(data);
for(i=0;i<n;i=i+1)
{
put(temp,ftoa(i),getDictionary(data,
ngetKey(data,i)));
}
data=temp;
}
action append()
{
Number n;
n=length(data);
setData(n);
}
action update()
{
setData(no);
}
action no()
{
getData(no);
}
Void setData(Number n)
{
Dictionary temp;
put(temp,"name",name);
put(temp,"address",address);
put(temp,"phone",phone);
put(data,ftoa(n),temp);
}
Void getData(Number n)
{
Dictionary temp;
temp=getDictionary(data,ftoa(n));
name=getString(temp,"name");
address=getString(temp,"address");
phone=getString(temp,"phone");
}
49
図 10-4 完成した住所録
10.6 問題
住所録に次の機能を追加してください
①
データに「備考」項目を追加してください.
②
検索機能を強力にしてください.
・「扇*」といった検索ができるようにしてください.
③
データに「ふりがな」項目を追加し,あいうえお順に並べ替える機能を追加してく
ださい.
50
11. スタック
データを,レンガを積む要領で,読み書きできる記憶装置をスタックと呼びます.この
装置では,記憶装置のどの位置に書き込むかといったことを考慮する必要がなく,簡単に
書き込みや読み出しができます.ただし,最後に書き込んだデータが,はじめに読み出さ
れる(LIFO-Last In First Out)という制限があります.
このような装置にデータを書き込むことをプッシュダウン,読み出すことをポップアッ
プと呼びます.コンピュータの中では,レジスタのデータを退避するのにこれらの命令が
頻繁に使われています.
本章では,この命令を模擬したプログラム(スタックパッド)を作成します.また作成
した,スタックパッドを,12章のポーランド変換で,使用します.
11.1 スタックの構造
ここで作るスタックパッド
では,スタックに保存するデー
タを文字列(単語)に限定しま
ポップアップ
プッシュダウン
す.
たとえば,スタックを図 11-1
の(a)のようにイメージし,実際
のデータは,図 11-1 の(b)のよ
うに,単語間をスペースで区切
ることによって実現すること
the
snow
white's
story
the
(a)
にします.
スタックに対する,操作機能
white's
story
(b)
図 11-1
として次のことを実現します.
snow
スタック
①
プッシュダウン →
データを書き込むと,スタックのはじめにデータが記録される
②
ポップアップ
"pop"という文字列を送るとスタックのはじめのデータが取り
→
出され,スタックからそのデータは取り除かれる
③
入力された文字列が空のとき("")は,何もしない.
以上をプログラムにしたものを,リスト 11-1 に示します.プッシュダウンの機能は,関数
push(),ポップアップの機能は,関数 pop()で実現しています.
<sp>スロットは,スタックのデータを保存しています.
データの入出力は,<out>スロットで行い,入力された文字列によって,プッシュダウン
とポップアップの処理を分けています.文字列パッドを結合して,データの書き込みと読
み出しを行います.ポップアップは,この文字列パッドに"pop"と書き込むことで,同じス
ロットに取り出したデータが出力されます.
できあがったパッドを,図 11-2 に示します.
このスタックを組み合わせると,いろいろなことができます.次節の例題では,これを
2つ組み合わせて,単語の並べ替えを行います.次章では,ポーランド変換の部品として
51
利用します.
リスト 11-1
<sp>
<out>
手続きパッド
結合先スロット名
図 11-2
スタック
11.2 単語の並べ替え
2つのスタックを並べ,一方からポップアップし
たデータを他方にプッシュダウンすることによっ
て,単語の並べ替えができます.
ポップアップとプッシュダウンを自動化したプ
ログラムを,リスト 11-2 に示します.また,パッ
ドを図 11-3 に示します.
ボタンパッドを押すと,1つずつ単語が移動しま
す.
リスト 11-2
slot String in1,in2;
slot Command move;
action move()
{
in1="pop";
in2=in1;
in1="";
}
slot String sp,out;
Void push();
Void pop();
action out()
{
if(out=="pop") pop();
else if(out!="") push();
}
Void push()
{
sp=out+" "+sp;
out="";
}
Void pop()
{
String temp;
Number len,i;
len=strlen(sp);
out="";
temp="";
for(i=0;i<len;i=i+1)
{
if(sp[i]==' ')break;
out=out+sp[i];
}
for(i=i+1;i<len;i=i+1)
{
temp=temp+sp[i];
}
sp=temp;
}
結合先スロット名
<in1>
図 11-3
<move>
<in2>
スタックを用いた単語の並べ替え
52
手続きパッド
11.3 問題
①
リスト 11-2 のプログラムを,1回ボタンを押すと,データがすべて送られるように,
for 文を使って書き換えてください.
②
スタックにある単語の数を数えるプログラムを作って下さい.
ひと口メモ 11-1
文字と文字列
プログラム作成に使っている本インタプリタ(C++や Java も)では,データとして
文字と文字列を区別しています.
Char 型の文字変数で扱う文字は,1文字のみを保存できる変数です.これに「a」
や「b」の文字を直接代入するときは,'a'や'b'を用います.
一方,String 型のスロットや変数に,
「a」や「b」の文字を直接代入するときは,"a"
や"b"を用います.
「"」で囲まれた文字は,インタプリタでは,データが1文字でも文字列として扱い
ます.さらに,「""」は,データが空ですが,これも文字列です.
文字列は,任意の長さの複数文字を扱うことができ,その終わりをヌルという特殊
な文字で知ります.長い文字列の途中に,ヌルを代入すると,突然文字列は,短くなっ
てしまします.なおこのヌルは,表示してみることができませんが,数値の 0 が対応
しています.
文字列の中の1文字取りだし
String 型で定義されたスロットや変数にあるデータから1文字指定して取り出すに
は,次のようにします.
String s;
Char c;
s="abcdefg";
c=s[5];
:
上のプログラムは,文字列変数 s に"abcdefg"の 7 文字を代入しておき,文字変数 c
にその 5 番目を取りだし代入するというものです.
ここで,注意しなければいけないのは,文字列の位置は,0 から数えることです.
したがって,c には,'f'が代入されています.
同様にして,文字列内のデータを入れ替えることもできます.
53
12. ポーランド記法
12.1 演算の優先順序
8章の電卓のプログラムにおける演算は,数値や演算子の入力順にしたがって処理を行
いました.しかし,予め入力した式を評価する場合には,演算の優先順序を考慮する必要
があります.
例えば,A=B+C*D では,乗算の処理を行った後,加算を行わなければいけません.この
演算の優先順序を考慮することなく計算可能にした記法がポーランド記法です.
ポーランド記法では,数値や変数の後ろに演算子を記述します.算術演算とポーランド
記法との対応を,表 12-1 に示します.
表 12-1 で,2項演算子と単項演算子の「-」を区
表 12-1 ポーランド記法
別するために,後者を「~」としてあります.また,
算術演算
ポーランド記法
単項演算の例を入れるために,2乗の演算も入れて
x+y
xy+
x-y
xy-
x*y
xy*
x/y
xy/
x=y
xy=
x2
x^
-x
x~
有ります.
算術演算における優先順序を,表 12-2 に示しま
す.
上述の式,A=B+C*D をポーランド記法に変換す
ると,
ABCD*+=
となります.式の評価は,左から行い,演算子が現
れると,前の数値に対し演算を実行します.
12.2 ポーランド記法への変換
式の変換には,3つのスタックを用いて行います.
上述の式について,変換過程を図 12-1 に示します.
括弧も含めて変換の手順を以下に示します.
表 12-2 演算の優先順位
順位
演算子
①
算術式をスタックⅠに置きます.②へ.
0
=
②
スタックⅠからデータをポップします.
1
(,)
・ 変数または数値のときは,スタックⅢへ
2
+,-
3
~
4
*,/
5
^
プッシュします.②へ.
・ Ⅰのスタックが空のときは④へ.
・ それ以外のときは③へ.
③
スタックⅡをポップします.
・ Ⅱが空のときは,Ⅰの演算子をⅡにプッ
シュします.②へ.
・ Ⅰの演算子(左括弧を除く)が,Ⅱよりも優先順位が高いときは,Ⅱの演算子をそ
のままⅡにプッシュし,Ⅰの演算子もⅡにプッシュします.②へ.
・ Ⅰの演算子(左括弧を除く)が,Ⅱよりも優先順位が低いか等しいときは,Ⅱの演
算子をⅢにプッシュします.③へ.
54
・ Ⅰの演算子が左括弧のときは,Ⅱの演算子はそのままⅡにプッシュし,Ⅰの演算子
(左括弧)もⅡにプッシュします.②へ.
・ Ⅰの演算子が右括弧で,Ⅱの演算子が左括弧のときは,ともに消去します(すなわ
ち,何もしません).②へ.
④
算術式が空になったので,Ⅱのスタックをポップし,Ⅱの演算子をⅢにプッシュし
ます.Ⅱのスタックが空になるまで,④を繰り返します.
A
=
B
+
C
*
D
=
B
+
C
*
D
Ⅰ
Ⅱ
(1)
+
C
*
D
Ⅰ
数値,変数は
無条件でⅢに
移動
Ⅲ
Ⅰ
Ⅱ
(2)
比較
=
B
A
Ⅱ
Ⅲ
C
*
D
Ⅰ
(4)
Ⅰ
Ⅲ
Ⅰ
Ⅱにある演算
子よりも優先
順序が高いの
でⅡに移動
=
A
Ⅱ
(3)
Ⅲ
比較
+
=
B
A
*
D
+
=
C
B
A
Ⅱ
Ⅲ
Ⅰ
Ⅱ
Ⅲ
(5)
(6)
Ⅰのスタックが
空になったの
で,Ⅱの演算子
をⅢに移動
Ⅱにある演算
子よりも優先
順序が高いの
でⅡに移動
D
A
B
+
C
*
D
Ⅱに演算子が
ないので無条
件でⅡに移動
*
+
=
C
B
A
Ⅱ
Ⅲ
(7)
D
C
B
A
*
+
=
Ⅰ
Ⅱ
(8)
Ⅲ
Ⅰ
図 12-1 スタックを用いたポーランド変換
55
Ⅱ
(9)
=
+
*
D
C
B
A
Ⅲ
12.3 ポーランド変換のプログラム
ポーランド変換のプログラムを,リスト 12-1 に示します.関数 isOperator()は,演算子を
調べる関数です.関数 yusen()は,演算の優先順位を数値で返す関数です.
リスト 12-1
slot String in1,in2,in3;
slot Command move;
Boolean isOperator(String);
Number yusen(String);
Boolean isOperator(String s)
{
String operator;
Number i;
operator="=()+-~*¥/^";
for(i=0;i<9;i=i+1)
{
if(operator[i]==s[0]) return TRUE;
}
return FALSE;
}
action move()
{
String temp;
in1="pop";
if(isOperator(in1)==FALSE)
{
if(in1!="")
{
in3=in1;
in1="";
return;
}
else
{
in2="pop";
in3=in2;
}
}
else
{
in2="pop";
if(yusen(in1)>yusen(in2)
|| in1[0]=='(')
{
temp=in2;
in2="";
in2=temp;
in2=in1;
}
else if(in2[0]=='(' && in1[0]==')')
{
}
else
{
in3=in2;
temp=in1;
in1="";
in1=temp;
}
}
}
Number yusen(String s)
{
String operator,order;
Number i;
operator="=()+-~*¥/^";
order="011223445";
for(i=0;i<9;i=i+1)
{
if(operator[i]==s[0])
return atof(""+order[i]);
}
return -1;
}
56
パッドを,図 12-2 に示します.スタックⅠに式を代入し,<move>スロットに結合したボ
タンパッドを押すと順に変換が行われます.図は,その途中の様子を示しています.
スタックⅠ
スタックⅡ
<in2>
<in1>
<move>
結合先スロット名
スタックⅢ
<in3>
手続きパッド
図 12-2 ポーランド変換パッド
12.4 問題
①
11 章の 11.2 節のパッドと組み合わせて,ポーランド記法の式を逆に並べ替えてくだ
さい.
②
①のポーランド記法の式を評価するプログラムを作成してください.
57
13. レゴの制御
レゴブロックで作った装置をパッドでコントロールします.レゴとコンピュータの間に
は,図 13-1 に示す,レゴコントローラという装置があります.図では,レゴで組み立てた
信号機がつながれています.
このレゴコントローラと通信
をするパッドが,レゴコント
ロールパッドです.これらの装
置とパッドを組み合わせること
によって,コンピュータ制御の
いろいろな装置を作ることがで
きます.
はじめに,レゴコントローラ
パッドの説明をし,信号機やお
茶運びロボットについて解説し
ます.
図 13-1 レゴコントローラと信号機
13.1 レゴコントロールパッド
図 13-2 に,レゴコントロー
ルパッドを示します.この
パッドは,5 章で作成したふ
ハイタイマパッド
くろう時計と同様に,これに
貼付したハイタイマパッド
によって一定時間ごとに起
動されます.
レゴコントローラには,8
つの入力と 8 つの出力があり
図 13-2 レゴコントロールパッド
ます.レゴコントロールパッドでは,これらの値を Dictionary 型のスロット,<InputData>
と<OutputData>に保存しています.図 13-2 では,これらのスロットにテーブルパッドを結
合しています.テーブルパッドのデータを書き換えるとその結果が,レゴコントローラに
出力されます.
レゴコントロールパッドは,
① 「open」ボタンを押します.
② 「input」ボタンを順に押します.
③ ハイタイマパッドの「start」ボタンを押します.
の操作で,起動させることができます.
ハイタイマの時間設定は,制御対象に応じて 10 ミリ秒から数秒の間に設定します.ハイ
タイマが起動すると,<OurputData>スロットに設定した値が出力され,次にレゴコントロー
58
ラの入力状態を読みとります.読み込んだ値は,<InputDtata>に設定されます.
レゴコントローラの2つのスロットを,手続きパッドに結合するために,13-2 節の信号
機と 13-3 節のお茶運びのプログラムでは,レゴコントローラの<InputData>を主スロットに
しています.
手続きパッドにレゴコントロールパッドを貼付して,スロットを結合します.さらに,
レゴコントロールパッドに貼付してある出力データを表示しているテーブルパッドを結線
で,手続きパッドのスロットに結合します.この様子は,次節以下で示します.
13.2 レゴで作った信号機の制御
歩行者用の押しボタン信号機を作成します.レゴで作る信号機本体は,図 13-1 に示すよ
うに3つのランプと赤,黄,青の透明なブロックを組み合わせ,ケーブルでレゴコントロー
ラの「A」,「B」,「C」の出力端子に結合します.また,押しボタンスイッチのブロックを
「1」の入力端子に結合します.
制御の流れを状態遷移図で図 13-3 に示します.円の中に書いた名前は,状態名を表して
いて,この名前はそのままプログラムの中でも用いています.矢印の曲線は状態の遷移を
表しています.遷移の横の添えた数値(例 0,0/0,0,0)は入力/出力を表しています.はじ
めの2つはそれぞれ,押しボタンの入力値とプログラム内のカウンタの値を表しています.
押しボタンの入力値は簡単のため,ボタンが押されたときを 1 に,そうでないときを 0 に
しています.実際にコントローラから入力される値は,この 1 と 0 に 10,000 前後の値と
60,000 前後の値が対応しています.カウンタ値は,レゴコントロールパッドのタイマとは
別のタイマを用意し,1 秒に 1 ずつ増えるカウンタパッドを作ってその値を読み込んでい
x,<3 /0,0,8
0,0/0,0,0
1,x /0,0,8
x,3 /0,8,0
blue
yellow1
0,1 /0,8,0
x,<3/0,8,0
yellow
0,1 /0,0,0
1,x /0,0,8
yellow2
x,3/8,0,0
red
x,<10/8,0,0
0,0/0,8,0
x,10/0,0,0
図 13-3 信号機の状態遷移図
59
ます.
図中「x」とあるのは,その値に関わらず遷移することを意味しています.
後ろの3つはそれぞれ,赤,黄,青のランプに出力する値を表しています.0 が消灯を,
8 が点灯を表しています.
図 13-3 の状態遷移図による制御では,黄色信号が1秒ごとに点滅していて,押しボタン
を押すと,青が3秒,黄が3秒,赤が10秒と順に点灯し,再び黄の点滅に戻るというも
のです.
パッドとパッドの貼り合わせを図 13-4 と図 13-5 に示します.
プログラムを,リスト 13-1 に示します.
図 13-4 信号機の制御
カウンタパッド
ハイタイマパッド
テーブルパッド
<countUp>
結合先スロット名
テーブルパッド
レゴコントロールパッド
結線
<InputData>
<OutputData>
<out>
結合先スロット名
<count> <input> <output>
図 13-5 パッドの貼り合わせとスロット結合
60
手続きパッド
リスト 13-1
if(count <1) return;
else{
state="yellow2";
outData(0,8,0);
count=0;}
slot Dictionary input, output;
slot Number count;
slot String state;
Void yellow1(Number);
Void yellow2(Number);
Void blue();
Void yellow();
Void red();
Void outData(Number,Number,Number);
action input()
{
Dictionary el;
Number in1;
el=getDictionary(input,"input");
in1=getNumber(el,"in1");
if(state=="yellow1") yellow1(in1);
if(state=="yellow2") yellow2(in1);
if(state=="blue") blue();
if(state=="yellow") yellow();
if(state=="red") red();
}
Void outData(Number r,Number y,Number
b)
{
Dictionary el;
clear(el);
put(el,"out1",r);
put(el,"out2",y);
put(el,"out3",b);
put(el,"out4",0);
put(el,"out5",0);
put(el,"out6",0);
put(el,"out7",0);
put(el,"out8",0);
clear(output);
put(output,"output",el);
}
Void yellow1(Number in1)
{
if(in1 < 20000){
state="blue";
outData(0,0,8);
count=0;
return;
}
}
Void yellow2(Number in1)
{
if(in1 < 20000){
state="blue";
outData(0,0,8);
count=0;
return;}
if(count <1) return;
else{
state="yellow1";
outData(0,0,0);
count=0;}
}
Void blue()
{
if(count <3) return;
else{
state="yellow";
outData(0,8,0);
count=0;}
}
Void yellow()
{
if(count <3) return;
else{
state="red";
outData(8,0,0);
count=0;}
}
Void red()
{
if(count <10) return;
else{
state="yellow1";
outData(0,8,0);
count=0;}
}
61
13.3 問題
① 黄色点滅の時間間隔を長くするようにプログラムの変更してください.
② 赤ランプも点滅させるような状態遷移図を書き,プログラムを作成してください.
62
14. お茶運びロボット
14.1 江戸時代にあったロボット
現在では,ロボットといえばコンピュータで制御された複雑な機械のことを指していま
すが,ずーっと昔の江戸時代にもロボットがありました.この頃は,ロボットと呼ばずに
からくり人形と呼んでいます.
からくり人形の制御は,コンピュータのような電子回路に書かれたプログラムではなく,
歯車やカムと呼ばれる機械部品に刻まれたプログラムによって行っています.お茶運びロ
ボットもその一つです.
お茶運びロボットは,ロボットにお茶の入った茶わんを載せると,お客のところまで運
び,お客がお茶を飲み再びロボットに茶わんを載せると,もとの位置まで戻ってきます.
ここでは,このお茶運びロボットを製作します.
インターネットで検索したお茶運びロボットの写真を図 14-1 に示します.
図 14-1 http://www.suelab.nuem.nagoya-u.ac.jp/~suematsu/zasiki/zasiki.html
63
14.2 ロボットの設計
ロボットには,動き回るための車輪と,茶わん搭載感知のセンサーが必要になります.
車輪を2つにして,それぞれをモータによって駆動するのが簡単です.また,茶わんのセ
ンサーには押しボタンスイッチを使います.
ロボットの足周りの例を図 14-2 に示します.このように,中央に車輪を配置するとロ
ボットをスムーズにコントロールすることができます.
図 14-2 ロボットの足回りの例
センサーは,茶わんを載せることができるように配置する必要があります.
押しボタンスイッチを,図 14-3 に示します.これを上手に使って茶わんが載ったのを検
知します.後に示すロボットでは,スイッチを横に置き,縦方向の力が横に伝わるように,
レゴを組み立てています.
これらの図と,部品を考えてロボットを設計してください.
スイッチ
図 14-3 スイッチを利用した茶わんセンサー
64
14.3 プログラムの作成
ロボットをコントロールするプログラムは,ロボットのはじめの位置から,センサーが
検知するとどんなふうに動くか想像しながら決めます.図 14-4 にその例を示します.また,
お茶運びロボットの製作例を図 14-5 に示します.
x,<10 /5,-5
0,x/0,0
1,x/5,-5
x,<30 /5,5
x,>10 /5,5
TurnL
Start1
1,x /0,0
x,>=30 /0,0
Forward1
Stop1
0,x /0,0
0,x/0,0
Start2
Stop2
x,>=30 /0,0
TurnR
Forward2
1,x /-5,5
x,>10 /5,5
1,x/0,0
0,x /0,0
x,<10 /-5,5
x,<30 /5,5
in1, count/out1,out2
次の状態に移るときは
カウンタをクリアします.
x についてはプログラムで
無視してもよいです.
図 14-4 お茶運びロボット制御のための状態遷移図
図 14-5 お茶運びロボット
65
14.4 お茶運びロボットの製作例
14.5 問題
① からくり人形における動作は,予めプログラムされているわけですが,プログラムを
どこにどのように記憶しているのでしょうか.
② 図 14-4 の状態遷移図で示したプログラムにおいて,<start>と<stop>の状態が2つずつ
用意されているのはなぜでしょうか.
③ 製作したロボットが元の位置に正確に戻るようにするためには,プログラムの中のど
のパラメータを調整すればよいでしょうか,またロボットのどの部分をどのように変
更すればよいでしょうか.
66
付
録
67
A. 文法
付録 A では,インタプリタの文法を以下の内容で説明します.
A.1 使用可能な文字
A.2 文の構成要素
A.3 式と演算子
A.4 型指定子
A.1
使用可能な文字
手続き言語は以下の文字を使用して記述します.
英字
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
_
数字
0123456789
特殊文字
!"%&'()*+-/|;<=>\{}[]
日本語(2 バイト文字)
あ
い
う
え
お
…
ア
イ
ウ
エ
オ
…
A
B
C
D
E
…
1
2
3
4
5
…
亜
位
鵜
絵
尾
…
A.2
文の構成要素
文
手続きの処理を1行単位で記述したものを文といいます.文は次の形式で記述します.
;
;(セミコロン)は文の終わりを表すために記述します.
68
構成要素
手続きの文を構成する要素には,次のものがあります.
コメント
コメントは,手続きの文に対して,なんの処理を行っているかを利用者が注釈を記述す
るものです.
「/*」で始まり,「*/」で終わります.
コメントは,処理の対象にはなりません.
slot String KENMEI;
/* 各県の県名を入力するスロット */
slot String JINKOU;
/*
入力された県の人口を設定するス
ロット
*/
:
/*
県名が入力されたときの
処理
*/
action KENMEI() {
:
}
なお,コメントの中にコメントを記述することはできません.
/* コメント
/* コメント
*/
*/
識別子
識別子とは,変数名,関数名,型名,定数などの名称や値をいいます.
識別子は,先頭が英字で始まる 64 文字以内の英数字列(1 バイト文字)または 32 文字
以内の日本語文字列(2 バイト文字)で指定します.
「_」(アンダスコア)は英字に含みます.また,大文字と小文字は区別されます.
識別子には,英数文字と日本語文字の混在はできません.
TOKYO , tokyo , IP123 , OOSAKA _URIAGE ,
東京
69
なお,以下の文字列は IP システムが内部で使用する定義済の識別子(予約語)ですので,
利用者は識別子として使用できません.
action
Boolean
break
Char
continue
Command
else
Dictionary
for
Number
if
slot
return
String
while
組み込み関数名
→
B.7 組み込み関数
組み込み定数名
→
B.8 組み込み定数
定数
定数とは,手続きの中で使用するデータのうち,数値や文字のように値が変化しないも
のをいいます.
定数には次のものがあります.
整数定数
整数定数は,10 進数の整数を表します.
123, 0, 987654, -9
浮動小数点定数
浮動小数点定数は,整数部分,小数点,小数部分からなり,10 進数の定数を表します.
110.98, 1.23,
-87.7
文字定数
文字定数は,「'A'」のように,「'」(シングルクォート)で囲まれた 1 個の文字です.
'T', 'a', '5'
なお,キャリッジリターンや改行などの特殊文字を表す場合は,エスケープシーケンス
というものを使用します.これは,¥記号に 1 文字を付加して記述します.エスケープシー
ケンスには,次に表すものがあります.
70
¥b
:バックスペース
¥f
:フォームフィード
¥n
:改行
¥r
:キャリッジリターン
¥t
:タブ
¥¥
:バックスラッシュ
¥'
:シングルクォート
¥"
:ダブルクォート
¥0
:NULL 文字
文字列リテラル(文字列定数)
文字列リテラルは,
「"TOKYO"」のように,
「"」
(ダブルクォート)で囲まれた文字列で
す.文字定数と異なり,文字列の最後に NULL 文字が付加されています.そのため,実際
の文字数より 1 文字多くなります.
たとえば,「"JAPAN"」はNのあとに¥0 がついています.
1 文字目
:J
2 文字目
:A
3 文字目
:P
4 文字目
:A
5 文字目
:N
6 文字目
:¥0
文字列リテラルは 511 文字以下の文字列で記述します.
"OOSAKA", "Pad123", "56789"
長いリテラルを複数行にまたがって記述する場合,以下のように行単位に分割したもの
を,文字列加算(+)で結合します.
(1 行目)
(2 行目)
・・・・・"ABC"
+"DEF";
1 行目と 2 行目の文字列リテラルは結合され,「"ABCDEF";」と同じです.
なお,文字列リテラル中に特殊コードを記述する場合は,文字定数で使用できるエスケー
プシーケンスが利用できます.
演算子
71
演算子は,+,-のようにデータに対して特定の処理を実行させる記号をいいます.
手続き機能内で使うことのできる演算子には以下のものがあります.
- 算術演算子(+, -, *, /, %)
- 関係演算子(<, >, <=, >=, !=, ==)
- 論理演算子(!, &&, ||)
- 代入演算子(=)
区切り記号
区切り記号は,定数,演算子およびコメントを除いた構成要素です.
以下に例を示します.
{ } ( ) , ; など
72
A.3
式と演算子
ここでは,手続きの式と演算子について説明します.
式
変数や定数を各演算子で結合したものを式といいます.
A= B + C
A>=B
A= 3 + B*C
演算子の種類
演算子には以下のものがあります.
種
類
演算子
機
能
代入演算子
=
右辺の値を左辺に代入する
算術演算子
+
加算を行う
-
減算を行う
*
乗算を行う
/
除算を行う
%
余りを計算する
<
ある値より小さいか調べる
>
ある値より大きいか調べる
関係演算子
論理演算子
<=
ある値以下か調べる
>=
ある値以上か調べる
!=
ある値と等しくないか調べる
==
ある値と等しいか調べる
!
結果が偽か調べる
&&
論理積をとる
||
論理和をとる
その他の演算子は使用できません.
代入演算子
右辺と左辺の型が対応していれば,右辺の値を左辺に代入します.
左辺がスロットの変数の場合,そのスロットに結合されているほかのパッドに更新伝播が
行われます.
73
Slot Number num;
Number i,j,k;
:
i = 1;
j = k = i;
num = i;
算術演算子
算術演算子は 2 つの演算項に対して,四則演算および余りの計算を行います.
演算子の右辺,左辺共に数値でなければいけません.
このとき数値は,整数定数か,文字型,数値型の変数でなければなりません.
a = 12 % 5;
→
a = 2;
a = 12.3 % 5.5; →
a = 2;
演算では整数値を算術変換して,小数点付きの数値として扱います.そのため,整数値
の計算結果は小数点付きの数値となります.
ただし,%演算子では,型を整数に変換して計算します.
A=5+2 →
A には 7.0 が代入されます
3*4.2
→
結果は 12.6 となります
8+5
→
結果は 13.0 となります
5%2
→
結果は 1 になります
関係演算子
関係演算子は 2 つの演算項の大小比較を行います.
演算子の右辺の式,左辺の式ともに同じ型でなければなりません.
比較できるのは,数値型,文字型,論理値,ユーザ定義型です.論理値およびユーザ定
義型は,“!=”
,“==”のみ使用できます.
指定した関係が真ならば TRUE,偽なら FALSE になります.
演算では算術変換が起きます.
Number i,j;
:
i = 3;
j = 5;
:
if (i < j )
→
結果は TRUE となります
if (i > j )
→
結果は FALSE となります
74
論理演算子
論理演算子は 2 つの演算項の論理和,論理積および真偽値の判定を行います.
右辺の式,左辺の式ともに数値型または論理値型でなければなりません.
指定した関係が真ならば TRUE,偽ならば FALSE になります.
演算では算術変換が起きます.
なお,関係演算子または論理演算子を含んだ式を条件式といいます.
Number i,j;
:
i = 3;
j = 5;
:
if (i<6 && j>4)
→
結果は TRUE となります
if (i>5 || j<4)
→
結果は FALSE となります
演算子の優先順位と結合規則
手続きが演算を行う順序を優先順位といいます.また,同じ優先順位をもつ,いくつか
の演算子で変数あるいは式が結合されたとき,いくつかの演算子の優先順位を定める規則
を結合規則といいます.左に記述された演算子から処理を行う場合と右に記述された演算
子から処理を行う場合があります.
演算子の優先順位と結合規則を以下に示します.
優先順位
種類
演算子
高
括弧,関数,配列 (
)
↑
単項式
!
-
│
乗除,余り
*
/
│
加減
+
-
│
比較
<
結合規則
[
] 左から右
→
右から左
←
左から右
→
左から右
→
<=
> 左から右
→
!=
左から右
→
%
>=
│
等値
==
│
論理
AND
&&
左から右
→
↓
論理
OR
||
左から右
→
低
代入
=
右から左
←
75
例
1 :上記の表から括弧()が優先順位が一番高いため,(D-E)の計算を行います.
2 :括弧()の次に優先順位が高い乗算*の計算を行います.
3 :残っている演算は,
「B+」と「-F」ですが,結合規則により右にある,加
算の計算を行います.
4 :減算計算を行います.
5 :代入の計算を行います.
A.4
型指定子
手続き機能では,識別子を使用する型を宣言する必要があります.
識別子の型を宣言する型指定子には,次のものがあります.
スロット宣言 関数の型
関数の引数の型
変数
Boolean
○
○
○
○
Char
×
○
○
○
Command
○
×
×
×
Dictionary
○
×
○
○
Number
○
○
○
○
String
○
○
○
○
Void
×
○
×
×
ユーザ定義型
○
×
○
○
○:利用できる
×:利用できない
76
Boolean
型指定子 Boolean は,論理値(真/偽)を扱う処理に使用します.
Boolean 型の変数は,C 言語の char 型と同じです.
TRUE が 1 で,FALSE が 0 です.条件式の結果などに使われます.
Boolean a;
Number
b;
a = ( b == 3 ) ;
if ( a ) ....
Char
型指定子 Char は,1 文字の文字定数を扱う処理に使用します.
Char 型の変数は,C 言語の char 型と同じです.
slot 変数には指定できません.
Char a;
String b;
a = b[2];
Command
型指定子 Command は,スロット変数のみに使われる型です.
Command 型変数には,値はなくスロットアクションのみ指定することができます.
slot Command a;
action a(){ ..... }
Dictionary
型指定子 Dictionary は,ディクショナリ形式のリストを扱う処理に使用します.
Dictionary 型の変数は,以下のような指定で,複写,代入操作が可能です.
Dictionary a;
Dictionary b;
b = a;
/* a の値を b に代入(複写) */
77
Number
型指定子 Number は,数値データを扱う処理に使用します.
Number 型の変数は,C 言語の double と同じです.
Number a;
a = 10;
String
型指定子 String は,文字列を扱う処理に使用します.
String a;
a = "TOKYO";
String 型変数は,以下のような文字列操作も可能です.
=(イコール記号)による文字列の複写
X="ABC";
+(プラス記号)による文字列の加算
X="ABC";
Y="DEF";
Z=X + Y;
X=X + "G";
………
………
結果は"ABCDEF"となる
結果は"ABCG"となる
==,!=(等値演算子)による文字列の比較
IF( X=="ABC" )
………
;
>,>=,<=,<(比較演算子)による文字列の比較
IF( X>="DEF" )
………
;
文字列の大小関係は,文字コード順の辞書式の順序に従います.
なお,部分文字を参照することができます.その結果は Char 型になります.
部分文字の参照は[]を使用して行います.指定形式を以下に示します.
文字列変数[式]
文 字 列 変 :文字型の変数を指定する.
78
数
式
:整数定数または数値型の識別子を指定する.式の値は
整数に変換される.
String array;
Number I;
array = "ABCDEFGHI";
I = 3.14;
array[I];
→
array[3]となり,4 番目の文字"D"が取
り出される
array[3.14];
→
〃
Void
型指定子 Void は,関数の型指定のときのみ使用できます.
関数の型の Void とは,関数に復帰値がないことを表します.
ユーザ定義型
ユーザ定義型は,IP にあらかじめ用意されている型に加えて,ユーザが拡張することが
できる型です.関数の型には使用できません.
79
B. インタプリタ手続き文の構造
付録Bでは,プログラムの構成を以下の内容で説明します.
B.1 インタプリタの構成
B.2 スロット宣言
B.3 変数の宣言
B.4 関数の宣言
B.5 関数の定義
B.6 スロットアクションの定義
B.7 スロットアクションの動作
B.8 組み込み定数
B.1
インタプリタの構成
インタプリタの構成
インタプリタ手続き文を構成する要素には,以下のものがあります.
- スロット宣言部
- グローバル変数定義部
- グローバル変数初期化部
- 関数宣言部
- スロットアクション定義部
- 関数定義部
- ローカル変数宣言部
スロット宣言
スロットの型と名前を宣言します.
グローバル変数定義
関数の外で宣言する変数で,宣言された位置よりもうしろで,有効な広域的な変数にな
ります.グローバル変数はコンパイル時に領域が獲得されます.
グローバル変数初期化
グローバル変数宣言のあとで,変数に初期値を与えることができます.
関数宣言
関数の定義を行う前に,使用する関数をあらかじめ宣言します.関数宣言した関数は,
これ以降,ほかの関数の中で利用可能となります.
スロットアクション定義
スロットの値に変更があった場合の処理を記述します.
80
関数定義
使用する関数の処理を記述します.あらかじめ関数宣言を行っていない場合,関数定義
を行った関数は,これ以降,ほかの関数の中で利用可能となります.
ローカル変数宣言
関数の中で宣言された変数は,その関数内で有効な局所的な変数になります.ローカル
変数はその関数が呼ばれた時点で領域が確保され,その関数を抜けるときに解放されます.
ローカル変数宣言は,スロットアクション定義部および関数定義部の中で宣言します.
インタプリタ手続き文の構成と宣言の有効範囲
インタプリタ手続き文の基本的な構成および各宣言の有効範囲を以下に示します.
81
プログラム構造
一般的にインタプリタ手続き文は,下図の右側に示すプログラム構造になります.
/* 指定した文字列を検索するパッドを作成する */
slot String InputText;
/* 検索対象スロット
slot String OutputText;
/* 検索結果スロット
slot String SearchString;
/* 検索文字列スロット
*/
*/
*/
スロットの
宣言
String OutputBuff;
/* 検索結果バッファ
*/
広域的な変数
の宣言
OutputBuff = "";
/* 検索結果バッファの初期化*/
広域的な変数
の初期化
Void SearchLine(String);
/* 1行検索を行う関数の宣言*/
関数の宣言
action SearchString()
{
Number I;
Number I1;
String s;
/* 検索文字列が入力された場*/
/* 合のスロットアクション */
スロットアク
ションの定義
局所的な
変数宣言
if(SearchString=="")
return;
}
OutputText = "";
OutputBuff = "";
if(InputText=="")
return;
}
s="";
I1=strlen(InputText);
for(I = 0 ;I<I1 ; I=I+1 )
if(InputText[I]=='¥n')
s=s+'¥n';
SearchLine(s);
s="";
continue;
}
s=s+InputText[I];
}
SearchLine(s);
OutputText = OutputBuff;
}
/* 検索文字列が空であった場*/
/* 合なにもしないで終了する*/
/*
/*
/*
/*
検索結果スロットを初期化*/
検索結果バッファを初期化*/
検索対象スロットが空の */
場合,終了する
*/
/* 検索対象行バッファの初期化*/
/* 文字列操作関数を使用し */
/* 文字列の長さを得る
*/
/* 1行の終了
*/
/* 1行ずつ検索を行う
*/
/* 検索結果をスロットに
/* 反映する
*/
*/
82
スロット
アクション
の記述
/* 1行ずつ検索を行う
Void SearchLine(String Line)
Number I, k;
Number j1, s1;
s1 = strlen(SearchString);
j1 = strlen(Line);
if(j1 == 0) return;
for(I = 0 ;I<j1;I=I +1)
if(Line[I] == SearchString[0]) /* 1行ずつ比較する
for(k = 0;k<s1 ;k=k+1)
/* 違う文字が現れるまで
/* 検索する
if(Line[I + k] !=SearchString[k])
break;
}
if(k == s1)
/* 完全に一致した場合
/* 検索結果バッファに追加
OutputBuff=OutputBuff + Line;
break;
}
}
}
}
B.2
スロット宣言
手続きでスロットを新しく,追加する場合に宣言します.
スロット宣言は次の形式で指定します.
slot
型 スロット名;
スロットが複数個ある場合は,複数個記述します.
また,型には IP の次の型を指定します.
型
内容
Number
数値型
String
文字型
Dictionary
ディクショナリ型
Boolean
論理値型
Command
コマンド型
ユーザ定義型 ユーザ定義型
83
*/
*/
*/
*/
*/
*/
関数の定義
局所的な
変数宣言
関数処理の
記述
スロット名は,先頭が英字で始まる 64 文字以内の英数字列(1 バイト文字)または 32
文字以内の日本語文字列(2 バイト文字)で指定します.
大文字と小文字は区別されます.
slot String TIMEI;
slot String 西暦;
slot Number JINKOU;
slot Boolean CHANGE;
:
B.3
変数の宣言
変数の宣言の形式
手続き機能で使用する変数の宣言は次の形式で指定します.
変数の型
変数名1,変数名2,…
変数の型
:
変数名n;
:
:
:
:
:
:
指定できる変数の型は Command 型,Void 型を除く型が指定できます.
なお,変数宣言のときに,同時に変数の初期化をすることはできません.
Number a;
String x,y,z;
Number
→
エラー
b=123;
変数の有効範囲
変数は宣言される位置によって 2 種類あり,それぞれ変数の有効範囲が異なります.
ローカル変数
:スロットアクションおよび関数の中で宣言さ
れ,そのスロットアクションおよび関数の中
でのみ有効な局所的な変数
グローバル変数
:スロットアクションおよび関数の外で宣言さ
れ,宣言された位置よりもうしろで有効であ
る広域的な変数
84
変数の初期化
スロット宣言およびグローバル変数の宣言のあとで,下図に示すように,この変数に初
期値を与えることができます.この初期化処理は,program スロットに更新が起きたとき(一
般には,貼り合わせているテキストパッドでインタプリタ手続き文を更新したとき)に実
行されます.以下に,初期化処理の例を示します.
なお,変数の初期化処理について記述できるのは,代入文のみであり,その右辺には,
定数の単項式のみ記述できます.
B.4
関数の宣言
関数の定義を行う前にその関数を使用するとき,この宣言を行います.
関数の宣言をした関数は,それ以降使用可能となります.
なお,1 つの関数について宣言は 1 回だけです.
関数の宣言は次の形式で指定します.
85
関数の型
関数名(引数の型
関数の型
[引数名],....);
:関数の戻り値の型を指定します.Dictionary 型,Command 型,
ユーザ定義型を除く型が指定できます.本パラメータは省略
できません.
関数名
:関数の名前を指定します.本パラメータは省略できません.
引数の型
:引数の型を指定します.Void 型,Command 型を除く型が指定
できます.本パラメータは省略できません.
引数名
:引数の名前を指定します.本パラメータは省略可能です.
例
英語,国語,数学のテストの平均値と合計値を算出して,戻り値に設定する関数を宣言
します.
Number AVERAGE( Number eigo, Number suugaku, Number kokugo );
Number SUM( Number eigo, Number suugaku, Number kokugo );
注意
関数宣言と関数定義の順番について
関数を定義したあとで,その関数の宣言は行えません.
組み込み関数について
組み込み関数の宣言はできません.
B.5
関数の定義
使用する関数の実際の処理を記述することを関数の定義といいます.
この定義以降,この関数の使用が可能となります.
この定義より前にこの関数を使用する場合は,関数宣言を行います.
関数の宣言は次の形式で指定します.
関数の型
関数名(引数の型
引数名,...
.)
{
ローカル変数の宣言
処理
}
86
関数の型
:関数の戻り値の型を指定します.Dictionary 型,
Command 型,ユーザ定義型を除く型が指定でき
ます.本パラメータは省略できません.
関数名
:関数の名前を指定します.本パラメータは省略
できません.
引数の型
:引数の型を指定します.Void 型,Comannd 型を
除く型が指定できます.本パラメータは省略で
きません.
引数名
:引数の名前を指定します.本パラメータは省略
できません.
関数宣言の時に引数の名前を指定している場
合,その名前は関数定義と同じである必要はあ
りません.
ローカル変数の宣言
:この関数内で使用する変数を宣言します.
処理
:実際の処理を記述します.
関数宣言と関数定義は,関数の型,引数の個数および引数の型がすべて対応していなけ
ればなりません.
注意
- 関数で使用する変数について
ローカル変数,グローバル変数および引数で同じ名前が存在した場合,引数,ロー
カル変数,グローバル変数の順序で優先順位があります.
関数宣言について
:関数宣言は関数の定義内ではできません.
引数について
:基本的に引数はローカル変数と同じ扱いで
すが,Dictionary 型とユーザ定義型の引数
の場合に限り,ポインタで渡されます.本
体が変更されてしまうことがありますの
で注意してください.
B.6
スロットアクションの定義
スロットアクションは,スロットアクション関数として,次のように指定します.
スロットアクション関数は,Void 型で引数のない関数です.
87
action スロット名()
{
スロットアクションが発生した時の処理
return;
}
注意
スロットアクション定義について:スロットアクション定義の前にスロット宣言文に
よってスロットが宣言されていなければなりません.
slot Number A;
:
action A(){ .... }
action B(){ .... }
エラー
1 つのスロットに対して,複数のスロットアクションを定義することはできません.
slot Number A;
slot Number B;
:
action A(){ ..... }
action B(){ ..... }
action A(){ ..... }
エラー
action A(){ ..... }
エラー
引数宣言部について:引数宣言部(
action A(Number A) { .... }
action A(Void)
{ .... }
action A(A)Number A;{ .... }
()内 )に記述することはできません.
エラー
エラー
エラー
復帰値について:void 型の関数と同じ扱いであるため,return 文に復帰値をつけてはなり
ません.
88
action A()
{
B = A + C;
C = A * 2;
return (C);
エラー
}
B.7
スロットアクションの動作
スロットアクションとは,スロット宣言したスロットに対して,以下の理由によりスロッ
ト値に変更があった場合に動作する処理をいいます.
- 利用者からの値の入力
- 他パッドからのデータ連携(スロット結合しているパッド間のデータの受渡
し)
手続きパッド内で宣言されたスロットに対して,同じ手続きパッド内でスロット値を変
更してもスロットアクションは動作しません.
スロットアクションの動作の流れを以下に示します.
89
B.8
組み込み定数
手続き機能で用意している組み込み定数には,以下のものがあります.
これらの定数名を関数名や変数名に利用することはできません.
定数名
値(使用する関数名)
(Number) PI
3.14159265358979323846
(Number) E
2.71828182845904523536
(Boolean) TRUE
True
(Boolean) FALSE
False
(Number) _O_RDONLY
組み込み関数のうち,open 関数でファイルをオープ
ンするときのモードを指定するときに使用する
(Number) _O_WRONLY
同上
(Number) _O_RDWR
同上
(Number) _T_NUMBER
組み込み関数のうち,getType 関数でディクショナリ
中の値の型を取り出すときに使用する
(Number) _T_STRING
同上
(Number) _T_BOOLEAN
同上
(Number) _T_DICTIONARY
同上
(Number) _T_OBJECT
同上(ユーザ定義型)
90
C. 制御文
インタプリタ言語では,次のような制御文を用意しています.
この制御文を用いて,動作の実行順序を記述します.
- 条件文(if 文,else 文)
- while 文
- for 文
- break 文
- continue 文
- return 文
条件文
条件文は,条件により,文の実行を制御します.
条件文の形式は次の 2 つの形式のいずれかで記述します.
- 条件式が成立した場合のみ実行する場合
if (条件式)
真の場合に実行する文
次の処理
条件式が真ならば,条件式の横に記述された文を実行します.偽の場合は,if 文の下の
文から実行します.
例
年齢が 20 才以上の人数をカウントする.
if ( age >= 20 )
select= select +1;
なお,実行する文が複数ある場合は{ }で囲んで指定します.
- 条件式が成立した場合と成立しない場合で,処理が分かれる場合
if (条件式)
真の場合に実行する文
else
偽の場合に実行する文
次の処理
91
条件式が真ならば,条件式の横に記述された文を実行します.偽の場合は,else 文の次
にくる文を実行します.
if( month ==12 )
else
month = 1;
month = month + 1;
while 文
while 文は,文を繰り返し実行します.
while
(条件式)
{
繰り返し実行する文
}
条件式が成立してる間,条件式の横の{}に囲まれた処理を繰り返し実行します.条件式
が偽になった時点で処理を中止し,次の処理を行います.
例)
2 の 10 乗を計算する.
Number
i,j;
:
i=1;
j=2;
while(i<11)
{
j
= j * 2;
i
= i +1 ;
}
for 文
for 文は,文を繰り返し実行します.
for
(式 1; 条件式; 式 2)
{
繰り返し実行する文
}
92
式1
:繰り返し回数の初期値を式で指定します.本パラメータは省略で
きません.
条件式
:繰り返し実行するための条件を式で指定します.本パラメータは
省略できません.
式2
:繰り返し回数を更新する式を指定します.本パラメータは省略で
きません.
式 1 をまず実行して,条件式が成立しているならば,( )の次にある文を実行し,式 2 を
実行します.再び,条件式が成立の判定を行い,成立しているならば,( )の次にある文の
実行,式 2 を実行という処理を繰り返します.条件式が成立しなくなった時点で処理を中
止し,次の処理を行います.なお,繰り返し実行する文が 1 つの場合,{}は省略できます.
1 から 10 までの合計値を算出する.
例)
Number
i,j;
:
j=0;
for(i=1;i<11;i=i+1)
{
j=j+i ;
}
注意
それぞれの式 1,式 2 には,一式だけの記述です.次のような複数の式の記述はできま
せん.
for(i=0,j=0;i<100&&j<100;i=i+1,j=j+1)
break 文
break 文は,それを囲んでいるもっとも内側の while 文または for 文の実行を終了させ,
その while 文または for 文の次の文の実行を行います.
for
(式 1; 条件式; 式 2)
{
繰り返し実行する処理
:
break;
:
}
次に実行する処理
93
continue 文
continue 文は,それを囲んでいるもっとも内側の while 文または for 文の文の終わりに制
御を移します.
for
(式 1; 条件式; 式 2)
{
繰り返し実行する処理
:
continue;
:
}
return 文
関数を呼び出した元へ制御を移します.
return 文の 2 つの形式のいずれかで記述します.
- 関数の型が Void 型の場合
Void FUNC1(Number A, Number B )
{
:
return;
}
関数を呼び出した元へ制御を移します.return 文は省略可能です.
関数の型が Void 型のとき,return 文に式を記述すると実行時エラーになります.
- 関数の型が Void 型以外の場合
Number FUNC2(Number A, Number B )
{
:
return 式;
}
return 文に記述されている式の結果が,この関数の型に変換され,関数の呼び出し元に関
数の結果として返されます.return 文は省略できません.
関数の型が Void 型以外のとき,return 文に式を記述していないと実行時エラーになりま
す.
94
例
引数の平均を関数の結果として返します.
Number FUNC(Number A, Number B )
{
return (A+B)/2;
}
95
D. 組み込み関数
インタプリタ手続き文の中に関数を定義しなくても利用できる関数を組み込み関数と呼
びます.組み込み関数には以下の 2 種類があります.
システム提供関数
:あらかじめ IP が提供している関数
ユーザ定義関数
:利用者が必要に応じ,システムに組み込んだ関数
ここでは,システム提供関数のみを説明しています.システム提供関数を以下の内容で
説明します.
D.1
D.2
D.3
D.4
D.5
D.6
D.7
D.1
数値操作関数
文字列操作関数
ファイル操作関数
ディクショナリ操作関数
スロットアクション操作関数
出力制御操作関数
テーブル操作関数
数値操作関数
数値の演算を行う関数です.数値操作関数には以下のものがあります.
96
関数仕様
sin(正弦)
【構文】 Number sin(Number radian)
【機能】 正弦関数計算を行います.
【復帰値】 Number 型
【引数】 radian :ラジアン値を指定します
cos(余弦)
【構文】 Number cos(Number radian)
【機能】 余弦関数計算を行います.
【復帰値】 Number 型
【引数】 radian :ラジアン値を指定します
tan(正接)
【構文】
【機能】
【復帰値】
【引数】
Number tan(Number radian)
正接関数計算を行います.
Number 型
radian :ラジアン値を指定します
log(自然対数)
【構文】 Number log(Number value)
【機能】 自然対数計算を行います
【復帰値】 Number 型
【引数】 value :正数値を指定します
log10(常用対数)
【構文】 Number log10(Number value)
【機能】 常用対数計算を行います.
【復帰値】 Number 型
【引数】 value :正数値を指定します
exp(e のべき乗)
【構文】 Number exp(Number value)
【機能】 e のべき乗計算を行います.
【復帰値】 Number 型
【引数】 value :数値を指定します
97
sqrt(平方根)
【構文】 Number sqrt(Number value)
【機能】 平方根計算を行います.
【復帰値】 Number 型
【引数】 value :正数値を指定します
abs(絶対値)
【構文】 Number abs(Number value)
【機能】 絶対値計算を行います.
【復帰値】 Number 型
【引数】 value :数値を指定します
pow(べき乗)
【構文】 Number pow(Number value1, Number value2)
【機能】 べき乗の計算を行います.
【復帰値】 Number 型
【引数】 value1 :べき乗される値を指定します
value2 :べき乗値を指定します
ユーザ定義により拡張した関数
cosh(双曲線余弦関数)
【構文】 Number cosh(Number value)
【機能】 双曲線余弦計算を行います.
【復帰値】 Number 型
【引数】 value
:数値を指定します.
shinh(双曲線正弦関数)
【構文】 Number sinh(Number value)
【機能】 双曲線正弦計算を行います.
【復帰値】 Number 型
【引数】 value
:数値を指定します.
tanh(双曲線正接関数)
【構文】 Number tanh(Number value)
【機能】 双曲線正接計算を行います.
【復帰値】 Number 型
【引数】 value
:数値を指定します.
98
ceil(整数繰上げ値)
【構文】 Number ceil(Number value)
【機能】 整数繰上げ値を返します.
【復帰値】 Number 型
【引数】 value
:数値を指定します.
floor(繰り下げ値)
【構文】 Number floor (Number value)
【機能】 繰り下げ値を返します.
【復帰値】 Number 型
【引数】 value
:数値を指定します.
fmod(剰余)
【構文】 Number fmod(Number value1, Number value2)
【機能】 value1 を value2 で割ったときの剰余を返します.
【復帰値】 Number 型
【引数】 value1
:割られる値を指定します
value2
:割る値を指定します
acos(逆余弦)
【構文】 Number acos(Number value)
【機能】 逆余弦の計算を行います.
【復帰値】 Number 型,radian で返す.
【引数】 value
:数値を指定します.
asin(逆正弦)
【構文】 Number asin(Number value)
【機能】 逆正弦の計算を行います.
【復帰値】 Number 型,radian で返す.
【引数】 value
:数値を指定します.
atan(逆正接)
【構文】 Number atan(Number value)
【機能】 逆正接の計算を行います.
【復帰値】 Number 型,radian で返す.
【引数】 value
:数値を指定します.
99
atan2(逆正接)
【構文】 Number atan2 (Number y, Number x)
【機能】 逆正接の計算を行います.
【復帰値】 Number 型,-πからπの radian で返す.
【引数】
x, y :数値を指定します.
delaymsec(時間遅延)
【構文】 Void delaymsec (Number x)
【機能】 指定時間実行を停止します.
【復帰値】 Void 型
【引数】
x
:数値を指定します.
備考
- 数値操作関数は,C 言語の仕様に準拠しています.演算の途中,または演算の結
果として,倍精度(double 型)での表現が不可能な場合,手続き実行時にエラー
メッセージが表示され,手続きの実行が中断されます.
- 数値操作関数で倍精度(double 型)での有効桁を超えた演算を行った場合の結果
は,不正確となる場合があります.
数値操作関数を利用したインタプリタ手続き文の例を以下に示します.
/* ラジアンから三角関数値を求める */
slot Number radian;
/* 入力角度(ラジアン)値 */
slot Number ans_sin;
/* サイン値
*/
slot Number ans_cos;
/* コサイン値
*/
slot Number ans_tan;
/* タンジェント値
*/
action radian()
{
ans_sin = sin(radian);
ans_cos = cos(radian);
ans_tan = tan(radian);
}
100
D.2
文字列操作関数
文字列を操作するための関数です.文字列操作関数には以下のものがあります.
関数仕様
atof(文字列を数値に変換)
【構文】
Number atof(String string)
【機能】
文字列を数値に変換します.
【復帰値】 正常
:変換された数値
異常
:0
【引数】
string :変換する文字列を指定します
ftoa(数値を文字列に変換)
【構文】
String ftoa(Number number)
【機能】
数値を文字列に変換します.
【復帰値】 String 型 :変換された文字列
小数点以下の有効桁数は 3 桁固定です.
例)ftoa(3) は "3.000"
【引数】
number :変換する数値を指定します
vtoa(値を文字列に変換)
【構文】
String vtoa(value)
【機能】
値を文字列に変換します.
【復帰値】 String 型 :変換された文字列
文字列の形式は引数の型によって次のようになります.
String 型
:value 値を"(ダブルクォート)で囲った文字
列.25 バイト以上の長さになる場合は末尾を
省略した最大 24 バイトを返却します.
例)vtoa("abc")は""abc""
Number 型
:数値文字列
小数点以下の有効桁数は 3 桁固定です.ftoa
関数と同じ結果になります.
Boolean 型
:"true"または"false"
例)vtoa(TRUE)は"true"
Dictionary 型 :第 1 要素のキーと値を"Dictionary(("キー",
値),...)で表します.
値は vtoa 関数の仕様に応じて String に変換さ
れます.ただし,値が Dictionary 型の場合は
101
【引数】
入れ子になります.Dictionary が NULL の場
合,または Dictionary の第 1 要素が NULL の
場合は,"Dictionary(none)"になります.1024
バイト以上の長さになる場合は,末尾を省略
した最大 1023 バイトを返却します.
ユーザ定義型 :ユーザ定義型で指定されている形式に変換さ
れます.
value :文字列に変換したい変数または値を指定します.
指定できる変数の型は String 型,Number 型,Boolean 型,Dictionary
型,ユーザ定義型です.
strlen(文字列の長さの取り出し)
【構文】
Number strlen(String string)
【機能】
文字列の長さを取り出します(単位バイト).
【復帰値】 Number 型 :文字列の長さ.
【引数】
string
:文字列を指定します.
getenv(環境変数の内容の取り出し)
【構文】 String getenv(String string)
【機能】 環境変数の内容を文字列に取り出します.
【復帰値】 String 型
:環境変数に設定されている値.
Windows の環境変数が存在しない場合は,IP で設定され
ているレジストリ情報から取り出します.
環境変数が存在しないか,またはなにも設定されていない場合は“”
(空
文字列)になります.
【引数】 string :環境変数名を指定します.
備考
- atof 関数,ftoa 関数の精度は,倍精度(double 型)の範囲で変換が行われます.
有効桁を超えた場合の結果は不正確となる場合があります.
102
文字列操作関数を利用したインタプリタ手続き文の例を以下に示します.
/* 環境変数名に設定されている値と値の長さを取り出す */
slot String envname;
/* 調査したい環境変数名
slot String envvalue;
/* 環境変数の値
slot Number envvalue_length;
/* 環境変数の値(文字列)の長さ
action envname()
{
envvalue = getenv("PATH");
envvalue_length = strlen(envvalue);
}
103
*/
*/
*/
D.3
ファイル操作関数
テキストファイルとデータの入出力を行うための関数です.ファイル操作関数には以下の
ものがあります.
関数仕様
open(ファイルのオープン)
【構文】 Number open(String filename, Number mode)
【機能】 ファイルをオープンします.
【復帰値】 正常
:ファイル番号
異常
:-1
【引数】 filename
:オープンするファイル名を指定します.
mode
:ファイルをオープンするときのモードを指定します.以下
の定数を用いてモードを指定します.
_O_RDONLY :read モード
_O_WRONLY :write モード
指定ファイルがない場合,新しいファイル
を作成します.
_O_RDWR
:read/write 同時モード
close(ファイルのクローズ)
【構文】 Number close(Number fileno)
【機能】 ファイルをクローズします.
【復帰値】 正常
:0(正常終了)
異常
:-1(クローズ時にエラーが発生した)
【引数】 fileno
:クローズするファイルのファイル番号を指定します.ファ
イルをオープンしたときの復帰値を指定します.
write(ファイルへの書き込み)
【構文】 Number write(Number fileno, String string, Number byteno)
【機能】 ファイルに指定バイト数書き込みます.
文字列とバイト数は短い方が優先されます.
【復帰値】 正常
:正値(実際に書き込んだバイト数)
異常
:-1(書き込み時にエラーが発生した)
【引数】 fileno
:ファイル番号
string
:書き込む文字列
byteno
:書き込むバイト数
104
read(ファイルからの読み込み)
【構文】
String read(Number fileno,Number byteno)
【機能】
ファイルから指定バイト数読み込みます.
【復帰値】 正常
:読み込んだ文字列
異常
:“ ”(空文字列)
【引数】
fileno
:ファイル番号
byteno
:読み込むバイト数
ファイル操作関数を利用したインタプリタ手続き文の例を以下に示します.
/* InFile を OutFile に複写する手続き */
slot Command Copy;
/* 複写開始コマンド */
slot String InFile;
/* 入力ファイル名
*/
slot String OutFile;
/* 出力ファイル名
*/
slot Number rc;
/* 復帰値 0: 複写正常終了 */
/*
1: 入力ファイルオープンエラー
/*
2: 出力ファイルオープンエラー
/*
3: 書き込みエラー
action Copy()
{
Number InFileNo;
Number OutFileNo;
String buf;
if ( (InFileNo = open(InFile,_O_RDONLY)) == -1)
{
rc = 1;
return;
}
if ( (OutFileNo = open(OutFile,_O_WRONLY)) == -1)
{
rc = 2;
close(InFileNo);
return;
}
while (1)
105
*/
*/
*/
{
buf = read(InFileNo, 200);
if (buf == "")
break;
if ( (write(OutFileNo, buf, 200)) == -1 )
{
rc = 3;
close(InFileNo);
close(OutFileNo);
return;
}
}
rc = 0;
close(InFileNo);
close(OutFileNo);
return;
}
D.4
ディクショナリ操作関数
IP では,構造をもったデータや集合をディクショナリと呼ぶリスト形式で表現します.
このリストに対し順序位置を指定することによって,要素をアクセスできます.要素は,
キーと値の対で表現されています.キーは要素の種別を示すためのデータです.
要素の値として,数値,文字列,論理値以外にディクショナリも保持できます.
したがって,ディクショナリの中にディクショナリをもたせることによって,n 次元のデー
タ構造を表現できます.
ディクショナリ操作関数には以下のものがあります.
106
関数仕様
ngetKey(キーの取り出し)
【構文】
String ngetKey(Dictionary dict, Number index)
【機能】
指定したディクショナリの index 番目の要素のキーを取り出します.
【復帰値】 正常
:キー
異常
:“”
【引数】
dict
:ディクショナリ
index :インデックス
getType(要素の型の取り出し)
【構文】
Number getType(Dictionary dict, String key)
【機能】
指定したディクショナリの該当する key の要素の型(数値)を取り出
します.
【復帰値】 正常 :以下の定数を用いて,型の判定を行います.
異常
【引数】
dict
key
_T_NUMBER
:Number 型
_T_STRING
:String 型
_T_DICTIONARY
:Dictionary 型
_T_BOOLEAN
:Boolean 型
_T_OBJECT
:ユーザ定義型
:上記以外の場合,以下の値が返されます.
0
:上記以外の型が指定されています.
-1
:指定したキーが存在しません.
:ディクショナリ
:キー
getNumber(数値要素の取り出し)
【構文】
Number getNumber(Dictionary dict, String key)
【機能】
指定したディクショナリの該当する key の要素の値(数値)を取り
出します.
【復帰値】
正常
:値(数値)
異常
:0
【引数】
dict
:ディクショナリ
key
:キー
getString(文字列要素の取り出し)
【構文】 String getString(Dictionary dict, String key)
【機能】 指定したディクショナリの該当する key の要素の値(文字列)を取り
出します.
107
【復帰値】 正常
異常
【引数】 dict
key
:値(文字列)
:“”
:ディクショナリ
:キー
getBoolean(論理値要素の取り出し)
【構文】 Boolean getBoolean(Dictionary dict, String key)
【機能】 指定したディクショナリの該当する key の要素の値(boolean 型)を取
り出します.
【復帰値】 正常 :0(FALSE)または 1(TRUE)
異常 :0(FALSE)
【引数】 dict :ディクショナリ
key
:キー
getDictionary(ディクショナリ要素の取り出し)
【構文】 Dictionary getDictionary(Dictionary dict, String key)
【機能】 指定したディクショナリの該当する key の要素の値(ディクショナリ
型)を取り出します.
【復帰値】 正常 :値(ディクショナリ)
異常 :NULL
NULL の場合は,length(getDictionary(dict, key))が-1 になりま
す.
【引数】 dict :ディクショナリ
key
:キー
put(ディクショナリ要素の設定)
【構文】 Void put(Dictionary dict, String key, value)
【機能】 指定したディクショナリの該当する key の要素に値を設定します.該
当する key の要素がなければ,要素を追加します.
【復帰値】 ありません.
【引数】 dict :ディクショナリ
key
:キー
value :value 値
clear(ディクショナリ要素の解放)
【構文】 Void clear(Dictionary dict)
【機能】 ディクショナリのすべての要素を解放します.
【復帰値】 ありません.
108
【引数】
dict :ディクショナリ
remove(ディクショナリ要素の削除)
【構文】
Void remove(Dictionary dict, String key)
【機能】
ディクショナリ中のキーが示す要素を削除します.
【復帰値】 ありません.
【引数】
dict :ディクショナリ
key :キー
length(ディクショナリ要素数の取り出し)
【構文】 Number length(Dictionary dict)
【機能】 ディクショナリの要素の数を返します.
【復帰値】 正常 :ディクショナリの要素の数
異常 :-1
【引数】
dict :ディクショナリ
ディクショナリ関数とデータ構造の関係を以下で説明します.
put 関数
put 関数は該当するキーがない場合は,ディクショナリの最後に要素を追加します.
上の図のような構造のディクショナリに対して put(dic,"key3", "CCC")を実行すると,キー
が“key3”の要素が最後に追加され,次のようになります.
該当するキーが存在する場合は,そのキーの要素が更新されます.
上の図のディクショナリに対して,put(dic, "key1", "DDD")を実行すると,キーが“key1”
の要素に“DDD”が設定され,次のようになります.
109
remove 関数
remove 関数は該当するキーが示す要素を削除します.
上の図のような構造のディクショナリに対して remove(dic, "key1")を実行すると,キーが
“key1”の要素が削除され,次のようになります.
2 次元ディクショナリ
2 次元ディクショナリを生成するには,ディクショナリ型を要素に指定して put 関数を実
行します.
上の図のような構造のディクショナリをディクショナリの要素として設定します.空の
ディクショナリ型 dic2 に対して put(dic2, "dic1", dic)を実行すると,キーが“dic1”の要素に
ディクショナリが設定され,次のようになります.
110
2 次元ディクショナリを参照するには,getDictionary 関数を使用します.上の図の dic2
に対して dic=getDictionary(dic2, "dic1")を実行すると,キーが“dic1”の要素が取り出され,
dic に設定されます.このとき dic は次のようになります.
したがって,2次元ディクショナリの中でキーが“key2”の要素は,
getString(getDictionary(dic2, "dic1"), "key2")
を実行することにより参照することができます.
ディクショナリ操作関数の使用例を以下に示します.
〔例題〕日ごとの入場者数(男女計を含む)を入力します.入力が終了し,追加ボタンが
押されると,期間中の入場者の総合計を集計します.なお,日ごとの入場者数はページを
指定することによって,参照できるようにします.
〔画面例〕
111
この例は,手続きパッド部品のパッドサンプル「サンプル 3(dictionary 操作)
」にあります.
slot Dictionary Current;
slot Dictionary Data;
slot Number Page;
slot Command AddData;
slot Number Total;
action Page()
{
Number Len;
Len = length(Data);
if(Len==0) return;
if(Page > Len) Page = Len;
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
1 日の入場者データ
*/
Current の構造 index キー
内容 */
0
Year
年
*/
1
Month
月
*/
2
Day
日
*/
3
Man
男性人数
*/
4
Woman
女性人数
*/
5
TotalDay
合計/日
*/
期間中の入場者データ
*/
ページ番号
*/
追加ボタン
*/
期間中の累計入場者数
*/
ページが指定された時のスロット
*/
アクション
*/
/* 要素数を求める
*/
/* 要素がなければ,そのまま復帰する */
/* 要素数より大きいページ番号が指定 */
/* されたらページ番号を最終要素に設定*/
Current = getDictionary(Data, ngetKey(Data,Page-1)) ;
/* 指定ページのデータを取り出し表示 */
/* する
*/
}
action AddData()
{
Number i,j ;
Dictionary elm;
/* 追加ボタンが押された時のスロット */
/* アクション
*/
put(Data,ftoa( length(Data) ), Current);
/* 1日のデータを累積
/* キーとしてページ番号を文字列に
/* 変換して設定
/* ページ番号を更新し,表示する
Page = length(Data);
j = 0;
for(i=0; i<Page; i=i+1) {
elm = getDictionary(Data, ngetKey(Data,i)) ;
/* 1日のデータを順次取り出す
j
=
j
+ /* 1日の合計を加算して累計算出
}
Total = j;
}
112
*/
*/
*/
*/
*/
*/
D.5
スロットアクション操作関数
スロットアクション操作関数は,明にスロットアクションを動作させたい場合や,該当
スロットとデータ連携しているパッドに対して,スロットの値が変化した際と同様な処理
を行わせる場合に使用する関数です.スロットアクション操作関数には以下のものがあり
ます.
関数仕様
¥update(更新通知の送信)
【構文】
Void \update(slotname)
【機能】
データ連携しているパッドのスロットアクションを実行させます.
手続きで定義したスロットのうち,Command 型スロットと Command
型スロットに結合している主スロットについてのみ有効です.それ
以外のスロットの場合は,スロット値を変更したときにスロットア
クションが動作するため,この関数を使用する必要はありません.
主スロットを¥update 関数のパラメータに変更して,使用します.
【復帰値】 ありません.
【引数】
slotname :手続きで定義されているスロット名を指定します.
¥update 操作関数を利用したインタプリタ手続き文の例を以下に示します.
slot Number N;
slot Command C1;
slot Command C2;
slot Command C3;
action N()
if(N==1)
¥update(C1);
if(N==2)
¥update(C2);
if(N==3)
¥update(C3);
}
/*
/*
/*
/*
/*
/*
C1 に結合しているパッドのスロット
アクションを実行させます.
C2 に結合しているパッドのスロット
アクションを実行させます.
C3 に結合しているパッドのスロット
アクションを実行させます.
*/
*/
*/
*/
*/
*/
上図に示した手続き文を記述した手続きパッドをパッドコマンドパッドと組み合わせた
例を以下に示します.
この例では,手続きパッドの共有複写を 3 つ作成し,共有複写した手続きパッドの主ス
ロットをそれぞれ C1,C2,C3 に変更します.そして,それらの手続きパッドをそれぞれ
パッドコマンドパッドの closeslot スロットに結合します.共有複写元の手続きパッドの N
スロットに入力した数値により,閉じるパッドコマンドパッドを変えることができます.
113
たとえば,N スロットに 1 を入力するとパッドコマンドパッド 1 が閉じます.
D.6
出力制御操作関数
出力制御操作関数は,インタプリタ手続き文の中から,文字列をメッセージボックスや
ファイルに出力します.これらの関数は,インタプリタ手続き文のデバッグ時の,トレー
ス出力用に利用します.
関数仕様_ _Proc_Output
【構文】
_
【機能】
Void _ _Proc_Output(String message)
文字列 mesage をメッセージボックスに出力します.
【復帰値】 なし
_
【引数】 message :出力したい情報を文字列で指定します.
P
【備考】 - 長さが 1024 バイトを超えるデータは,1024 バイトまでを出力します.
r
- このメッセージボックスが表示されている間,手続きは実行されませ
o
ん.
c
114
_Output_Env
【構文】 Void _ _Proc_Output_Env(String storage, String filename)
【機能】 出力環境(出力先, ファイル名)を設定します.
【復帰値】 なし
【引数】 storage
:出力先を指定します.
"FILE"
:ファイルに出力します.
"NOTICE"
:メッセージボックスに出力します.
その他の文字列が指定された場合は,メッセージボックス
に出力します.
filename :出力先ファイル名を指定します.
storage が“FILE”のときに filename に出力します.
storage が“NOTICE”のときには“”を指定します.
filename に指定されたファイルに書き込めないときには実
行時にエラーメッセージを出力し,
“NOTICE”が指定され
【備考】
【注意】
たものとして処理を継続します.
本関数で環境の設定を省略した場合,出力先はメッセージボックスに
なります.
本関数を呼び出したとき,既存する filename の内容は削除されます.
_ _Proc_Output_State
【構文】 Void _ _Proc_Output_State(Boolean state)
【機能】 _ _Proc_Output()関数の出力機能を制御します.
【復帰値】 なし
【引数】 state :_ _Proc_Output()関数で指定した文字列を出力するかどうか指
定します.
True
:出力する
False
:出力しない
【備考】 本関数で出力制御の指定を省略した場合,トレース出力をします.
注意
_ _Proc_Output_Env(),_ _Proc_Output_State()の 2 つの関数は,IP 上のすべてのインタプリ
タ手続き記述文の中の_ _Proc_Output()関数を制御します.したがって,以下のように,手
続き A の中で_ _Proc_Output()関数の出力を抑止した場合,手続き A だけでなく手続き B
の_ _Proc_Output()の出力も抑止されます.
115
参考
【手続きのトレースをとるために利用する】
_ _Proc_Output_Env(),_ _Proc_Output_State()の 2 つの関数がもつ,
「IP 上のすべてのイン
タプリタ手続き記述文の中の_ _Proc_Output()関数を制御する」という機能を利用して,次
のような,手続きトレース制御のインタプリタ手続き文を作成できます.これにより,手
続きによって,手続き 1~手続き 3 のトレースの出力を制御することができます.
出力制御操作関数を利用したインタプリタ手続き文の例を以下に示します.
/* 計算フラグ(bool)が TRUE のときに,num 値を計算し,str 値も変更する */
slot String str;
slot Number num;
slot Boolean bool;
slot Command com;
action com()
{
str = "物品 A";
num = 100;
bool = TRUE;
/* 出力をメッセージボックスにする
*/
_ _Proc_Output_Env("NOTICE", "");
116
/*
アクション関数に入ったときの, スロット値を出力 */
_ _Proc_Output(" 税計算手続き(入口)¥n¥n" +
"項目
:" + vtoa(str) + '¥n' +
"定価
:" + vtoa(num) + '¥n' +
"計算 FLAG :" + vtoa(bool) + '¥n' );
if (bool == TRUE )
{
str = str + "(税込み)";
num = num * 1.03;
bool = FALSE;
/* アクション関数を出るときの, スロット値を出力
_ _Proc_Output(" 税計算手続き(出口)¥n¥n" +
*/
"項目
:" + vtoa(str) + '¥n' +
"税込価格 :" + vtoa(num) + '¥n' +
"計算 FLAG :" + vtoa(bool) + '¥n' );
}
}
出力結果
以下のようにメッセージボックスが 2 回表示されます.
117
索
引
_
K
_ _Proc_Output .......................................... 120
_ _Proc_Output_State................................ 120
_Output_Env.............................................. 120
keyentry........................................................ 29
A
length.......................................................... 114
log ............................................................... 101
log10 ........................................................... 101
L
abs .............................................................. 102
acos............................................................. 103
asin ............................................................. 103
atan ............................................................ 103
atan2 .......................................................... 104
atof ............................................................. 105
N
ngetKey ...................................................... 112
O
B
open ............................................................ 108
Boolean......................................................... 15
P
C
pow.............................................................. 102
put............................................................... 113
ceil .............................................................. 103
clear.............................................................113
close............................................................ 108
cos............................................................... 101
cosh............................................................. 102
R
read............................................................. 110
remove ........................................................ 114
D
S
delaymsec................................................... 104
Dictionary .................................................... 39
shinh ........................................................... 102
sin ............................................................... 101
sqrt.............................................................. 102
strlen .......................................................... 106
E
exp .............................................................. 101
T
F
tan............................................................... 101
tanh ............................................................ 102
TRUE............................................................ 15
FALSE .......................................................... 15
floor ............................................................ 103
fmod............................................................ 103
for 37
ftoa ............................................................. 105
U
update......................................................... 118
G
V
getBoolean ..................................................113
getDictionary ..............................................113
getenv......................................................... 106
getNumber ..................................................112
getString .....................................................112
getType........................................................112
vtoa ............................................................. 105
W
write............................................................ 108
I
い
IntelligentPad ................................................ 3
イメージパッド ............................................... 4
インタプリタ........................................... 10, 84
118
お
て
お茶運びロボット ......................................... 67
親パッド.......................................................... 4
ディクショナリ操作関数 ............................. 111
定数 ............................................................... 74
テキストパッド ............................................. 10
手続きパッド................................................. 10
電卓 ............................................................... 29
か
型指定子........................................................ 80
関数の宣言 .................................................... 89
関数の定義 .................................................... 90
と
時計 ................................................................. 8
く
は
組み込み関数 .............................................. 100
組み込み定数 ................................................ 94
クリアボタン ................................................ 30
ハイタイマパッド.......................................... 40
πの計算 ........................................................ 21
こ
ひ
子パッド.......................................................... 4
ピクチャフォルダパッド ............................... 20
日付パッド ...................................................... 8
さ
ふ
さいころ........................................................ 19
ファイル操作関数........................................ 108
ふくろう時計................................................. 14
プロパティウインドウ .................................... 8
文の構成要素................................................. 72
文法 ............................................................... 72
し
式と演算子 .................................................... 77
住所録 ........................................................... 49
シューティングゲーム .................................. 39
主スロット ...................................................... 4
出力制御操作関数 ........................................119
使用可能な文字............................................. 72
小数点 ........................................................... 29
へ
変数の宣言 .................................................... 88
ほ
す
ポーランド記法 ............................................. 58
ボタンパッド................................................... 8
スイッチパッド............................................. 14
数値入力部品 ................................................ 35
数値パッド ................................................ 8, 10
スクロール文字列パッド............................... 20
スタック........................................................ 55
スロット.......................................................... 4
スロットアクション操作関数 ......................118
スロットアクションの定義 ........................... 91
スロットアクションの動作 ........................... 93
スロット結合 .................................................. 5
スロット宣言 ................................................ 87
も
モービルパッド ............................................. 40
もぐらたたき................................................. 23
文字列操作関数 ........................................... 105
文字列パッド................................................... 8
ら
乱数 ............................................................... 19
せ
れ
制御文 ........................................................... 95
レーダパッド................................................. 43
レゴの制御 .................................................... 62
た
タイマパッド ............................................ 8, 23
119
Fly UP