2019年7月23日火曜日

メモリ演算のサポート

=による計算のうち、数字=の演算で、1つ前の数字と演算子の組み合わせでモードを変えながらの通常演算とメモリ演算(結果、オペランド)計算を組み込みました。

モードは、演算キュー の中に以下の入力モード(タプル)を組み込んでいます。

    private var memorizedInputMode : (num: Bool, calc: Bool)

演算をする前にこのメモリを呼び出してから計算に入ります。
        let previousInputMode = memorizedInputMode
        memorizedInputMode = inputMode

また、これまでオペランド(数値)がnilの場合の処理を十分考えていなかったので、取り敢えずインプットステータス(モード)のみを更新する処理を組み込みました。

        if inputOperand == nil {
            operaterQueue = inputOperater
            return nil
        }

そして=の演算をモードによって以下のとおり使い分けます。

            case "=":
                switch previousInputMode {
                case (num:true, calc:true): //normal operation  <1:true +:true> (2=)
                    print ("normal operation")
                    let returnVal = equalOperation()
                    operand1 = returnVal
                    let ret =  String2formattedNumberString (returnVal!)
                    return ret
                case (num:false, calc:true): //result operation <nil:false +:true> (2=)
                    print ("result operation")
                    operand2 = inputOperand
                    let returnVal = equalOperation()
                    operand1 = returnVal
                    let ret =  String2formattedNumberString (returnVal!)
                    return ret
                case (num:false, calc:false): // operand operation < (2=) >
                    operand1 = inputOperand
                    print ("operand operation " + operand1! + operaterQueue! + operand2!)
                    let returnVal = equalOperation()
                    operand1 = returnVal
                    let ret =  String2formattedNumberString (returnVal!)
                    return ret
                default:
                    print ("bat input status")
                }

あとは数値入力時と演算子が入ってきたときに、インプットステータス(モード)をそれぞれ変更します。

また、=演算のあとに、インプットステータスをクリア(false,false)しなくてはいけません。

結果、通常演算、結果メモリ演算、オペランドメモリ演算がいかのとおりできました。ただし、他のモードでどう動くかはまだ検証していません。

2
Operater5 *
2
Operater5 =
normal operation
4
Operater5 +
1
Operater5 =
result operation
5
1
Operater5 -
2
Operater5 =
normal operation
-1
3
Operater5 =
operand operation 3-2
1
5
Operater5 =
operand operation 5-2

3


とりあえずエンジンはここまでにしてUIを実装していくかなぁ

0 件のコメント: