アフィリエイト広告を利用しています

2018年07月28日

HP-42S: INPUT 命令

$\mathrm{INPUT}$ 命令は入力機能を実現する.
何らかのデータを, ユーザーからの入力によって取得して HP-42S の変数またはレジスターに保存させる際に使用される.
$\mathrm{INPUT}$ 命令が使用されると以下の処理が行われる.

・変数またはレジスターに入っている現在の値が $\mathrm{X}$ レジスターに呼び出される. 指定した名前の変数が存在しない場合には, 自動的にその名前の変数が作成され, 初期値としてゼロが設定される.

・$\mathrm{X}$ レジスターの標準ラベル ($\mathrm{x}: $) が, 入力する変数またはレジスターの名前と疑問符 $?$ に置き換えられる. これが入力を促すプロンプトになる. 例えば $\mathrm{A}$ という新しい名前の変数に対してプログラム内から
\begin{equation*}
\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{\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}{\mathrm{Nat}}
\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{INPUT} \qq \text{"A"}
\end{equation*} という命令を実行すると, $\Mr{X}$ レジスターに
\begin{equation*}
\Mr{A}?\,0 \hspace{20mm}
\end{equation*} というプロンプトが表示されて入力を促す.

・プログラムの実行が停止し, $\mathrm{X}$ レジスターに対して値の入力が行えるようになる. 値を入力した後で $\mathrm{R/S}$ ボタンを押すと, $\mathrm{X}$ レジスターの値が自動的に指定した変数またはレジスターに送られて入力操作が終了する.

・プログラムの実行が継続される.

マニュアルに載っている $\Mr{INPUT}$ 命令を使ったサンプルプログラムは次のようなものである. このプログラムはユーザーが奥行き, 高さ, 幅の 3 つの値を入力して, 奥行き $\Mr{L}$, 高さ $\Mr{H}$, 幅 $\Mr{W}$ の直方体の表面積を式
\begin{equation*}
\text{表面積} = 2 \times ((\Mr{L} \times \Mr{H}) + (\Mr{L} \times \Mr{W}) + (\Mr{H} \times \Mr{W}))
\end{equation*} を使って計算する.



\begin{align*}
& 01 \q \Mr{LBL} \qq \text{"SAREA"} & \q & \\
& 02 \q \Mr{INPUT} \qq \text{"L"} & & ; \text{3 つの変数を入力する.} \\
& 03 \q \Mr{INPUT} \qq \text{"H"} & & \\
& 04 \q \Mr{INPUT} \qq \text{"W"} & & \\
& 05 \q \Mr{RCL\times} \qq \text{"L"} & & ; \text{奥行き} \times \text{幅を計算する.} \\
& 06 \q \Mr{LASTX} & & ; \text{高さ} \times \text{幅を計算する.} \\
& 07 \q \Mr{RCL\times} \qq \text{"H"} & & \\
& 08 \q \Mr{RCL} \qq \text{"H"} & & ; \text{奥行き} \times \text{高さを計算する.} \\
& 09 \q \Mr{RCL\times} \qq \text{"L"} & & \\
& 10 \q + & & ; \text{それぞれの積の合計を} 2 \text{倍して, 計算結果を} \Mr{X} \text{レジスターに残す.} \\
& 11 \q + & & \\
& 12 \q 2 & & \\
& 13 \q \times & & \\
& 14 \q \Mr{END} & &
\end{align*}


このプログラムには次の変数とレジスターが使用されている.

・変数: $\Mr{L}$, $\Mr{H}$, $\Mr{W}$
・スタックレジスター: $\Mr{X}$, $\Mr{Y}$, $\Mr{Z}$, $\Mr{T}$
・$\Mr{LAST X}$ レジスター (一つ前の $\Mr{X}$ レジスターの内容を保持するレジスター): $\Mr{LASTX}$

$\Mr{L} = 4$, $\Mr{H} = 3$, $\Mr{W} = 1.5$ を入力する場合の動作を一行づつ書き下してみる.

$\hspace{10mm} 01 \q \Mr{LBL} \qq \text{"SAREA"}$
プログラム名 $\text{"SAREA"}$ をグルーバルラベルとして宣言する.


$\hspace{10mm} 02 \q \Mr{INPUT} \qq \text{"L"}$
$\Mr{L}$ は新しい変数名なので, 自動的に $\Mr{L}$ という名前の変数が作成されて, 初期値として $0$ が代入される. $\Mr{L}$ として $4$ を入力する.
\begin{align*}
& \Mr{L}: 4 & \qq & \Mr{T}: & \qq & \\
& & \qq & \Mr{Z}: & \qq & \\
& & \qq & \Mr{Y}: & \qq & \\
& & \qq & \Mr{X}: 4 & \qq & \Mr{LASTX}:
\end{align*}

$\hspace{10mm} 03 \q \Mr{INPUT} \qq \text{"H"}$
同様に $\Mr{H}$ は新しい変数名なので, 自動的に $\Mr{H}$ という名前の変数が作成されて, 初期値として $0$ が代入される. $\Mr{H}$ として $3$ を入力する. スタックが 1 段上昇する.
\begin{align*}
& \Mr{L}: 4 & \qq & \Mr{T}: & \qq & \\
& \Mr{H}: 3 & \qq & \Mr{Z}: & \qq & \\
& & \qq & \Mr{Y}: 4 & \qq & \\
& & \qq & \Mr{X}: 3 & \qq & \Mr{LASTX}: 4
\end{align*}

$\hspace{10mm} 04 \q \Mr{INPUT} \qq \text{"W"}$
$\Mr{W}$ も新しい変数名なので, 自動的に $\Mr{W}$ という名前の変数が作成されて, 初期値として $0$ が代入される. $\Mr{W}$ として $1.5$ を入力する. スタックが 1 段上昇する.
\begin{align*}
& \Mr{L}: 4 & \qq & \Mr{T}: & \qq & \\
& \Mr{H}: 3 & \qq & \Mr{Z}: 4 & \qq & \\
& \Mr{W}: 1.5 & \qq & \Mr{Y}: 3 & \qq & \\
& & \qq & \Mr{X}: 1.5 & \qq & \Mr{LASTX}: 3 \\
\end{align*}

$\hspace{10mm} 05 \q \Mr{RCL\times} \qq \text{"L"}$
$\Mr{L}$ に保存された値 $4$ と $\Mr{X}$ レジスターに保存された値 ($\Mr{W}$ の値 $1.5$ がまだ $\Mr{X}$ レジスターに残っている) を掛け合わせて結果 $6$ を $\Mr{X}$ レジスターに保存する. $\Mr{RCL}\times$ 命令の仕様により, $\Mr{X}$ レジスター, $\Mr{LASTX}$ 以外のスタック, レジスターは影響を受けない.
\begin{align*}
& \Mr{L}: 4 & \qq & \Mr{T}: & \qq & \\
& \Mr{H}: 3 & \qq & \Mr{Z}: 4 & \qq & \\
& \Mr{W}: 1.5 & \qq & \Mr{Y}: 3 & \qq & \\
& & \qq & \Mr{X}: 6 & \qq & \Mr{LASTX}: 1.5 \\
\end{align*}

$\hspace{10mm} 06 \q \Mr{LASTX}$
$\Mr{LASTX}$ レジスターには, 幅 $\Mr{W}$ の値 $1.5$ が保存されている. それを $\Mr{X}$ レジスターに呼び出す. $\Mr{LASTX}$ レジスター自身の内容は変化しない. スタックが 1 段上昇する.
\begin{align*}
& \Mr{L}: 4 & \qq & \Mr{T}: 4 & \qq & \\
& \Mr{H}: 3 & \qq & \Mr{Z}: 3 & \qq & \\
& \Mr{W}: 1.5 & \qq & \Mr{Y}: 6 & \qq & \\
& & \qq & \Mr{X}: 1.5 & \qq & \Mr{LASTX}: 1.5
\end{align*}

$\hspace{10mm} 07 \q \Mr{RCL\times} \qq \text{"H"}$
$\Mr{H}$ に保存された値 $3$ と $\Mr{X}$ レジスターに保存された値 $1.5$ ($\Mr{LASTX}$ レジスターから呼び出した $\Mr{W}$ の値) を掛け合わせて結果 $4.5$ を $\Mr{X}$ レジスターに保存する. $\Mr{RCL}\times$ 命令の仕様により, $\Mr{X}$ レジスター, $\Mr{LASTX}$ 以外のスタック, レジスターは影響を受けない.
\begin{align*}
& \Mr{L}: 4 & \qq & \Mr{T}: 4 & \qq & \\
& \Mr{H}: 3 & \qq & \Mr{Z}: 3 & \qq & \\
& \Mr{W}: 1.5 & \qq & \Mr{Y}: 6 & \qq & \\
& & \qq & \Mr{X}: 4.5 & \qq & \Mr{LASTX}: 1.5
\end{align*}

$\hspace{10mm} 08 \q \Mr{RCL} \qq \text{"H"}$
$\Mr{H}$ の値 $3$ を $\Mr{X}$ レジスターに呼び出す. スタックが 1 段上昇する. $\Mr{RCL}$ 単体命令の仕様により, スタックが 1 段上昇し, $\Mr{X}$ レジスター以外の $\Mr{LASTX}$ レジスターを含む他のレジスターは影響を受けない.
\begin{align*}
& \Mr{L}: 4 & \qq & \Mr{T}: 3 & \qq & \\
& \Mr{H}: 3 & \qq & \Mr{Z}: 6 & \qq & \\
& \Mr{W}: 1.5 & \qq & \Mr{Y}: 4.5 & \qq & \\
& & \qq & \Mr{X}: 3 & \qq & \Mr{LASTX}: 1.5
\end{align*}

