#21 計算機 APP

近期應徵某某公司時出的考試題目,條件為做出加、減、乘、除、階乘,剛好之前沒做過趁這個機會練習一下。

使用功能

加、減、乘、除
小數運算
階乘
多項式運算

功能介紹

所有 Button 都使用 Outlet Collection,使用起來較方便,不用拉太多 IBOutlet,利用 for 迴圈讀取每個 Button,在 viewDidLoad 中使用程式將 Button 圓角化,由於有在 storyboard 設定 auto layout,所以圓角就設定 Button 邊長度的 1/2(確保每個尺寸的 button 都是圓形)

輸入數字的部分,我將數字鍵都連結到以下同個 IBAction,並設定 tag,0 的 button 就設定 0,以此類推,由於這部分與數字都一樣,所以不至於搞混 tag 幾是哪個 button

宣告一個 Bool 變數來判斷是否輸入第一位數,例如在計算機先按下數字 1後,dialFirstDigit 變數就會變為 false,代表已經不是輸入第一位數,接著按下數字 2 後,numberLabel 需顯示為 12,而不是 2。

接著在 else 中要先判斷第一個數字是否為零,例如按下數字鍵 0 與 1,會顯示 1 而不是 01。

加、減、乘、除

運算子的 button 也是設定 tag ,然後使用 switch 來判斷觸發哪個 button

計算方式使用 NSExpression,將字串轉換為數學運算式,然後使用 expressionValue 得到答案,此功能放在等於 Button 的 Action 中,使用方法先宣告一個 equation 字串,每輸入一個數字或運算子就會存入 equation 中,例如 “1 + 1”,按下等於後 NSExpression 就可計算此字串得出 expressionValue,由於計算出的答案或運算數字有可能是小數,因此將解答轉型為 Double

另外有擴充四捨五入與無條件捨去的 function 在 Double 中

使用 truncatingRemainder 取餘數,因為計算過程全程都是 Double,即使計算出答案為整數也會顯示小數點,例如 2.0 ,因此計算答案為整數時必須將整數第一位後無條件捨去

小數點四捨五入的部分取到小數點後第六位

if calculateResult.truncatingRemainder(dividingBy: 1) == 0 {
numberLabel.text = String(calculateResult.floor(toInteger: 1))
} else {
numberLabel.text = String(calculateResult.rounding(toDecimal: 6))
}

參考:

小數運算

小數點的 Button 另外設一個 Action,除了在上方數字欄位顯示 “ . “ 以外,也要將判斷輸入第一位數的變數 dialFistDigit 更改為 false,與判斷是否為小數的變數 decimals 更改為 true

Bool 的變數 decimals 判斷如果不是小數而是整數時,後面需要自動加上 “ .0 “ ,在前面說明 NSExpression 時有提到計算出的答案轉型為 Double,因此如果是整數 Int 需加上 .0 才能計算

var doubleNum: String
if decimals == false {
doubleNum = ".0"
} else {
doubleNum = ""
}

階乘

階乘計算方式例如:3! = 3 × 2 × 1 = 6,條件為只能是整數,還有很重要的是 0! = 1 而不是 0,如果輸入小數會跳出 UIAlertController 警告視窗

case 1: //階乘
result = 1
if decimals == true {
showAlert()
} else {
if let factorialNum = Int(numberLabel.text!) {
if factorialNum != 0 {
for num in 1...factorialNum {
result *= num
}
}
}
numberLabel.text = String(result)
}

多項式運算

如前面提到使用 NSExpression 計算,在按下等於之前,字串變數 equation 中就可以不斷擴充數字與運算子,而且好處是會自動進行 “ 先乘除後加減 ”,不用多煩惱要怎麼處理這個問題

--

--