2019年7月21日日曜日

ここまで実装して電卓の再設計が必要だと思う点

電卓をここまで実装してきましたが、どうやら再設計が必要になってきそうです。

あまりにも大胆な再設計であったため、コーディング中にわけがわからなくなり、一つ手前のバージョンまでCtl+Zで戻るはめに。

再設計の原因は=後の処理にあります。

(1)通常演算
電卓の機能としては=の機能には通常の
1+2=3

のほかに、

(2)演算結果メモリ演算
1+2=3
+1=(3+1)=4
といった継続的な計算処理があります。

(3)オペランドのメモリ演算
1+2=3
3=(3+2)=5
という、演算子と演算結果のメモリによる追加の演算というものもあります。


この場合、演算結果や演算子を覚えさせて、=があったときに処理させるのはいいのですが、通常演算なのか、演算結果に対する演算なのか、メモリ演算なのかを識別してあげる必要があります。

現在のキュー では、オペランドと演算子(含む=)を組みとして

CalQueue.Push (オペランド、演算子)という入力をもとに演算を組み立てているのですが、そうすると、

上にある入力は、いずれの場合も=としてしか認識できません。

2=
1=
3=

とりあえず(3)を置いておいて、
(1)と(2)については処理的には以下の処理となるのですが、パラメータを受け取ったときに、メモリ演算なのか、通常演算なのかの区別がつきません。

(1)通常演算
・オペランド1に数値が入っている
・演算子は前の演算子
・オペランド2に数値が入っていない
・入力された数値はオペランド2に入れる

(2)演算結果のメモリ演算
・計算結果は、オペランド1に入れる
・演算子は前の演算子
・オペランド2に数値が入っていない
・入力された数値はオペランド2に入れる

通常演算と演算結果メモリ演算との違いは、演算子との間に数値が入るかどうかです。

(1)通常演算
1+2=3
1+1=2

(2)演算結果メモリ演算
1+2=3
+1=
そのため、演算後に数値を入ればモードを変える(通常演算)にするという仕組みが必要です。しかしCalQueueは、数値と演算子だけを受け付けるので、そのようなモードは外部に持たせなくてはいけません。

文法としては、
数字、演算子、数字、=

数字、演算子、数字、=
演算子、=

数字、演算子、数字、=
数字、=

といった文脈を解釈して演算モードを切り替えさせなくてはいけません。

normalCal
operaterCal
operandCal

と名付けますか。

ちょっと実装していきたいと思います・・・

=>この実装はやめました・・・

0 件のコメント: