2019年7月13日土曜日

計算キューの作成

前回までは数字の入力キューを作りましたが、今回は計算のためのキューを作ります

計算のためのキューとは、A + B = という計算をするのですが、この場合の計算は+を押したときではなく、=を押した時に実行されるため、AとBとを確保しておく必要があるため、キューを作る必要があります。

それが以下のものになります。
    // CalQueue.push()
    func push(_ inputData:String) ->String?{
//        if let operaterData = changeString2Character(inputData){
            
        if itsOperator(inputData){
            switch inputData {
                case "+":fallthrough
                case "-":fallthrough
                case "/":fallthrough
                case "*":
                    if operand1 != nil {
                        if operand2 != nil{
                            if operaterQueue != nil{
                                let returnVal = equalOperation()
                                operaterQueue = Character(inputData)
                                operand1 = String2formattedNumberString(returnVal!)
                                operand2 = nil
                                let ret =  String2formattedNumberString (returnVal!)
                                return ret
                            }
                        }
                        else{
                            operaterQueue = Character(inputData)
                            }
                    }
                case "=":
                    if operand1 != nil {
                        if operand2 != nil{
                            if operaterQueue != nil{
                                let returnVal = equalOperation()
                                operaterQueue = nil
                                operand1 = nil
                                operand2 = nil
                                let ret =  String2formattedNumberString (returnVal!)
                                return ret
                            }
                        }
                    }
               default:
                        print("Bad operator")
                }// end switch
            return nil
        }
        else {
        // changeString2CHaracter (not 1 char)
            if operand1 == nil{
                operand1 = inputData
                return operand1
            }
            else{
                operand2 = inputData
                return operand2
            }
        }
        
    }// end push

ここでプッシュされるのは、数字かもしくは演算子ということでPush関数に実装したのが、まず演算子かどうかの判別で、実際に演算を行います。

演算としては、=の場合に、キューに格納された数字同士を、同じくキューに格納された演算子で計算し、結果を返すことが基本になっています。

+ー/*の場合は、演算子を単にキューに入れるか、もしくは数字のキューが双方揃っているのであれば、=と同じような計算を行います(演算自体は継続)。

また、演算結果は数値キーでの入力とは異なり、小数点より後ろにゼロがつく場合があるため、最後がゼロとなる場合は桁を減らすようなフォーマット変換をしています。

あと、今回のコードで重要なのが、演算を独立させたところです。これでいつでも10進演算を実装できます。

いやぁ、Swift便利すぎだわ。

ちなみにこのコードは++だとか+=だとか+====だとか、特殊なオペレーションやキー入力が含まれていないので、追って実装していきます。

0 件のコメント: