今週のお題「雪」
スタックを利用した電卓
スタックを使用して数式を計算する場合、数式を左から順番に見ていて、直ちに計算できる数値があれば、それをスタックにPUSHします。多くの場合二つの数値をPUSHします。
そのあと、その2数の間の計算を行う。スタックのTOPにあった二つの数値をPOP(スタックがら取り除く)して、さらに計算結果をPUSHします。これを繰り返して、最後の計算を行うと結果がスタックのTOPに残ります。
スタックによる電卓
プログラミングでよく使用されるデータ構造にスタックがある。スタックは先入れ後出し法を操作として使う。スタックを利用する電卓は大変シンプルで操作しやすい。計算の順番を規定する括弧が不要であり、途中の計算結果を記憶するメモリーも不要である。
図calc1はスクラッチで作成したスタックを利用する電卓である。必ずしも見映えはよくない。この図はプログラムを起動した時のステージの表示画面である。
I,N,R,a,b,c,S,Dは定義した変数で、stackは定義したリストである。このプログラムはスクラッチ上部の緑の旗により起動される。始めに初期設定のためボタンCをクリックする。全ての変数は0に設定される。ただし、Dは10である。スタックは空に設定される。1,2,3,4,5,6,7,8,9,0,・、P、+、-、X,/,R,C,Mはボタンですべてスプライトである。したがって、クリックすると、それに関連したプログラムが起動される。数字と・は数値を入力するためのボタンである。その他のスプライトもそれをクリックすると特有のプログラムが関係していて、それが起動される。それぞれは以下のような動作が関連付けられている。
ボタンとスプライトと関連するプログラムの説明
緑の旗:
スクラッチに用意された緑の旗をクリックすると背景に用意されたプログラムが起動される(図stage-prog1)。このプログラムは数値入力を受け付けるためのプログラムで起動されたままで、数値入力を処理する。複数桁の整数、少数のある実数を受け付ける。変数rに結果が入る。
C:
スタックを空にし、変数がすべて0にされ、ただしDは10がセットされる。このスプライトのプログラムは図clear-prog1である。
1,2,3,4,5,6,7,8,9,0と・:
1,2,3,4,5,6,7,8,9,0:
整数または実数が変数rに入る。数字を連続してクリックすると二桁、三桁、それ以上の桁の数字を入力できる。・は少数点を意味していて、少数点以下の桁も入力できる。スクリプトは図number-input2-1、図number-input2-2に代表されるコードになっていて、それぞれのスプライトに対応している。その結果Iは1が入り, Nはそのボタンについている数が入る。従ってIが1であると数値が押されたことがわかる。
・:
・が押されると少数点以下の処理をするため、図multi-digit-real1が起動され、Iが0、Sが1にセットされる。Sは始め0になっている。図multi-digit-real1、図number-input1-1、図number-input2-1などが働いて、rに整数または実数の入力値が設定される。
P:(PUSH)
変数rの内容がスタックにPUSHされる。r,D,S,Iがそれぞれ0,10,0,-1にセットされる。PUSHされたのでrはクリアされ、Dは元の数10に、Sも少数の扱いは終わったので元の数0になり、Iは数値入力はとりあえず終わったので、-1にしておく。このスプライトのプログラムは図push-prog1である。
+:(加算)
スタックのトップがPOPされ変数bに入れられる(スタックのトップはなくなる)、さらにスタックの新しいトップがPOPされaに入れられ、c=a+bが計算され、cがスタックにPUSHされる。このスプライトのプログラムは図add-prog1である。
ー:
+と同じであるが、計算はc=a-bである。このスプライトのプログラムは図sub-prog1である。
X:
+と同じであるが、計算はc=a*bである。このスプライトのプログラムは図mult-prog1である。
/:
Xと同じであるが、計算は c=a/bである。このスプライトのプログラムは図div-prog1である。
R:
スタックのトップのがPOPされ、rに入れられる、そこで平方根が計算され、rに残る。これが、スタックにPUSHされる。元のrの場所にrの平方根が入る。このスプライトのプログラムは図root-prog1である。
M:スタックのトップがマイナスになる。すなわち-1が掛けられる。これはマイナスの数を扱うためである。このスプライトのプログラムは図minus-prog1である。
操作例
1.
(2.2-1.2)*(34.5+4)
操作
2.2p1.2p-34.5p4px 計算結果:38.5
2.
(-45-20)/(11-3)
操作
45pm20p-11p3p-/ 計算結果:-8.125