奥行き $\mathrm{L}$, 高さ $\mathrm{H}$, 幅 $\mathrm{W}$ の直方体の表面積を求める "$\mathrm{SAREA}$" プログラムの最新版は次のようなものである.
\begin{align*}
\newcommand{\Ar}[1]{\mathrm{Ar}(#1)}
\newcommand{\ar}{\mathrm{ar}}
\newcommand{\arop}{\Opp{\mathrm{ar}}}
\newcommand{\Colim}{\mathrm{colim}}
\newcommand{\CommaCat}[2]{(#1 \downarrow #2)}
\newcommand{\Cone}[2]{\mathrm{Cone}(#1,#2)}
\newcommand{\Func}[2]{\mathrm{Func}(#1,#2)}
\newcommand{\Hom}{\mathrm{Hom}}
\newcommand{\Id}[1]{\mathrm{id}_{#1}}
\newcommand{\Mb}[1]{\mathbf{#1}}
\newcommand{\Mr}[1]{\mathrm{#1}}
\newcommand{\Ms}[1]{\mathscr{#1}}
\newcommand{\Nat}[2]{\mathrm{Nat}(#1,#2)}
\newcommand{\Ob}[1]{\mathrm{Ob}(#1)}
\newcommand{\Opp}[1]{{#1}^{\mathrm{op}}}
\newcommand{\Pos}{\mathbf{Pos}}
\newcommand{\q}{\hspace{1em}}
\newcommand{\qq}{\hspace{0.5em}}
\newcommand{\Rest}[2]{{#1}|{#2}}
\newcommand{\Sub}{\mathrm{Sub}}
\newcommand{\Src}{d^{0,\mathrm{op}}}
\newcommand{\Tgt}{d^{1,\mathrm{op}}}
& 01 \q \Mr{LBL} \qq \text{"SAREA"} & \q & \\
& 02 \q \Mr{MVAR} \qq \text{"L"} & & ; \text{メニュー変数 L の宣言.} \\
& 03 \q \Mr{MVAR} \qq \text{"H"} & & ; \text{メニュー変数 H の宣言.} \\
& 04 \q \Mr{MVAR} \qq \text{"W"} & & ; \text{メニュー変数 W の宣言.} \\
& 05 \q \Mr{VARMENU} \qq \text{"SAREA"} & & ; \text{変数メニューの作成.} \\
& 06 \q \Mr{STOP} & & ; \text{プログラムの停止と対話モードへの移行.} \\
& 07 \q \Mr{EXITALL} & & ; \text{全メニューの終了.} \\
& 08 \q \Mr{RCL} \qq \text{"W"} & & ; \text{奥行き} \times \text{幅を計算する.} \\
& 09 \q \Mr{RCL\times} \qq \text{"L"} & & \\
& 10 \q \Mr{LASTX} & & ; \text{高さ} \times \text{幅を計算する.} \\
& 11 \q \Mr{RCL\times} \qq \text{"H"} & & \\
& 12 \q \Mr{RCL} \qq \text{"H"} & & ; \text{奥行き} \times \text{高さを計算する.} \\
& 13 \q \Mr{RCL\times} \qq \text{"L"} & & \\
& 14 \q + & & ; \text{それぞれの積の合計を} 2 \text{倍して, 計算結果を} \Mr{X} \text{レジスターに残す.} \\
& 15 \q + & & \\
& 16 \q 2 & & \\
& 17 \q \times & & \\
& 18 \q \Mr{END} & &
\end{align*}
このプログラムを値:
\begin{equation*}
\Mr{L}=3, \Mr{H}=4, \Mr{W}=5
\end{equation*} の直方体に対して適用すると, 結果は HP-42S のディスプレイ上に次のように表示される.
\begin{align*}
& \Mr{y}: \hspace{50mm} \\
& \Mr{x}: 94
\end{align*} $\Mr{VIEW}$ 機能を用いると, 上の結果の表示を
\begin{align*}
& \Mr{SAREA}=94 \hspace{32mm} \\
& \Mr{x}: 94
\end{align*} のようにラベル "$\text{SAREA}=$" を付けて表示させることができる.
そのためには, 上の $\Mr{SAREA}$ プログラムの 17 行目の後ろに次の 2 行を追加する.
\begin{align*}
& 17 \q \times & & \\
& 18 \q \Mr{STO} \qq \text{"SAREA"} & & ; \text{17 行目までで求めた計算結果を "SAREA" 変数に格納する.} \\
& 19 \q \Mr{VIEW} \qq \text{"SAREA"} & & ; \text{計算結果をラベル "SAREA=" を付けて表示する.}
\end{align*}
$\Mr{VIEW}$ 機能はラベル付きの計算結果の表示を行うものだったが, より長いメッセージ文字列を表示するために $\Mr{AVIEW}$ 機能がある.
※: 実は $\Mr{AVIEW}$ 機能の他に $\Mr{PROMPT}$ 機能もメッセージの表示を行うが, これについてはここでは省略する.
HP-42S のプログラムからメッセージを表示させるには, 次の手順を行う. 英数文字列を保存するための ALPHA レジスターを使用する.
(1) 表示させるメッセージを ALPHA レジスター内に英数文字列として作成する (最大 44 文字).
(2) ALPHA レジスターの内容を表示する.
次のプログラムは 3 つのメッセージを順番に表示する. 各々のメッセージが表示されるとプログラムは 1 秒間停止してメッセージが読めるようにする. 1 秒後にプログラムは再開して次のメッセージを表示する.
\begin{align*}
& 01 \q \text{"Hello there,"} & & ; \text{1 番目のメッセージ. ALPHA レジスターの内容がこの文字列になる.} \\
& 02 \q \Mr{AVIEW} & & ; \text{ALPHA レジスターの内容をディスプレイに表示する.} \\
& 03 \q \Mr{PSE} & & ; \text{1 秒間休止.} \\
& 04 \q \text{"this program"} & & ; \text{2 番目のメッセージ. ALPHA レジスターの内容がこの文字列で置き換わる.} \\
& 05 \q \Mr{AVIEW} & & ; \text{ALPHA レジスターの内容をディスプレイに表示する.} \\
& 06 \q \Mr{PSE} & & ; \text{1 秒間休止.} \\
& 07 \q \text{"has 3 messages."} & & ; \text{3 番目のメッセージ. ALPHA レジスターの内容がこの文字列で置き換わる.} \\
& 08 \q \Mr{AVIEW} & & ; \text{ALPHA レジスターの内容をディスプレイに表示する.} \\
& 09 \q \Mr{END} & & ; \text{プログラムの終了. 3 番目のメッセージはディスプレイに残るので PSE 命令は必要無い.}
\end{align*} このプログラムには, $\Mr{"SAREA"}$ プログラムのようにグローバルラベルが割り当てられていない. だから
\begin{equation*}
\Mr{XEQ} \qq \text{"SAREA"}
\end{equation*} のようにしてプログラムを起動することができない.
そこで, 上記のプログラムの入力画面から次を実行してプログラムの起動を行う.
プログラムモードをオフ ── 通常の計算機モード ── にして,
\begin{equation*}
\Mr{PRG.FCN} \qq \Mr{RTN} \qq \Mr{R/S}
\end{equation*} を押す. するとプログラムの実行が開始される.
$\Mr{VIEW}$, $\Mr{AVIEW}$ はプリンター (※) への印字も行える.
※: HP-42S では HP82240A という赤外線プリンターをサポートしている. 残念ながら自分はこのプリンターを持っていないので, プリンターへの印字を試すことはできないが, その仕組みが面白いので書いておく.
プリンター印字の制御は 2 つのフラグを用いて行われる. 制御フラグであるフラグ 21 番とシステムフラグであるフラグ 55 番である.
この 2 つのフラグの役割は以下のようなものである.
● フラグ 21: 印字要求 ── プログラム内で $\Mr{VIEW}$ または $\Mr{AVIEW}$ 機能が実行されたときに印字の可否を制御できる. フラグ 21 がセットされているならば, 印字が可能な状態を示す.
● フラグ 55: プリンター使用可能 ── フラグ 55 がセットされているとプリンターが使用可能な状態を示す.
次の 3 つの場合が発生する.
(a) フラグ 21 とフラグ 55 が共にセットされているとプリンターへの印字が行われる.
(b) フラグ 21 がセットされていて, フラグ 55 がクリアされているとプリンターへの印字は行われず, プログラムの実行が停止する. プログラムの実行が停止されている間はメッセージまたは計算結果がディスプレイに表示されたままの状態が継続されるので, その結果を書き写すことができる. $\Mr{R/S}$ を押すとプログラムが動作を再開する.
(c) フラグ 21 がクリアされているとき, フラグ 55 がセット・クリアいずれであっても印字要求は無視されてプログラムの実行は次の行から継続される. つまり, フラグ 21 がクリアされている状態のとき, フラグ 55 の状態は $\Mr{VIEW}$, $\Mr{AVIEW}$ のどちらによっても無視される.
試してみることはできないが, この場合の 2 つのフラグ ── フラグ 21 とフラグ 55 ── の状態でデバイス (プリンター) を制御する仕組みは計算機らしくて面白い.
しかし, この仕組みを理解するのに随分時間がかかってしまった.
時間と共に変化していく状態を頭の中にイメージするようなアルゴリズム的思考が, 現在の体調ではまだかなり難しいのだ.
もどかしいが, ゆっくりと回復するのを待つしかない.
【このカテゴリーの最新記事】
-
no image
-
no image
-
no image
-
no image
-
no image