(01/22)Program Editor入門
Calculatorアプリケーションのエントリー・ラインに定義ステートメントを入力するかProgram Editorを使うかすれば、ユーザー定義の函数またはプログラムが作成できます。Program Editorのほうが便利ですので、このセクションではProgram Editorを取り上げます。函数およびプログラムをCalculatorアプリケーションで定義する方法について詳しくは「Calculator」を見てください。
- Program Editorにはプログラミング用のテンプレートとダイアログ・ボックスとが用意してありますので、それを使えば正しい構文で函数およびプログラムが定義できます。
- Program Editorでは、特殊なキー操作で1行1行を追加しなくても、複数行のプログラミング・ステートメントが入力できます。
- プライベート、パブリックのどちらのライブラリー・オブジェクト(変数、函数、プログラム)も簡単に作成できます。詳しくは「ライブラリー」を見てください。
Program Editorを起動する
▶ 現在開いているプロブレム内に新たにProgram Editorページを追加するときは次のようにします。
ツールバーから[Insert]>[Program Editor]>[New]の順にクリックする。
ハンドヘルド:を押してから[Insert]>[Program Editor]>[New]の順に選択する。
注:Program Editorは、Calculatorページの[Functions & Programs]メニューからもアクセスできます。
① [Program Editor]メニュー:このメニューは、Normalビュー・モードでProgram Editorのワーク・エリアを開いているときにはいつでも利用できます。
② Program Editorのワーク・エリア
③ ステータス・ライン:行番号と、編集中の函数またはプログラムの名前とが表示されます。アスタリスク(*)は、函数に変更が加えられたのにまだ保存が済んでいないという意味です。
(02/22)プログラムまたは函数を定義する
新たにProgram Editorを開始する
- プログラムまたは函数を作成するドキュメントおよびプロブレムを開いてください。
- アプリケーション・ツールバーの[Insert]ボタン()をクリックし、[Program Editor]>[New]の順に選択します(ハンドヘルドの場合は、を押してから[Insert]>[Program Editor]>[New]の順に選択します)。
- これから定義する函数またはプログラムの名前を入力します。
- [Type]を選択します([Program]、[Function]のどちらか)。
- 以下のように[Library Access]を設定します。
- 現在開いているドキュメントおよびプロブレムからしか使用しない函数またはプログラムを定義する場合は[None]を選択します。
- どのドキュメントからもアクセスはできるが[Catalog]には表示されない函数またはプログラムを定義するときは、[LibPriv]を選択します。
- どのドキュメントからもアクセスできて、しかも[Catalog]に表示される函数またはプログラムを定義するときは、[LibPub (Show in Catalog)]を選択します。詳しくは「ライブラリー」を見てください。
- [OK]をクリックします。
新たにProgram Editorページが開きます。設定に応じて最初からテンプレートが入力してあります。
函数またはプログラムに行を入力する
Program Editorでは、入力したコマンドは実行されませんし、入力した式も計算されません。入力したコマンドおよび式が実行もしくは計算されるのは、当の函数またはプログラムを実行したときだけです。
- FuncとEndFuncとの間(またはPrgmとEndPrgmとの間)に函数またはプログラムを記述します。
- 函数名およびコマンド名は、キーボードからも入力できるし、[Catalog]から選んで挿入することもできます。
- 1行が長すぎて画面に収まりきらない場合は、横にスクロールすれば全体を見ることが可能です。
- 1行入力し終えるとごにEnterキーを押してください。そうすると、空の行が新たに挿入されますので、続けて別の行が入力できます。
- ◄、►、▲、▼の各矢印キーを使って画面を移動しながら、コマンドの入力、編集を行ってください。
コメントを入力する
コメント記号(©)を使うと注釈が入力できます。コメントは、第三者がそのプログラムを見る場合や編集する場合に役立ちます。コメントは、プログラムの実行時には表示されませんし、プログラムの流れにも影響はしません。
① 必要な構文をコメントで示しています。このライブラリー・オブジェクトはパブリック・オブジェクトであり、しかもFuncブロックまたはPrgmブロックの先頭行であるため、このコメントはヘルプとして[Catalog]に表示されます。詳しくは「ライブラリー」を見てください。
コメントを挿入するには:
- コメントを挿入する行の末尾にカーソルを置きます。
- [Actions]メニューから[Insert Comment]をクリックします。
- ©記号のうしろにコメントを入力します。
構文を確認する
Program Editorでは、函数またはプログラムの構文が正しいかどうかが確認できます。
▶ [Check Syntax & Store]メニューから[Check Syntax]をクリックします。
構文エラーが見つかった場合は、エラー・メッセージが表示され、訂正しやすいように最初のエラーの近くにカーソルが配置されます。
函数またはプログラムを保存する
函数もプログラムも、保存してからでないと利用できません。Program Editorでは、保存の前に構文が自動的に確認されます。
函数またはプログラムがまだ保存されていない場合は、Program Editorの左上にアスタリスク(*)が表示されます。
▶ [Check Syntax & Store]メニューから[Check Syntax & Store]をクリックします。
何か構文エラーが見つかった場合は、エラー・メッセージが表示され、最初のエラーの近くにカーソルが配置されます。
構文エラーが見つからなかった場合は、Program Editorの一番上のステータス・ラインに“Stored successfully”というメッセージが表示されます。
注:函数またはプログラムをライブラリー・オブジェクトとして定義する場合は、当のドキュメントを指定のライブラリー・フォルダーに保存したうえでライブラリーをリフレッシュしなければなりません。そうしないと、そのライブラリー・オブジェクトは他のドキュメントからはアクセスできません。詳しくは「ライブラリー」を見てください。
(03/22)プログラムまたは函数を表示する
- [Actions]メニューから[View]をクリックします。
- 目的の函数またはプログラムがライブラリー・オブジェクトである場合は、[Location]リストからそのライブラリーを選択します。
- [Name]リストから函数またはプログラムの名前を選択します。
選択した函数またはプログラムがビューアーに表示されます。
- 矢印キーでスクロールしながら、表示した函数またはプログラムを見てください。
- プログラムを編集する場合はをクリックします。
ハンドヘルド:を押してを強調表示してからを押します。
注:が選択できるのは、現在開いているプロブレムで定義した函数およびプログラムに限ります。ライブラリー・オブジェクトを編集するときは、最初にそのライブラリー・ドキュメントを開かなければなりません。
(04/22)函数またはプログラムを開いて編集する
函数もプログラムも、現在開いているプロブレムからしか開けません。
注:ロックのかかったプログラムおよび函数は変更できません。オブジェクトのロックを解除するときは、Calculatorページに移動してunLockコマンドを使ってください。
- 利用できる函数およびプログラムのリストを表示します。
- [Actions]メニューから[Open]をクリックします。
- 目的の項目をクリックして開きます。
(05/22)ライブラリーからプログラムをインポートする
ライブラリー・オブジェクトとして定義された函数もプログラムも、現在開いているプロブレム内のProgram Editorにインポートすることができます。たとえ元のオブジェクトがロックされていても、インポートされたコピーはロックされません。
- [Actions]メニューから[Import]をクリックします。
- [Library Name]リストからライブラリー名を選択します。
- [Name]リストからオブジェクト名を選択します。
- インポートするオブジェクトに別の名前をつける場合は、[Import As]フィールドに名前を入力してください。
(06/22)函数またはプログラムのコピーを作成する
函数またはプログラムを新たに作成する場合は、すでにあるものをコピーしてそれを変更するほうが簡単なことがあります。たとえ元のオブジェクトがロックされていても、作成したコピーはロックされません。
- [Actions]メニューから[Create Copy]をクリックします。
- 新しい名前を入力します。提案された名前のままでよければ[OK]をクリックします。
- アクセス・レベルを変更する場合は、[Library Access]リストを開いて目的のレベルを選択します。
(07/22)プログラムまたは函数の名前を変更する
現在開いている函数またはプログラムは名前が変更できます。アクセス・レベルの変更も可能です。
- [Actions]メニューから[Rename]をクリックします。
- 新しい名前を入力します。提案された名前のままでよければ[OK]をクリックします。
- アクセス・レベルを変更する場合は、[Library Access]リストを開いて目的のレベルを選択します。
(08/22)ライブラリー・アクセス・レベルを変更する
- [Actions]メニューから[Change Library Access]をクリックします。
- 以下のように[Library Access]を設定します。
- 現在開いているCalculatorプロブレムからしか使用しない函数またはプログラムを定義する場合は[None]を選択します。
- どのドキュメントからもアクセスはできるが[Catalog]には表示されない函数またはプログラムを定義するときは、[LibPriv]を選択します。
- どのドキュメントからもアクセスできて、しかも[Catalog]に表示される函数またはプログラムを定義するときは、[LibPub]を選択します。
(09/22)テキストを検索する
- [Actions]メニューから[Find]をクリックします。
- 検索するテキストを入力し、[OK]をクリックします。
- 見つかった場合は、プログラム内でそのテキストが強調表示されます。
- 見つからなかった場合は、通知メッセージが表示されます。
(10/22)テキストの検索と置換
- [Actions]メニューから[Find and Replace]をクリックします。
- 検索するテキストを入力します。
- 置換後のテキストを入力します。
- [Replace]をクリックすると、カーソルよりうしろで最初に見つかったテキストが置換されます。
—別の方法—
[Replace All]をクリックすると、見つかったテキストが全箇所で置換されます。
注:mathテンプレート内で検索テキストが見つかった場合は、見つかったテキストだけではなくテンプレート全体が置換されるという警告が表示されます。
(11/22)現在開いている函数またはプログラムを閉じる
▶ [Actions]メニューから[Close]をクリックします。
変更した内容がまだ保存されていなかった場合は、閉じる前に構文を確認して保存するよう指示が出ます。
(12/22)プログラムの実行と函数の計算
函数またはプログラムは、定義して保存してしまえば、任意のアプリケーションで使用できます。函数はどのアプリケーションでも計算できますが、プログラムはCalculatorおよびNotesでしか実行できません。
プログラム・ステートメントは上から順に実行されます(ただしプログラムの実行順序を変えるコマンドもあります)。出力がある場合は、当該アプリケーションのワーク・エリアに表示されます。
- プログラムの実行は、最後のステートメントかStopコマンドかいずれかに達するまで続けられます。
- 函数の実行は、Returnコマンドに達するまで続けられます。
- プログラムまたは函数を手動で停止するときは次のようにします。
- Windows®:F12キーを押したままEnterキーを何度も押します。
- Mac®:F5キーを押したままEnterキーを何度も押します。
- ハンドヘルド:キーを押したままを何度も押します。
短い名前、長い名前を使う
オブジェクトを定義したのと同じプロブレムを開いているときはいつでも、短い名前を入力することでそのオブジェクトへアクセスできます(「短い名前」とは、Defineコマンドで指定した名前のことです)。プライベート・オブジェクト、パブリック・オブジェクト、ライブラリー以外のオブジェクトなど、定義済みのオブジェクトはすべて、この方法でアクセスできます。
「長い名前」を入力すれば、どのドキュメントからでもそのライブラリー・オブジェクトへアクセスできます。「長い名前」は、<オブジェクトのライブラリー・ドキュメント名>\<オブジェクト名>という構造をしています。たとえばライブラリー・ドキュメントlib1の中でfunc1として定義したオブジェクトの「長い名前」はlib1\func1です。ハンドヘルドで“\”を入力するときはの順に押してください。
注:正確な名前が思い出せない場合、またはプライベート・ライブラリー・オブジェクトに必要な引数の順番が思い出せない場合は、当のライブラリー・ドキュメントを開くかProgram Editorを使うかすれば、そのオブジェクトの内容を見ることができます。getVarInfoを使えば、同じライブラリーに含まれているオブジェクトのリストを見ることができます。
パブリック・ライブラリー函数またはパブリック・ライブラリー・プログラムを使う
- 当該オブジェクトがドキュメントの先頭のプロブレム内で定義済みであること、そのオブジェクトが保存済みであること、そのオブジェクトがMyLibフォルダーに保存済みであること、ライブラリーがリフレッシュ済みであることを確認します。
- 目的の函数またはプログラムを実行するアプリケーションを開きます。
注:函数はどのアプリケーションでも計算できますが、プログラムはCalculatorおよびNotesでしか実行できません。
- [Catalog]を開き、[Libraries]タブを使って目的のオブジェクトを見つけて挿入します。
—別の方法—
オブジェクト名を入力します。函数、プログラムのいずれの場合も、そのオブジェクト名のうしろに必ず括弧をつけてください。
------------------------------------
libs2\func1()
------------------------------------
- 引数を指定する必要のあるプログラムの場合は、括弧内に値または変数名を入力します。
------------------------------------
libs2\func1(34,power)
------------------------------------
5. を押します。
プライベート・ライブラリー函数またはプライベート・ライブラリー・プログラムを使う
プライベート・ライブラリー・オブジェクトを使うためには、その「長い名前」を知る必要があります。たとえばライブラリー・ドキュメントlib1の中でfunc1として定義してオブジェクトの「長い名前」はlib1\func1です。
注:正確な名前が思い出せない場合、またはプライベート・ライブラリー・オブジェクトに必要な引数の順番が思い出せない場合は、当のライブラリー・ドキュメントを開くかProgram Editorを使うかすれば、そのオブジェクトの内容を見ることができます。
- 当該オブジェクトがドキュメントの先頭のプロブレム内で定義済みであること、そのオブジェクトがストア済みであること、そのオブジェクトがMyLibフォルダーに保存済みであること、ライブラリーがリフレッシュ済みであることを確認します。
- 目的の函数またはプログラムを実行するアプリケーションを開きます。
注:函数はどのアプリケーションでも計算できますが、プログラムはCalculatorおよびNotesでしか実行できません。
- オブジェクト名を入力します。函数、プログラムのいずれの場合も、そのオブジェクト名のうしろに必ず括弧をつけてください。
--------------------------------------
libs2\func1()
--------------------------------------
- 引数を指定する必要のあるオブジェクトの場合は、括弧内に値または変数名を入力します。
--------------------------------------
libs2\func1(34,power)
--------------------------------------
- を押します。
ライブラリーではないプログラムまたは函数を実行する
—別の方法—
を押してリストから名前を選択します。
函数またはプログラム名前のうしろには必ず括弧をつけなければなりません。
-----------------------------------------
prog1()
-----------------------------------------
引数を指定する必要のある函数またはプログラムの場合は、括弧内に値または変数名を入力します。
-----------------------------------------
prog1(34,power)
-----------------------------------------
- を押します。
実行中のプログラムを止める
函数またはプログラムの実行中は、ビジー・ポインターが表示されます。
▶ 函数またはプログラムを止めるときは次のようにします。
- Windows®:F12キーを押したままEnterキーを何度も押します。
- Mac®:F5キーを押したままEnterキーを何度も押します。
- ハンドヘルド:キーを押したままを何度も押します。
メッセージが表示されます。停止した函数またはプログラムをProgram Editorで編集するときは、[Go To]を選択します。停止したコマンドのところにカーソルが現れます。
(13/22)プログラムに値を入力する
函数またはプログラムの計算に使用する値を入力する方法はいくつかあります。
プログラムまたは函数の中に最初から値を入力しておく
この方法が便利なのは、目的のプログラムまたは函数を使用するときに毎回同じ値でなければならない場合です。
- プログラムを定義します。
-----------------------------------------
Define calculatearea()=
Prgm
w:=3
h:=23.64
area:=w*h
EndPrgm
-----------------------------------------
- プログラムを実行します。
-----------------------------------------
calculatearea()
:area 70.92
-----------------------------------------
変数への値の代入をユーザーに実行してもらう
プログラムも函数も、事前に作成された変数が参照できます。この方法は、ユーザーが変数名を覚えていることが必要であり、さらに目的のオブジェクトを使用する前にその変数に値を入力することも必要です。
- プログラムを定義します。
-----------------------------------------
Define calculatearea()=
Prgm
area:=w*h
EndPrgm
-----------------------------------------
- 先に変数に値を入力してからプログラムを実行します。
-----------------------------------------
w:=3 :h:=23.64
calculatearea()
:area 70.92
-----------------------------------------
ユーザーに引数として値を入力してもらう
この方法では、プログラムか函数かいずれかを呼び出す式の引数としての値をユーザーが入力します。
下のプログラムvolcylは円筒(cylinder)の体積を計算するものです。ユーザーは、円筒のheightおよびradiusという2つの値を入力しなければなりません。
- プログラムvolcylを定義します。
-----------------------------------------
Definevolcyl(height,radius) =
Prgm
Disp "Volume =", approx(π・radius^2・height)
EndPrgm
-----------------------------------------
- プログラムを実行すると、高さ34 mm、半径5 mmの円筒の体積が表示されます。
-----------------------------------------
volcyl(34,5) Volume = 534.071
-----------------------------------------
注:プログラムvolcylを実行するときはパラメーター名を使用する必要はありませんが、値、変数、式のいずれかとして引数を2つ入力しなければなりません。その場合、先頭のパラメーターはheight(高さ)、2番目のパラメーターはradius(半径)でなければなりません。
値を入力するようユーザーに要求する(プログラムのみ)
プログラムの中でRequestコマンドおよびRequestStrコマンドを使用すると、プログラムが一時停止し、データの入力をユーザーに要求するダイアログ・ボックスが表示できます。この方法であれば、変数名も変数の順序も覚えている必要はありません。
Request、RequestStrのどちらもコマンドも函数には使用できません。
- プログラムを定義します。
-----------------------------------------
Define calculatearea()=
Prgm
Request "Width:",w
Request "Height:",h
area:=w*h
EndPrgm
-----------------------------------------
- プログラムを実行し、プログラムからの要求に従います。
-----------------------------------------
calculatearea() :area
Width:3
Height:23.64
70.92
-----------------------------------------
ユーザーの入力した内容が数式ではなく文字列であるとプログラムに解釈させたい場合は、Requestの代わりにRequestStrを使用してください。こうすれば、入力する内容を引用符("")で括る必要がありません。
(14/22)函数またはプログラムの途中の実行結果を表示する
函数もプログラムも、途中の実行結果を表示するためのコマンドを記述した場合を除き、途中の実行結果は表示しません。この仕組みは、エントリー・ラインで計算する場合と、函数またはプログラムの中で実行する場合との重要な違いの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
...
-----------------------------------------
(15/22)ローカル変数を使う
ローカル変数とは、ユーザー定義函数の計算中のみ、またはユーザー定義プログラムの実行中にのみ存在する一時的な変数のことです。
ローカル変数の例
下にプログラムの一部として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では、ロックされた変数もリンクされた変数も削除されません)。
(16/22)函数とプログラムとの違い
Program Editorで定義した函数は、TI-Nspireの組み込み函数に似ています。
- 函数は必ず結果を返します。その結果は、グラフ表示もできるし、テーブルに入力することもできます。プログラムは結果を返しません。
- 函数は式の中で使用できますが、プログラムは式の中で使用できません。例:3・func1(3)は有効ですが、3・prog1(3)は無効です。
- プログラムは、CalculatorおよびNotesでしか実行できません。しかし函数は、Calculator、Notes、Lists & Spreadsheet、Graphs & Geometry、Data & Statisticsで計算できます。
注:函数へ値を渡す手段として使われる引数は、自動的にローカル変数と見なされます。その他の変数に値を保存したい場合は、その変数を函数内でLocal変数として宣言しなければなりません。
(17/22)プログラムから別のプログラムを呼び出す
プログラムは、別のプログラムをサブルーチンとして呼び出すことができます。このサブルーチンは、外部のサブルーチン(別のプログラム)でも、内部のサブルーチン(メイン・プログラム内のプログラム)でも、どちらも可能です。同じコマンド・グループを別の複数の場所で繰り返す必要のある場合はサブルーチンが便利です。
別のプログラムを呼び出す
別のプログラムを呼び出すときは、エントリー・ラインでプログラムを実行するのと同じ構文を使います。
内部サブルーチンの定義と呼び出し
内部サブルーチンを定義するときは、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コマンドは、サブルーチン内のラベルへ分岐することはできませんし、その逆もできません。
循環定義エラー(Circular-Definition Error)を避ける
ユーザー定義函数を計算するとき、またはプログラムを実行するときには、その函数の定義またはそのプログラムの作成に使われたのと同じ変数を含む引数を指定することができます。しかし循環定義エラーを避けるためには、函数の計算またはプログラムの実行に使われる変数には値を割り当てなければなりません。例:
-----------------------------------
x+1→x ①
-----------------------------------
– または –
-----------------------------------
For i,i,10,1
Disp i ①
EndFor
-----------------------------------
① xまたはiに値が割り当てられていない場合は、循環定義エラー・メッセージが出ます。xまたはiに値が割り当てられていれば、このエラーは出ません。
(18/22)函数またはプログラムのフローを制御する
プログラムを実行するとき、または函数を計算するときには、各プログラム行は順番に実行されます。しかしプログラム・フローを変更するコマンドもあります。
例:
- If...EndIfコマンドのような制御構造は、プログラムのどの部分を実行するのかを条件判定(conditional test)に従って指定する働きをします。
- For...EndForのようなループ・コマンドは、コマンド・グループを繰り返し実行する働きをします。
(19/22)If、Lbl、Gotoを使ってプログラム・フローを制御する
IfコマンドおよびさまざまなIf...EndIf構造を使うと、x>5のような条件判定に応じてステートメント(1行でも複数行まとめてでも可)を実行することができます。Lbl(ラベル)コマンドおよびGotoコマンドを使うと、1個の函数内またはプログラム内で別の場所へ分岐したりジャンプしたりできます。
IfコマンドおよびさまざまなIf...EndIf構造は、Program Editorの[Control]メニューにあります。
If...Then...EndIfのような構造を挿入すると、カーソルの位置にテンプレートが挿入されます。カーソルは、条件判定の入力できる位置に配置されます。
Ifコマンド
条件判定が真(true)のときにコマンドを1つだけ実行するときは、次の一般的な形式を使います。
-----------------------------------
If x>5
Disp "x is greater than 5" ①
Disp x ②
-----------------------------------
① x>5の場合だけ実行されます。それ以外の場合はスキップされます。
② xの値が毎回表示されます。
この例では、Ifコマンドを実行する前にxに値を保存しなければなりません。
If...Then...EndIf構造
条件判定が真(ture)の場合にコマンド・グループを実行するときは、この構造を使います。
-----------------------------------
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は、条件判定が真(ture)の場合に実行されるThenブロックの末尾を示します。
If...Then...Else...EndIf構造
条件判定が真(ture)の場合と偽(false)の場合とで別々のコマンド・グループを実行するときは、この構造を使います。
-----------------------------------
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つに合致するかどうかを判定する場合などに便利です。
選択肢ごとに判定するときは2、If...Then...ElseIf...EndIf構造を使ってください。
LblコマンドとGotoコマンド
プログラム・フローは、Lbl(ラベル)コマンドとGotoコマンドでも制御できます。この2つのコマンドは、Program Editorの[Transfers]メニューにあります。
Lblコマンドを使うと、函数またはプログラムの特定の位置にラベルをつける(名前をつける)ことができます。
- Lbl <ラベル名>(場所に名前をつけます(命名規則は変数名と同じです))
Lblコマンドを記述してから函数内またはプログラム内の任意の位置でGotoコマンドを使うと、そのGotoコマンドの位置から、対応するLblコマンドでのところへと分岐します。
- Goto <ラベル名>(どの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など)が必要です。
(20/22)ループを使ってコマンド・グループを繰り返す
同じコマンド・グループを連続して繰り返すときは、ループ構造のどれかを使います。ループにはいくつかのタイプがあります。ループを抜けるかどうかは条件判定によって決定されますが、その方法はタイプごとに異なります。
Loopコマンドおよびループ関連のコマンドは、Program Editorの[Control]メニューおよび[Transfers]メニューにあります。
どれかループ構造を挿入すると、そのテンプレートがカーソルの位置に挿入されます。これで、ループ内で実行されるコマンドが入力できるようになります。
For...EndForループ
For...EndForループでは、ループの繰り返される回数を数えるためのカウンターが使われます。Forコマンドの構文は次のとおりです。
For <変数>, <開始値>, <終了値>, <増分>
① ② ③ ④
① カウンターとして使う変数の名前
② Forループの開始時に<変数>に割り当てられる値
③ ループの繰り返されるたびに<変数>の現在値と比較される値。<変数>が<終了値>を超えるとループが終了します。
④ ループの繰り返されるたびに<変数>に追加される値(この引数はオプションです。<増分>のデフォルト値は1です)。
Forループの繰り返されるたびに、<変数>の値と<終了値>の値とが比較されます。<変数>が<終了値>を超えていない場合は、For...EndForループ内のコマンドが実行され、ループが繰り返されます。それ以外の場合は、EndForの次のコマンドへとジャンプします。
注:一定の回数だけループが繰り返されたあとにループを抜けることができるよう、Forコマンドではカウンター変数が自動的に増えます。
ループの末尾(EndFor)まで来るとForコマンドのところへと戻って、カウンター変数が増分され、<終了値>との比較とが行われます。
例:
--------------------------------------
For i,0,5,1
Disp i ①
EndFor
Disp i ②
--------------------------------------
① 0, 1, 2, 3, 4, 5を表示します。
② 6を表示します。<変数>が6まで増えたときにはループは実行されません。
注:
While...EndWhileループ
While...EndWhileループでは、指定の条件が真(ture)である限りコマンド・ブロックが繰り返されます。Whileコマンドの構文は次のとおりです。
While <条件>
Whileの実行時に<条件>が判定されます。<条件>が真(ture)の場合はループが実行され、それ以外の場合はEndWhileの次のコマンドへとジャンプします。
注:Whileコマンドでは、条件が自動的に変化することはありません。函数またはプログラムがループを抜けられるコマンドを記述しなければなりません。
ループの末尾(EndWhile)まで来ると、Whileコマンドのところへと戻って再度条件判定が行われます。
ループを初めて実行するときは、条件は最初に真でなければなりません。
- 条件判定の中で参照される変数は、Whileコマンドよりも先に設定しなければなりません(この変数の値は函数またはプログラムの中に組み込むこともできるし、ユーザーに入力させることもできます)。
- このループには、条件判定に使われる値を変化させる(最終的に偽(false)となる)コマンドが記述されていなければなりません。そうしないと、条件判定は毎回真となって函数もプログラムもループから抜けられません(これを「無限ループ」といいます)。
例:
------------------------------------------
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コマンドの位置 |
ループの実行 |
ループの先頭 |
条件が真(ture)と判定された場合のみ実行されます。
|
ループの末尾 |
最低1回は実行され、条件が真(ture)と判定された場合のみ繰り返されます。 |
IfコマンドにGotoコマンドを使って、指定のLbl(ラベル)コマンドへとジャンプさせることもできます。
ループの途中でループの先頭へ戻ってループを繰り返す(Cycleコマンド)
Cycleコマンドは、現在のループの末尾に達する前に即座にループの先頭へ戻って次の繰り返しを始めるためのコマンドです。このコマンドは、For...EndFor、While...EndWhile、Loop...EndLoopと組み合わせて使用できます。
LblとGotoとによるループ
Lbl(ラベル)コマンドおよびGotoコマンドは厳密にはループ・コマンドではありませんが、無限ループを作るのに使用できます。例:
Loop...EndLoopと同様、このループにも、函数またはプログラムがループを抜けられるようにするためのコマンドが必要です。
(21/22)モード設定を変更する(setMode)
函数およびプログラムでsetMode()函数を使うと、特定の計算モードまたは特定の結果モードに一時的に設定することができます。Program Editorの[Mode]メニューを使うと、数値コードを覚えていなくても簡単に正しい構文で入力できます。
注:函数またはプログラムの定義内でモードを変更しても、その函数またはプログラムの外部には影響しません。
モードを設定する
- setMode函数を挿入する場所にカーソルを置きます。
- [Mode]メニューから、変更するモードをクリックし、新しい設定をクリックします。
カーソルの位置に正しい構文が挿入されます。例:
--------------------------------------------
setMode(1,3)
--------------------------------------------
(22/22)プログラムのデバッギングとエラーの処理
函数またはプログラムを記述したあと、いくつかの手法を使ってエラーの発見と修正ができます。エラー・ハンドリング・コマンドを函数またはプログラム自体の中に組み込むこともできます。
いくつかのオプションの中からユーザーに選択させるような函数またはプログラムの場合は、必ずその函数またはプログラムを実行して各オプションを試験してください。
デバッギング手法
ランタイム・エラー・メッセージは、構文エラーは発見できますが、プログラム・ロジックのエラーは発見できません。以下の手法が重宝するでしょう。
- Dispコマンドを一時的に挿入して、重要な変数の値を表示する。
- ループが適正回数だけ実行されることを確認する手段として、カウンター変数か条件判定の値かいずれかをDispコマンドで表示する。
- サブルーチンが実行されたかどうかを確認する手段として、サブルーチンの先頭と末尾とにDispコマンドを記述し、“Entering subroutine(サブルーチンに入った)”、“Exiting subroutine(サブルーチンが終了した)”のようなメッセージを表示する。
- プログラムまたは函数を手動で停止するときは次のようにします。
- Windows®:F12キーを押したままEnterキーを何度も押します。
- Mac®:F5キーを押したままEnterキーを何度も押します。
- ハンドヘルド:キーを押したままを何度も押します。
エラー・ハンドリング・コマンド
コマンド |
説明 |
Try...EndTry |
Try...EndTryブロック内に記述されたコマンドにエラーが発生しても、函数またはプログラムの実行は続けられます。 |
ClrErr |
エラー・ステータスを消去して、システム変数errCodeをゼロに設定します。errCodeの使用例については『リファレンス・ガイド』のTryコマンドを見てください。 |
PassErr |
エラーをTry...EndTryブロックの次のレベルへを渡します。 |