Program Editor入門
Calculatorの入力行に定義ステートメントを入力するかProgram Editorを使うかすれば、ユーザー定義の函数またはプログラムが作成できます。Program Editorのほうが少し有利ですので、このセクションではProgram Editorを取り上げます。詳しくは「Calculator」を見てください。
Program Editorにはプログラミング・テンプレートとダイアログ・ボックスとが用意してあるので、正しい構文で函数およびプログラムが定義しやすい。
- Program Editorでは、特殊なキー操作で1行1行を追加しなくても、複数行のプログラミング・ステートメントが入力できる。
- プライベートおよびパブリックのどちらのライブラリー・オブジェクト(変数、関数、プログラムのこと)も簡単に作成できる。詳しくは「ライブラリー」を見てください。
Program Editorを起動する
▶ 現行プロブレムに新たにProgram Editorページを追加するときは次のようにします。
ツールバーから[Insert]>[ProgramEditor]>[New]の順にクリックする。
ハンドヘルド:[doc▼]を押してから[Insert]>[ProgramEditor]>[New]の順に選択する。
注:Program Editorは、Calculatorページの[Functions&Programs]メニューからもアクセスできます。
① [Program Editor]メニュー:このメニューは、通常のビュー・モードでProgram Editorのワーク・エリアを表示しているときはいつでも利用できます。
② Program Editorのワーク・エリア
③ ステータス・ライン:行番号の情報と、編集中の函数またはプログラムの名前とが表示されます。アスタリスク(*)は、最後に構文のチェックを済ませて函数をストアしたあとにその函数に変更が加えられたとことを示しています。
プログラムまたは函数を定義する
新たにProgram Editorを開始する
1. プログラムまたは函数を作成したいドキュメントおよびプロブレムを開いてください。
2. アプリケーション・ツールバーの[Insert]ボタン()をクリックし、[ProgramEditor]>[New]の順に選択します(ハンドヘルドの場合は、[doc▼]を押してから[Insert]>[ProgramEditor]>[New]の順に選択します)。
3. これから定義する函数またはプログラムの名前を入力します。
4. [Type]を選択します([Program]、[Function]のどちらか)。
5. 以下のように[LibraryAccess]を設定します。
- 現行のドキュメントまたはプロブレムからしか使用しない函数またはプログラムを定義する場合は[None]を選択します。
- どのドキュメントからもアクセスはできるがカタログには表示されない函数またはプログラムを定義するときは、[LibPriv]を選択します。
- どのドキュメントからもアクセスできて、しかもカタログに表示される函数またはプログラムを定義するときは、[LibPub(Show in Catalog)]を選択します。詳しくは「ライブラリー」を見てください。
6. [OK]をクリックします。
新たにProgram Editorページが開きます。設定に応じて最初からテンプレートが入力してあります。
函数またはプログラムに行を入力する
Program Editorでは、入力したコマンドの実行もできませんし、入力した式の計算もできません。入力したコマンドおよび式は、当の函数またはプログラムを実行したときのみ実行されます。
1. ユーザーに引数を入力してもらう必要のある函数またはプログラムの場合は、函数名またはプログラム名のうしろの括弧内にパラメーター名を入力してください。パラメータが複数ある場合はカンマで区切ってください。
2. FuncとEndFuncとの間(またはPrgmとEndPrgmとの間)に、函数またはプログラムを記述します。
- 関数名およびコマンド名は、キーボードからも入力できるし、カタログから選んで挿入することもできます。
- 1行が画面の幅よりも長くなることがあります。その場合、行全体を見るためにはスクロールする必要があるかもしれません。
- 1行入力し終えるとごにEnterキーを押してください。そうすると、空の行が新たに挿入されますので、続けて別の行が入力できます。
- ◄、►、▲、▼の各矢印キーを使って画面の中を移動しながら、コマンドの入力、編集を行ってください。
コメントを入力する
コメント記号(©)を使うと注釈が入力できます。コメントが書いてある、第三者がそのプログラムを見る場合や編集する場合に役立ちます。コメントは、プログラムの実行時には表示されませんし、プログラムの流れにも影響はしません。
Define LibPub volcyl(ht,r) =Prgm
©volcyl(ht,r) => volume of cylinder ①
Disp “Volume =”, approx(p・r2・ht)
©This is another comment.
EndPrgm
① 必要な構文をコメントに示しています。このライブラリー・オブジェクトはパブリック・オブジェクトであり、しかもFuncブロックまたはPrgmブロックの先頭行であるため、このコメントはヘルプとしてカタログに表示されます。詳しくは「ライブラリー」を見てください。
コメントを挿入するときは次のようにします。
1. コメントを挿入したい行の末尾にカーソルを置きます。
2. [Actions]メニューの[InsertComment]をクリックします。
3. ©記号のうしろにコメント文を入力します。
構文を確認する
Program Editorは、函数またはプログラムの構文が正しいかどうかを確認することができます。
▶ [CheckSyntax&Store]メニューの[CheckSyntax]をクリックします。
何か構文エラーが見つかった場合は、エラー・メッセージが表示され、訂正しやすいように最初のエラーの近くにカーソルが配置されます。
函数またはプログラムを保存する
函数もプログラムも、ストアしてからでないとアクセスできません。構文は、保存の前に自動的に確認されます。
函数またはプログラムがまだストアされていない場合は、Program Editorの左上にアスタリスク(*)が表示されます。
▶ [CheckSyntax&Store]メニューの[CheckSyntax&Store]をクリックします。
何か構文エラーが見つかった場合は、エラー・メッセージが表示され、最初のエラーの近くにカーソルが配置されます。
構文エラーが見つからなかった場合は、Program Editorの一番上のステータス・ラインに“Storedsuccessfully”というメッセージが表示されます。
注:函数またはプログラムをライブラリー・オブジェクトとして定義する場合は、当のドキュメントを指定のライブラリー・フォルダーに保存したうえで、ライブラリーをリフレッシュしなければなりません。そうしないと、ライブラリー・オブジェクトは他のドキュメントからアクセスできません。詳しくは「ライブラリー」を見てください。
プログラムまたは函数を見る
1. [Actions]メニューの[View]をクリックします。
2. 目的の函数またはプログラムがライブラリー・オブジェクトである場合は、[Location]リストからそのライブラリーを選択します。
3. [Name]リストから函数またはプログラムの名前を選択します。
選択した函数またはプログラムがビューアーに表示されます。
4. 矢印キーを使って、表示した函数またはプログラムを見ます。
5. プログラムを編集する場合は[Edit]をクリックします。
ハンドヘルド:[tab]を押して[Edit]を強調表示してから[enter]を押します。
注:[Edit]が選択できるのは、現行プロブレムで定義した函数およびプログラムについてのみです。ライブラリー・オブジェクトを編集するときは、最初にそのライブラリー・ドキュメントを開かなければなりません。
編集用に函数またはプログラムを開く
函数もプログラムも、現行プロブレムからしか開けません。
注:ロックの掛かったプログラムおよび関数は変更できません。オブジェクトのロックを解除するときは、Calculatorページに移動してunLockコマンドを使ってください。
1. 利用できる函数およびプログラムのリストを表示します。
- [Actions]メニューの[Open]をクリックします。
2. 目的の項目をクリックすると開きます。
ライブラリーからプログラムをインポートする
ライブラリー・オブジェクトとして定義された函数もプログラムも、現行プロブレム内のProgram Editorにインポートすることができます。たとえ元のオブジェクトがロックされていても、インポートされたコピーはロックされません。
1. [Actions]メニューの[Import]をクリックします。
2. [Library Name]リストからライブラリー名を選択します
3. [Name]リストからオブジェクト名を選択します。
4. インポートするオブジェクトに別の名前をつける場合は、[ImportAs]の欄に名前を入力してください。
函数またはプログラムのコピーを作成する
函数またはプログラムを新たに作成する場合は、すでにあるものをコピーしてそれを変更するほうが簡単なことがあります。たとえ元のオブジェクトがロックされていても、作成したコピーはロックされません。
1. [Actions]メニューの[CreateCopy]をクリックします。
2. 新しい名前を入力します。提案された名前のままでよければ[OK]をクリックします。
3. アクセス・レベルを変更する場合は、[LibraryAccess]リストを開いて目的のレベルを選択します。
プログラムまたは函数の名前を変更する
現行の函数またはプログラムは名前が変更できます。アクセス・レベルの変更も可能です。
1. [Actions]メニューの[Rename]をクリックします。
2. 新しい名前を入力します。提案された名前のままでよければ[OK]をクリックします。
3. アクセス・レベルを変更する場合は、[LibraryAccess]リストを開いて目的のレベルを選択します。
ライブラリー・アクセス・レベルを変更する
1. [Actions]メニューの[ChangeLibraryAccess]をクリックします。
2. 以下のように[LibraryAccess]を設定します。
- 現行のCalculatorプロブレムからしか使用しない函数またはプログラムを定義する場合は[None]を選択します。
- どのドキュメントからもアクセスはできるがカタログには表示されない函数またはプログラムを定義するときは、[LibPriv]を選択します。
- どのドキュメントからもアクセスできて、しかもカタログに表示される函数またはプログラムを定義するときは、[LibPub]を選択します。
テキストを検索する
1. [Actions]メニューの[Find]をクリックします。
2. 検索するテキストを入力し、[OK]をクリックします。
- 見つかった場合は、プログラム内でそのテキストが強調表示されます。
- 見つからなかった場合は、通知メッセージが表示されます。
テキストの検索と置換
1. [Actions]メニューの[FindandReplace]をクリックします。
2. 検索するテキストを入力します。
3. 置換後のテキストを入力します。
4. [Replace]をクリックすると、カーソルよりうしろで最初に見つかったテキストが置換されます。
—別の方法—
[ReplaceAll]をクリックすると、見つかったテキストが全箇所置換されます。
注:mathテンプレート内に検索テキストが見つかった場合は、見つかったテキストだけではなくテンプレート全体が置換されるという警告が表示されます。
現行の函数またはプログラムを閉じる
[Actions]メニューの[Close]をクリックします。
変更した内容がまだストアされていなかった場合は、閉じる前に構文を確認して保存するよう指示が出ます。
プログラムの実行と函数の計算
函数またはプログラムは、定義して保存し終えれば、任意のアプリケーションで使用できるようになります。函数はどのアプリケーションでも計算できますが、プログラムはCalculatorおよびNotesでしか実行できません。
プログラム・ステートメントは上から順に実行されます(ただし、プログラムのフローを変えるコマンドもあります)。出力がある場合は、当該アプリケーションのワーク・エリアに表示されます。
- プログラムの実行は、最後のステートメントかStopコマンドかいずれかに達するまで続けられます。
- 函数の実行は、Returnコマンドに達するまで続けられます。
- プログラムまたは函数を手動で停止するときは次のようにします。
- Windows®:F12キーを押したままEnterキーを繰り返し押す。
- Mac®:F5キーを押したままEnterキーを繰り返し押す。- ハンドヘルド:[☖on]キーを押したまま[enter]を繰り返し押す。
短い名前、長い名前を使う
オブジェクトを定義したプロブレムを開いているときはいつでも、短い名前を入力することでそのオブジェクトへアクセスできます(「短い名前」とは、Defineコマンドで指定した名前のことです)。ライブラリー・オブジェクト(プライベートもパブリックも)やライブラリー以外のオブジェクトなど、定義されたオブジェクトはすべて、この方法でアクセスできます。
長い名前を入力すれば、どのドキュメントからでもそのライブラリー・オブジェクトへアクセスできます。「長い名前」は、“オブジェクトのライブラリー・ドキュメント名\オブジェクト名”という形で指定します。たとえばライブラリー・ドキュメントlib1の中でfunc1として定義されたオブジェクトの長い名前はlib1\func1です。ハンドヘルドで“\”を入力するときは[↑shift][÷]の順に押してください。
注:正確な名前が思い出せない場合、またはプライベート・ライブラリー・オブジェクトに必要な引数の順番が思い出せない場合は、当のライブラリー・ドキュメントを開くかProgram Editorを使うかすれば、そのオブジェクトの内容を見ることができます。getVarInfoを使えば、同じライブラリーに含まれているオブジェクトのリストを見ることができます。
パブリック・ライブラリー函数またはパブリック・ライブラリー・プログラムを使う
1. 当該オブジェクトがドキュメントの先頭のプロブレム内で定義済みであること、そのオブジェクトがストア済みであること、そのオブジェクトがMyLibフォルダーに保存済みであること、ライブラリーがリフレッシュ済みであることを確認します。
2. 目的の函数またはプログラムを使いたいアプリケーションを開きます。
注:函数はどのアプリケーションでも計算できますが、プログラムはCalculatorおよびNotesでしか実行できません。
3. カタログを開き、ライブラリー・タブを使って目的のオブジェクトを見つけて挿入します。
—別の方法—
オブジェクト名を入力します。函数、プログラムのいずれの場合も、そのオブジェクト名のうしろに必ず括弧をつけてください。
libs2\func1()
4. 引数を指定する必要のあるプログラムの場合は、括弧内に値または変数名を入力します。
libs2\func1(34,power)
5. [enter]を押します。
プライベート・ライブラリー函数またはプライベート・ライブラリー・プログラムを使う
プライベート・ライブラリー・オブジェクトを使うためには、その長い名前を知る必要があります。たとえばライブラリー・ドキュメントlib1の中でfunc1として定義されたオブジェクトの長い名前はlib1\func1です。
注:正確な名前が思い出せない場合、またはプライベート・ライブラリー・オブジェクトに必要な引数の順番が思い出せない場合は、当のライブラリー・ドキュメントを開くかProgram Editorを使うかすれば、そのオブジェクトの内容を見ることができます。
1. 当該オブジェクトがドキュメントの先頭のプロブレム内で定義済みであること、そのオブジェクトがストア済みであること、そのオブジェクトがMyLibフォルダーに保存済みであること、ライブラリーがリフレッシュ済みであることを確認します。
2. 目的の函数またはプログラムを使いたいアプリケーションを開きます。
注:函数はどのアプリケーションでも計算できますが、プログラムはCalculatorおよびNotesでしか実行できません。
3. オブジェクト名を入力します。函数、プログラムのいずれの場合も、そのオブジェクト名のうしろに必ず括弧をつけてください。
libs2\func1()
4. 引数を指定する必要のあるオブジェクトの場合は、括弧内に値または変数名を入力します。
libs2\func1(34,power)
5. [enter]を押します。
ライブラリーではないプログラムまたは函数を実行する
1. 目的の函数またはプログラムを定義したのと同じプロブレムを開いていることを確認してください。
2. 関数名またはプログラム名をエントリー・ラインに入力します。
—別の方法—
[var]を押してリストから名前を選択します。
名前のうしろには必ず括弧をつけなければなりません。
prog1()
引数を指定する必要のある函数またはプログラムの場合は、括弧内に値または変数名を入力します。
prog1(34,power)
3. [enter]を押します。
実行中のプログラムを止める
函数またはプログラムの実行中は、ビジー・ポインター(◎)が表示されます。
▶ 函数またはプログラムを止めるときは次のようにします。
- Windows®:F12キーを押したままEnterキーを繰り返し押す。
- Mac®:F5キーを押したままEnterキーを繰り返し押す。
- ハンドヘルド:[☖on]キーを押したまま[enter]を繰り返し押す。
メッセージが表示されます。停止した函数またはプログラムをProgram Editorで編集するときは、[GoTo]を選択します。停止したコマンドのところにカーソルが現れます。
プログラムに値を入力する
函数またはプログラムの計算に使用する値を入力する方法はいくつかあります。
プログラムまたは函数の中に最初から値を入力しておく
この方法は主に、目的のプログラムまたは関数を使用するときに毎回同じ値でなければならない場合に便利です。
1. プログラムを定義します。
Define calculatearea()=
Prgm
w:=3
h:=23.64
area:=w*h
EndPrgm
2. プログラムを実行します。
calculatearea()
:area 70.92
ユーザーに値を変数に入力してもらう
プログラムも函数も、事前に作成された変数が参照できます。この方法は、ユーザーが変数名を覚えていることが必要であり、さらに目的のオブジェクトを使用する前にその変数に値を入力することも必要です。
1. プログラムを定義します。
Define calculatearea()=
Prgm
area:=w*h
EndPrgm
2. 先に変数に値を入力してからプログラムを実行します。
w:=3 : h:=23.64
calculatearea()
:area 70.92
ユーザーに引数として値を入力してもらう
この方法は、プログラムまたは函数を呼び出す式の中にユーザーが引数として値を入力します。
下のプログラムvolcylは円筒の体積を計算するものです。円筒のheightおよびradiusという2つの値をユーザーが入力しなければなりません。
1. プログラムvolcylを定義します。
Definevolcyl(height,radius) =
Prgm
Disp "Volume =", approx(π・radius2・height)
EndPrgm
2. プログラムを実行すると、height 34 mm、radius 5mmと一緒に円筒の体積が表示されます。
volcyl(34,5) Volume = 534.071
注:プログラムvolcylを実行するときはパラメーター名を使用する必要はありませんが、値、変数、式のいずれかとして引数を2つ入力しなければなりません。その場合、先頭のパラメーターはheight、2番目のパラメーターはradiusでなければなりません。
値の入力をユーザーに要求する(プログラムのみ)
プログラムの中でRequestコマンドおよびRequestStrコマンドを使用すると、プログラムが一時停止し、ユーザーにデータの入力を要求するダイアログ・ボックスが表示できます。この方法であれば、変数名も変数の順序も覚えている必要はありません。
Request、RequestStrのどちらもコマンドも函数には使用できません。
1. プログラムを定義します。
Define calculatearea()=
Prgm
Request "Width: ",w
Request "Height: ",h
area:=w*h
EndPrgm
2. プログラムを実行し、プログラムからの要求に応えます。
calculatearea() : area
Width: 3 (要求に応えて3を入力した)
Height: 23.64 (要求に応えて23.64を入力した)
70.92
ユーザーの入力した内容が数式ではなく文字列であるとプログラムに解釈させたい場合は、Requestの代わりにRequestStrを使用してください。こうすれば、入力を引用符(““)で括る必要がありません。
函数またはプログラムの途中の計算結果を表示する
函数もプログラムも、途中の計算結果は表示しません。ただし、表示するためのコマンドを記述した場合は別です。この仕組みは、エントリー・ラインで計算する場合と、函数またはプログラムの中で計算する場合との重要な違いの1つです。
たとえば次の計算を函数またはプログラムの中で行っても結果は表示されません(エントリー・ラインで実行すれば結果が表示されます)。
...
x:=12•6
cos(π/4)
...
計算履歴を表示する
プログラムまたは函数の中でDispコマンドを使えば、途中の計算結果を含め、計算履歴が表示できます。
...
Disp 12•6
Disp "Result:",cos(π/4)
...
ダイアログ・ボックスに情報を表示する
Textコマンドを使うと、実行中のプログラムを一時的に停止させてダイアログ・ボックスに情報を表示させることができます。[OK]をクリックすればプログラムは動き出します。[Cancel]をクリックすればプログラムは停止します。
Textコマンドは函数には使用できません。
...
Text "Area=" & area
...
注:Disp、Textのどちらで結果を表示した場合も、その結果はストアされません。あとで結果を参照することが予測される場合は、その結果をグローバル変数にストアしてください。
...
cos(π/4)→maximum
Disp maximum
...
ローカル変数を使う
ローカル変数とは、ユーザー定義函数の計算中のみ、またはユーザー定義プログラムの実行中にのみ存在する一時的な変数のことです。
ローカル変数の例
下にプログラムの一部としてFor...EndForループを示します(ループについては後述します)変数iはループ・カウンターです。ほとんどの場合、この変数iは、プログラムの実行中にしか使われません。
Local i ①
For i,0,5,1
Disp i
EndFor
Disp i
① 変数iをローカル変数として宣言します。
注:目的のプログラムの中でしか使われない変数で、かつプログラムの停止後に利用する必要のない変数は、可能な限りすべてローカル変数として宣言してください。
変数エラー・メッセージ“Undefined”が表示される理由
ユーザー定義函数を計算するとき、またはユーザー定義プログラムを実行するときに、初期化されていないローカル変数(値が割り当てられていないローカル変数)を参照してしまうと、変数エラー・メッセージ“Undefined”が表示されます。
例:
Define fact(n)=Func
Local m ①
While n>1
n・m→m: n–1→n
EndWhile
Return m
EndFunc
① ローカル変数mに初期値が割り当てられていません。
ローカル変数の初期化
ローカル変数はすべて、先に初期値を割り当てておかないと、参照できません。
Define fact(n)=Func
Local m: 1→m ①
While n>1
n・m→m: n–1→n
EndWhile
Return m
EndFunc
① mの初期値として1が割り当てられます。
注(CAS):函数もプログラムも、ローカル変数は記号的計算(symbolic calculation)には使用できません。
CAS:記号的計算(Symbolic Calculation)を実行する
函数またはプログラムに記号的計算を実行させたい場合は、ローカル変数ではなくグローバル変数を使わなければなりません。ただし、使おうとしているグローバル変数が、目的のプログラム以外では使われていないことが必要です。そのため、以下のようにしてください。
目的の函数またはプログラム以外で使われている可能性のないグローバル変数名(普通は2文字以上の変数名)を参照すること。
- 目的のプログラム以外で使われているグローバル変数がある場合は、そのグローバル変数を参照する前にプログラム内にDelVarを記述すること(DelVarでは、ロックされた変数もリンクされた変数も削除されません)。
函数とプログラムとの違い
Program Editorで定義した函数は、TI-Nspire™ Softwareの組み込み関数に似ています。
- 関数は必ず結果を返します。その結果は、グラフ表示もできるし、テーブルに入力することもできます。
プログラムは結果を返しません。
- 函数は式の中で使用できますが、プログラムは式の中で使用できません。例:3・func1(3)は有効ですが、3・prog1(3)は無効です。
- プログラムは、CalculatorおよびNotesでしか実行できません。
しかし函数は、Calculator、Notes、Lists & Spreadsheet、Graphs & Geometry、Data & Statisticsで計算できます。
注:函数へ値を渡す手段として使われる引数は、自動的にローカル変数と見なされます。その他の変数にストアしたい場合は、その変数を函数内でLocalとして宣言しなければなりません。
プログラムから別のプログラムを呼び出す
プログラムは、別のプログラムをサブルーチンとして呼び出すことができます。このサブルーチンは、外部のサブルーチン(別のプログラム)でも、内部のサブルーチン(メイン・プログラム内のプログラム)でも、どちらも可能です。同じコマンド・グループを別の複数の場所で繰り返す必要のある場合はサブルーチンが便利です。
別のプログラムを呼び出す
別のプログラムを呼び出すときは、エントリー・ラインでプログラムを実行するのと同じ構文を使います。
内部サブルーチンの定義と呼び出し
内部サブルーチンを定義するときは、Prgm...EndPrgmと一緒にDefineコマンドを使います。サブルーチンは、先に定義しておかないと呼び出せませんので、メイン・プログラムの先頭に定義するのが常套手段です。
内部サブルーチンを呼び出して実行する方法は、別のプログラムを呼び出して実行するのと同じです。
Define subtest1()=
Prgm
local subtest2 ①
Define subtest2(x,y)= ②
Prgm
Disp x,y
EndPrgm
©Beginning of main program
For i,1,4,1
subtest2(i,I*1000) ③
EndFor
EndPrgm
① サブルーチンをローカル変数として宣言します。
② サブルーチンを定義します。
③ サブルーチンを呼び出します。
注:DefineコマンドおよびPrgm...EndPrgmコマンドを入力するときは、Program Editorの[Var]メニューを使用してください。
サブルーチンを使うときの注意
サブルーチンの最後まで来ると、処理は呼び出し元のプログラムへと戻ります。引数なしのReturnコマンドを使うと、いつでもサブルーチンから抜けることができます。
サブルーチンは、呼び出し元プログラム内で宣言されているローカル変数へはアクセスできません。同じように、呼び出し元プログラムは、サブルーチン内で宣言されているローカル変数へはアクセスできません。
Lblコマンドは、そのLblコマンドの配置されたプログラムでしか意味を持ちません。したがって、呼び出し元プログラム内のGotoコマンドは、サブルーチン内のラベルへ分岐することはできませんし、その逆もできません。
循環定義エラーを避ける
ユーザー定義関数を計算するとき、またはプログラムを実行するときには、その関数の定義またはそのプログラムの作成に使われたのと同じ変数を含む引数を指定することができます。しかし循環定義エラーを避けるためには、関数の計算またはプログラムの実行に使われる変数には値を割り当てなければなりません。例:
x+1→x ①
– または –
For i,i,10,1
Disp i ①
EndFor
① xまたはiに値が割り当てられていない場合は、循環定義エラー・メッセージが出ます。xまたはiに値が割り当てられていれば、このエラーは出ません。
函数またはプログラムのフローを制御する
プログラムを実行するとき、または函数を計算するときには、各プログラム・ラインが順番に実行されます。しかしコマンドでプログラム・フローを変えることができます。例:
- If...EndIfコマンドのような制御構造を用いると、プログラムのどの部分を実行するのかを条件判定に応じて指定できます。
- For...EndForのようなループ・コマンドを使うと、同じコマンド・グループを繰り返すことができます。
If、Lbl、Gotoを使ってプログラム・フローを制御する
IfコマンドおよびIf...EndIfの重層構造を使うと、x>5のような条件判定に応じてステートメントを実行することができます。Lbl(ラベル)コマンドおよびGotoコマンドを使うと、1個の函数内またはプログラム内で別の場所へ分岐したりジャンプしたりできます。
IfコマンドおよびIf...EndIfの重層構造は、Program Editorの[Control]メニューにあります。
If...Then...EndIfのような構造を挿入すると、カーソルの位置にテンプレートが挿入されます。カーソルは、条件判定が入力できる位置に配置されます。
Ifコマンド
条件判定が真のときにコマンドを1つだけ実行するときは、次の一般的な形式を使います。
If x>5
Disp "x is greater than 5" ①
Disp x②
① x>5の場合だけ実行されます。それ以外の場合はスキップされます。
② xの値は毎回表示されます。
この例では、Ifコマンドを実行する前にxに値をストアしなければなりません。
If...Then...EndIf構造
条件判定が真の場合にコマンド・グループを実行するときは、この構造を使います。
If x>5 Then
Disp "x is greater than 5" ①
2・x→x②
EndIf
Disp xÁ
① x>5の場合のみ実行されます。
② 以下の値が表示されます。
2*xの値(x>5の場合)
xの値(x≦5の場合)
注:EndIfは、条件判定が真の場合に実行されるThenブロックの末尾を示します。
If...Then...Else...EndIf構造
条件判定が真の場合と偽の場合とで別々のコマンド・グループを実行するときは、この構造を使います。
If x>5 Then
Disp "x is greater than 5" ①
2・x→x①
Else
Disp "x is less than or equal to 5" ②
5・x→x②
EndIf
Disp x③
① x>5の場合のみ実行されます。
② x≦5の場合のみ実行されます。
③ 以下の値が表示されます。
2*xの値(x>5の場合)
5*xの値(x≦5の場合)
If...Then...ElseIf... EndIf構造
Ifコマンドをもっと複雑に組み合わせると、複数の条件判定ができます。たとえばユーザーの入力した引数が、4つある選択肢の1つに合致するかどうかを判定する場合などに便利です。
選択肢ごとに判定するときは、If...Then...ElseIf...EndIf構造を使ってください。
LblコマンドとGotoコマンド
プログラム・フローは、Lbl(ラベル)コマンドとGotoコマンドでも制御できます。この2つのコマンドは、Program Editorの[Transfers]メニューにあります。
函数またはプログラムの特定の位置にラベルをつける(名前をつける)ときは、Lblコマンドを使います。
Lbl labelName この場所に名前をつけます(命名規則は変数名と同じです)。
Lblコマンドを記述してから函数内またはプログラム内の任意の位置でGotoコマンドを使うと、そのGotoコマンドの位置から、対応するLblコマンドでのところへと分岐します。
GotolabelName どのLblコマンドへ分岐するのかを指定します。
Gotoコマンドは、指定のラベルへ無条件で分岐しますので、条件判定の指定できるようにIfコマンドと組み合わせて使われることが多い。例:
If x>5
Goto GT5 ①
Disp x
--------
-------- ②
Lbl GT5
Disp "The number was > 5"
① x>5の場合は、ラベルGT5へ直接分岐します。
② この例では、x≦5の場合にLbl GT5が実行されないようにするためのコマンド(Stopなど)が必要です。
ループを使ってコマンド・グループを繰り返す
同じコマンド・グループを連続して繰り返すときは、ループ構造のどれかを使います。ループにはいくつかのタイプがあります。ループを抜けるかどうかは条件判定によって決定されますが、その方法はタイプごとに異なります。
Loopコマンドおよびループ関連コマンドは、Program Editorの[Control]メニューおよび[Transfers]メニューにあります。
どれかループ構造を挿入すると、そのテンプレートがカーソルの位置に挿入されます。これで、ループ内で実行するコマンドが入力できるようになります。
For...EndForループ
For...EndForループでは、ループの繰り返す回数を制御する手段としてカウンターを使います。Forコマンドの構文は次のとおりです。
Forvariable, begin, end, increment
① ② ③ ④
① カウンターとして使う変数の名前
② Forループの開始時にvariableに割り当てられる値
③ ループの繰り返されるたびにvariableの現在値と比較される値。variableがendを超えるとループを抜けます。
④ ループの繰り返されるたびにvariableに追加される値(この引数はオプションです。incrementのデフォルト値は1です)。
Forループの繰り返されるたびに、variableの値とendの値とが比較されます。variableがendを超えていない場合は、For...EndForループ内のコマンドが実行され、ループが繰り返されます。それ以外の場合は、EndForの次のコマンドへとジャンプします。
注:一定の回数だけループが繰り返されたあとにループを抜けることができるよう、Forコマンドではカウンター変数が自動的に増えます。
ループの末尾(EndFor)まで来るとForコマンドへと戻って、カウンター変数の増分とendとの比較とが行われます。
例:
For i,0,5,1
Disp i ①
EndFor
Disp i ②
① 0, 1, 2, 3, 4, 5を表示します。
② 6を表示します。variableが6まで増えたときにはループは実行されません。
注:
- variableは、函数またはプログラムの停止後に保存する必要のない場合は、ローカル変数として宣言できます。
- incrementを負数に設定する場合、endはbeginよりも小さな値に設定できます。
While...EndWhileループ
While...EndWhileループは、指定の条件が真である限りコマンド・ブロックを繰り返すループです。Whileコマンドの構文は次のとおりです。
Whilecondition
Whileの実行時にconditionが判定されます。conditionが真の場合はループが実行され、それ以外の場合はEndWhileの次のコマンドへとジャンプします。
注:Whileコマンドでは、条件が自動的に変化することはありません。函数またはプログラムがループを抜けられるコマンドを記述しなければなりません。
ループの末尾(EndWhile)まで来ると、Whileコマンドへ戻って再度条件判定が行われます。
このループを実行するのが初めての場合は、最初は条件が真でなければなりません。
- 条件判定の中で参照される変数は、Whileコマンドよりも先に設定しなければなりません(この変数の値は函数またはプログラムの中に組み込むこともできるし、ユーザーに入力させることもできます)。
- このループには、条件判定に使われる値を変化させる(最終的には偽となる)コマンドが記述されていなければなりません。そうしないと、条件判定は毎回真となって函数もプログラムもループから抜けられません(これを「無限ループ」といいます)。
例:
0→x ①
While x<5
Disp x ②
x+1→x ③
EndWhile
Disp x④
① 最初にxを設定します。
② 0, 1, 2, 3, 4を表示します。
③ xを増やします。
④ 5を表示します。xが5まで増えたときにはループは実行されません。
Loop...EndLoopループ
Loop...EndLoopは無限ループですので、際限なく繰り返されます。Loopコマンドに引数はありません。
普通は、ループを抜けるためのコマンドをループに挿入しておきます。よく使われコマンドは、If、Exit、Goto、Lbl(ラベル)です。例:
0→x
Loop
Disp x
x+1→x
If x>5①
Exit
EndLoop
Disp x ②
① Ifコマンドで条件を判定します。
② xが6まで増えたときにループを抜けてこの場所へジャンプします。
注:Exitコマンドは、現行ループから抜けるためのコマンドです。
この例では、Ifコマンドはループのどこにあってもかまいません。
Ifコマンドの位置 |
ループの実行 |
ループの先頭 |
条件が真と判定された場合のみ実行されます。
|
ループの末尾 |
最低1回は実行され、条件が真と判定された場合のみ繰り返されます。 |
IfコマンドにGotoコマンドを使って、指定のLbl(ラベル)コマンドへとジャンプさせることもできます。
ループの途中でループの先頭へ戻ってループを繰り返す
Cycleコマンドは、現在のループの末尾に達する前に即座にループの先頭へ戻って次のサイクルを始めるためのコマンドです。このコマンドは、For...EndFor、While...EndWhile、Loop...EndLoopで使用できます。
LblとGotoとによるループ
Lbl(ラベル)コマンドおよびGotoコマンドは厳密にはループコマンドではありませんが、無限ループを作るのに使用できます。例:
Loop...EndLoopと同様、このループにも、函数またはプログラムがループを抜けられるようにするためのコマンドが必要です。
モード設定を変更する
特定の計算モードまたは結果モードに一時的に設定する手段として、函数およびプログラムにsetMode()関数を使用することができます。Program Editorの[Mode]メニューを使えば、数値コードを覚えていなくても簡単に正しい構文で入力できます。
注:函数またはプログラムの定義の中でモードを変更しても、その函数またはプログラムの外部には影響しません。
モードを設定する
1. setMode函数を挿入する場所にカーソルを置きます。
2. [Mode]メニューを開き、変更するモードをクリックし、新しい設定をクリックします。
カーソルの位置に正しい構文が挿入されます。例:
setMode(1,3)
プログラムのデバッギングとエラーの処理
函数またはプログラムを記述したあと、いくつかの手法を使ってエラーの発見と修正ができます。エラー・ハンドリング・コマンドを函数またはプログラム自体の中に組み込むこともできます。
いくつかのオプションの中からユーザーに選択させるような函数またはプログラムの場合は、必ずすべてのオプションを実行して試験してください。
デバッギング手法
ランタイム・エラー・メッセージは、構文エラーは発見できますが、プログラム・ロジックのエラーは発見できません。以下の手法が重宝するでしょう。
- 重要な変数の値を表示する手段として、Dispコマンドを一時的に挿入する。
- ループが適正回数だけ実行されることを確認する手段として、カウンター変数か条件判定の値かいずれかをDispコマンドで表示する。
- サブルーチンが実行されていることを確認する手段として、サブルーチンの先頭と末尾とにDispコマンドを使って、“Entering subroutine”、“Exiting subroutine”のようなメッセージを表示する。
- プログラムまたは函数を手動で停止するときは次のようにします。
- Windows®:F12キーを押したままEnterキーを繰り返し押す。
- Mac®:F5キーを押したままEnterキーを繰り返し押す。
- ハンドヘルド:[☖on]キーを押したまま[enter]を繰り返し押す。
エラー・ハンドリング・コマンド
コマンド |
説明 |
Try...EndTry |
函数またはプログラムにコマンドを実行させて、そのコマンドによって生成されたエラーから必要に応じて正常な状態へ戻すことのできるブロックを定義します。 |
ClrErr |
エラー・ステータスを消去して、システム変数errCodeをゼロに設定します。errCodeの使用例については『リファレンス・ガイド』のTryコマンドを見てください。 |
PassErr |
エラーをTry...EndTryブロックの次のレベルへを渡します。 |