$\hspace{10mm} 09 \q \Mr{RCL\times} \qq \text{"L"}$
$\Mr{L}$ に保存された値 $4$ と $\Mr{X}$ レジスターに保存された値 $3$ ($\Mr{H}$ の値) を掛け合わせて結果 $12$ を $\Mr{X}$ レジスターに保存する. $\Mr{RCL}\times$ 命令の仕様により, $\Mr{X}$ レジスター, $\Mr{LASTX}$ 以外のスタック, レジスターは影響を受けない.
\begin{align*}
& \Mr{L}: 4 & \qq & \Mr{T}: 3 & \qq & \\
& \Mr{H}: 3 & \qq & \Mr{Z}: 6 & \qq & \\
& \Mr{W}: 1.5 & \qq & \Mr{Y}: 4.5 & \qq & \\
& & \qq & \Mr{X}: 12 & \qq & \Mr{LASTX}: 3
\end{align*}

$\hspace{10mm} 10 \q +$
$\Mr{X}$ レジスターに保存されている値 $12 = \Mr{L} \times \Mr{H}$ と $\Mr{Y}$ レジスターに保存されている値 $4.5 = \Mr{H} \times \Mr{W}$ を加え合わせた結果 $16.5$ を $\Mr{X}$ レジスターに保存する. スタックが 1 段下降する.
\begin{align*}
& \Mr{L}: 4 & \qq & \Mr{T}: 3 & \qq & \\
& \Mr{H}: 3 & \qq & \Mr{Z}: 3 & \qq & \\
& \Mr{W}: 1.5 & \qq & \Mr{Y}: 6 & \qq & \\
& & \qq & \Mr{X}: 16.5 & \qq & \Mr{LASTX}: 12
\end{align*}

$\hspace{10mm} 11 \q +$
$\Mr{X}$ レジスターに保存されている値 $16.5 = \Mr{L} \times \Mr{H} + \Mr{H} \times \Mr{W}$ と $\Mr{Y}$ レジスターに保存されている値 $6 = \Mr{L} \times \Mr{W}$ を加え合わせた結果 $22.5$ を $\Mr{X}$ レジスターに保存する. スタックが 1 段下降する.
\begin{align*}
& \Mr{L}: 4 & \qq & \Mr{T}: 3 & \qq & \\
& \Mr{H}: 3 & \qq & \Mr{Z}: 3 & \qq & \\
& \Mr{W}: 1.5 & \qq & \Mr{Y}: 3 & \qq & \\
& & \qq & \Mr{X}: 22.5 & \qq & \Mr{LASTX}: 16.5
\end{align*}

$\hspace{10mm} 12 \q 2$
$\Mr{X}$ レジスターに $2$ を保存する. スタックが 1 段上昇する.
\begin{align*}
& \Mr{L}: 4 & \qq & \Mr{T}: 3 & \qq & \\
& \Mr{H}: 3 & \qq & \Mr{Z}: 3 & \qq & \\
& \Mr{W}: 1.5 & \qq & \Mr{Y}: 22.5 & \qq & \\
& & \qq & \Mr{X}: 2 & \qq & \Mr{LASTX}: 22.5
\end{align*}

$\hspace{10mm} 13 \q \times$
$\Mr{X}$ レジスターに保存された値 $2$ と $\Mr{Y}$ レジスターに保存された値 $22.5$ を掛け合わせた結果 $45$ を $\Mr{X}$ レジスターに保存する. この値が $2 \times ((\Mr{L} \times \Mr{H}) + (\Mr{L} \times \Mr{W}) + (\Mr{H} \times \Mr{W}))$ で計算される直方体の表面積である. スタックが 1 段下降する.
\begin{align*}
& \Mr{L}: 4 & \qq & \Mr{T}: 3 & \qq & \\
& \Mr{H}: 3 & \qq & \Mr{Z}: 3 & \qq & \\
& \Mr{W}: 1.5 & \qq & \Mr{Y}: 3 & \qq & \\
& & \qq & \Mr{X}: 45 & \qq & \Mr{LASTX}: 2
\end{align*}

$\hspace{10mm} 14 \q \Mr{END}$
$\Mr{END}$ 命令によりプログラムの実行が終了する.

※: 1 行毎の動きを解析したが, 残念ながらプログラムを理解できたとは言えない. 論理的思考力, 特にアルゴリズム的な思考が困難なのはまだ回復していない. しかし, こういう作業を繰り返していくことがリハビリになっていくといい.
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

この記事へのトラックバックURL
https://fanblogs.jp/tb/7940021

この記事へのトラックバック
ファン
検索
<< 2024年11月 >>
          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
最新記事
最新コメント
眼科の定期検査 〜 散歩 by コトタマ (02/15)
眼科の定期検査 by 三文字寄れば文殊のヒフミヨ (09/21)
本を読んで過ごす by 底彦 (12/13)
本を読んで過ごす by ねこ (12/12)
数学の計算をする by 底彦 (12/04)
タグクラウド
カテゴリアーカイブ
仕事(59)
社会復帰(22)
(44)
コンピューター(211)
(1441)
借金(8)
勉強(13)
(13)
数学(97)
運動(8)
日常生活(1403)
(204)
健康(38)
読書(21)
プロフィール

ブログランキング・にほんブログ村へ
にほんブログ村
にほんブログ村 メンタルヘルスブログ うつ病(鬱病)へ
にほんブログ村
にほんブログ村 科学ブログ 数学へ
にほんブログ村
にほんブログ村 IT技術ブログ プログラム・プログラマーへ
にほんブログ村