前回までは数字の入力キューを作りましたが、今回は計算のためのキューを作ります
ここでプッシュされるのは、数字かもしくは演算子ということでPush関数に実装したのが、まず演算子かどうかの判別で、実際に演算を行います。
演算としては、=の場合に、キューに格納された数字同士を、同じくキューに格納された演算子で計算し、結果を返すことが基本になっています。
+ー/*の場合は、演算子を単にキューに入れるか、もしくは数字のキューが双方揃っているのであれば、=と同じような計算を行います(演算自体は継続)。
また、演算結果は数値キーでの入力とは異なり、小数点より後ろにゼロがつく場合があるため、最後がゼロとなる場合は桁を減らすようなフォーマット変換をしています。
あと、今回のコードで重要なのが、演算を独立させたところです。これでいつでも10進演算を実装できます。
いやぁ、Swift便利すぎだわ。
ちなみにこのコードは++だとか+=だとか+====だとか、特殊なオペレーションやキー入力が含まれていないので、追って実装していきます。
計算のためのキューとは、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 件のコメント:
コメントを投稿