電卓でプログラムを書くというのはどういうことでしょうか?
これは一連の計算手順(キー操作)を電卓に記憶させておくことで、同じ計算を効率的に繰り返せるというものです。
またまた簡単な例です。直径が変わると円の面積がどう変わるかを計算します。円の面積は「半径×半径×π」でした。
直径を 5とすると、「(5÷2)2 × π」ですね。計算手順を確認するために、まずHP電卓で計算します。なおキー操作は32SUのものです。お使いのHP電卓に合わせて読み替えてください。
![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ・・・ | 【式1】 |
あるいは
![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ・・・ | 【式2】 |
HP電卓では多くの場合、計算手順はひとつではありません。【式2】はスタックを意識した操作で、"5"を"2"で割った次の で、Xスタックの内容が Yスタックにコピーされます。次の
でX、Yスタックを掛けて2乗をとっています。どちらでも同じ結果が得られます。
直径の値がいろいろ変わったときに、上記の計算を繰り返すのも面倒です。同じ手順で引数だけが違うわけですから、プログラムを組んでしまいましょう。
HP電卓の魅力のひとつは「プログラムが簡単に書けること」です。なにしろ普通に計算するそのままにキーを押していけばいいのですから。
【式1】で、直径 5がいろいろ変わるわけですから、"5"を入力したあとの計算手順をプログラムして(記憶させて)おきます。
ちなみにこの手順を "日本語で" 書くと「(半径を)2で割って、2乗して、π を掛ける」となります。
キーイン | 内 容 | |
---|---|---|
1. | ![]() ![]() | プログラム入力モードに入る |
2. | ![]() ![]() ![]() | このプログラムに"A"という名前(ラベル)をつけます |
3. | ![]() |
以下は手動計算の手順をそのままキーインします。ただしふたつの数値を区切る必要がないので、ENTERは不要です。先ほどの "日本語の" 計算手順そのままにキーを押せばよいのです。 「(半径を)2で割って、2乗して、π を掛ける」 |
4. | ![]() |
|
5. | ![]() ![]() | |
6. | ![]() ![]() | |
7. | ![]() | |
8. | ![]() ![]() | プログラムの終わり |
9. | ![]() | プログラム入力モードを抜ける |
「プログラムにラベルをつける」、「プログラム終わり」以外の手順は、実際の手計算と同じなのがおわかりだと思います。実際の計算手順(しかも日本語で思考した)をそのまま電卓に覚えさせておく。この容易さがHP電卓の魅力でもあります。
では実際にこのプログラムを実行させてみましょう。このプログラムを実行するには、引数である半径をキーインしてから実行(EXECUTE)キーを押し、プログラムのラベル "A"を指定します。
つまり直径が"3"だとすると、
とキーインすれば結果が表示されます。
は直径、
は「プログラム"A"を実行せよ」ということです。
直径が"8"なら
です。この要領で直径とプログラム名をキーインすれば、何度でも繰り返し計算ができます。
プログラムは独立したものをいくつも定義しておくことができますし、プログラムから他のプログラムを呼び出す(サブルーチン)ことも、条件分岐やいわゆるインデックス・レジスタを使った処理もできます。
またプログラムの途中で一時停止させたり、入力を促したりする処理もできます(後述の『対話型プログラム』で説明します)。もちろん編集や変更も簡単です。
という計算は、オーディオ回路の設計では頻繁に使います。これもプログラムしておけば、CとRの値を入力して実行させるだけで、何度でも数値を換えて計算できます。
プログラムは、
1. | ![]() ![]() | プログラム入力モード |
2. | ![]() ![]() ![]() | プログラム名は"B"としました |
3. | ![]() | ふたつの引き数をまず掛けて・・・ |
4. | ![]() | 「2」を |
5. | ![]() | 掛けて |
6. | ![]() ![]() | 「π」を |
7. | ![]() | 掛けて |
8. | ![]() | 逆数をとって |
9. | ![]() ![]() | オシマイ |
10. | ![]() | プログラム入力モードを抜ける |
です。
実行するのも簡単で、ふたつの引き数を入力してスタックに積んでから、プログラム名を指定します。
R=10kΩ、C=100pFだとすると、
1. | ![]() ![]() | ||
2. | ![]() | -------- | 指数入力キー |
3. | ![]() | -------- | E3で103、つまり10×103 = 10kΩ |
4. | ![]() | ||
5. | ![]() ![]() ![]() | ||
6. | ![]() | ||
7. | ![]() ![]() | ||
8. | ![]() | -------- | 指数部の符号を反転します。つまり10-12(=100pF) |
とふたつの引き数をキーインしてから | |||
9. | ![]() ![]() |
と押して実行します。
これは私が日常的に使っているプログラムのひとつでもあります。
32SIIでは"A"から"Z"までの変数名が使えます。これを使うとインタラクティブ(?)なプログラムを組むことができます。
先程のプログラムは、以下のようにも書けます。『R』は抵抗値、『C』は容量値です。
1. | ![]() ![]() | プログラム入力モード |
2. | ![]() ![]() ![]() | プログラム名は"E"としました |
3. | ![]() ![]() ![]() | 『R』の値を変数"R"に格納します。 |
4. | ![]() ![]() ![]() | 『C』の値を変数"C"に格納します。 |
5. | ![]() ![]() | 『C』の値はスタックにあるので、 変数"R"を呼び出して『R』の値をスタックに積みます。 |
6. | ![]() | ふたつの引き数を掛けて |
7. | ![]() | 「2」を |
8. | ![]() | 掛けて |
9. | ![]() ![]() | 「π」を |
10. | ![]() | 掛けて |
11. | ![]() | 逆数をとって |
12. | ![]() ![]() | オシマイ |
13. | ![]() | プログラム入力モードを抜ける |
このプログラムを実行するには、先程と違ってふたつの引数を入力しないで
とキー・インします。すると32SIIは『INPUT R? [現在の"R"の値] 』を表示して、『R』の値が入力されるまで停止します。ここで抵抗値・容量値が先程と同じだとすると
(10kΩ)と『R』の値を入力して、
でプログラムを再開すると、続けて『INPUT C? [現在の"C"の値]』と表示されて『C』の値を聞いてきます。
(100pF)と『C』値を入力して
を押すと、その先の計算を再開して結果を表示します。
プログラムのステップ・サイズは増えますが、このように入力する値を連想するような変数名を使うことで、実行する時にわかりやすいプログラムが書けます。
■TIPS-1
上記のステップ5でわかるように、INPUT命令では入力された値を X スタックにも保存しています。直後であればリコールする必要はありません。
■TIPS-2
もっと長い、複雑なプログラムで多くの変数を使うときは、プログラムの最初のほうですべての変数に値を入力するようにします。INPUTで入力待ちになっている時は、 でプログラムを再開するまでは任意の手計算ができます。ということはその場合はスタックの値が変わってしまうわけです。ですからINPUTの前後でスタックの値が変わらないことを想定したプログラムは、おかしな結果になります。ということで、変数値は始めのほうですべて入力を済ませてしまって、必要なときに
で呼び出すほうが安全です。
■TIPS-3
プログラム実行中に変数の値を確認したいときは、プログラムにVIEW[変数名]を埋めこんでおきます。この場合は表示だけでXスタックに値はコピーされません。
■TIPS-4
ちなみに、変数名とプログラムのラベル名は全く別のものです。同じ名前でも問題はありません。上記の例では『C』値、変数"C"と混同しないように"E"というラベルを付けました。
このページのトップへ | 扉へ | その他、ソノホカ・・・ |