首页 > 解决方案 > 如何在计算器应用程序中管理计数优先级计算?(迅速)

问题描述

我正在为学校做一个计算器我完成了所有事情,但最后计算的优先级没有得到尊重,例如当我这样做时:2 + 2 * 2 它应该是 6,但在我的应用程序中它告诉我 8,任何人都有一个想法我怎样才能做到这一点 ?你会在我的代码中找到我的模型和我的控制器:

class viewControllerUtilities: UIViewController {
    var stringNumbers: [String] = [String()]
    var operators: [String] = ["+"]
    var formerResult: Double?
    var index = 0

    var isExpressionCorrect: Bool{
        if let stringNumber = stringNumbers.last{
            if stringNumber.isEmpty{
                if stringNumbers.count == 1 {
                    return false
                }
                return false
            }
        }
        return true
    }

    var canAddOperator: Bool {
        if let stringNumber = stringNumbers.last{
            if stringNumber.isEmpty && formerResult == nil{
                return false
            }
        }
        return true
    }

    var canAddDecimal: Bool{
        if let strings = stringNumbers.last{
            if strings.contains(".") || strings.isEmpty{
                return false
            }
        }
        return true
    }

    func addDecimal(){
        if let stringNumber = stringNumbers.last{
            var stringNumberDecimal = stringNumber
            stringNumberDecimal += "."
            stringNumbers[stringNumbers.count-1] = stringNumberDecimal
        }
    }

    func calculateTotal() -> Double{
        var total : Double = 0
        for (i, stringNumber) in stringNumbers.enumerated(){
            if let number = Double(stringNumber){
                switch operators[i]{
                case "+":
                    total += number
                case "-":
                    total -= number
                case "x":
                    total *= number
                case "/":
                    total /= number
                default:
                    break
                }
            }
        }
        formerResult = total
        clear()
        return total

    }

    func clear(){
        stringNumbers = [String()]
        operators = ["+"]
        index = 0
    }

    func allClear(){
        clear()
        formerResult = nil
    }

    func sendOperand(operand: String, number: String) {
        operators.append(operand)
        stringNumbers.append(number)
    }
    func addNewNumber(_ newNumber: Int){
        if let stringNumber = stringNumbers.last{
            var stringNumberMutable = stringNumber
            stringNumberMutable += "\(newNumber)"
            stringNumbers[stringNumbers.count-1] = stringNumberMutable
        }
    }

    func roundResult(_ result: Double?){
        if roundEvaluation(result!){
            let rounded = Int(result!)
            stringNumbers = ["\(rounded)"]
            formerResult = nil
        }
    }

    func roundEvaluation(_ result: Double) -> Bool{
        if result.truncatingRemainder(dividingBy: 1) == 0{
            return true
        }
        return false
    }
}

和我的控制器:

class ViewController: UIViewController {
    // MARK: - Properties
    var CountOnMeU = viewControllerUtilities()


    // MARK: - Outlets

    @IBOutlet weak var textView: UITextView!
    @IBOutlet var numberButtons : [UIButton]!
    @IBOutlet var operators: [UIButton]!
    @IBOutlet weak var point: UIButton!

    // MARK: - Action
    @IBAction func tappedNumberButton(_ sender: UIButton) {
        for (i, numberButton) in numberButtons.enumerated() where sender == numberButton{
            CountOnMeU.addNewNumber(i)
            updateDisplay()
        }
    }

    @IBAction func tappedPointButton(_ sender: Any){
        if CountOnMeU.canAddDecimal{
            CountOnMeU.addDecimal()
            updateDisplay()
        } else {
            showAlert(message: "Vous ne pouvez pas mettre 2 points")
        }

    }

    @IBAction func equal() {
        if !CountOnMeU.isExpressionCorrect{
            showAlert(message: "opération invalide")
        } else {
            let total = CountOnMeU.calculateTotal()
            textView.text! += "\n =\(total)"
        }
    }

    @IBAction func operandButtonTapped(_ sender: UIButton){
       performOperation(operand: (sender.titleLabel?.text!)!)
    }

    @IBAction func allClear(_ sender: UIButton) {
        CountOnMeU.allClear()
        textView.text = "0"
    }


    // MARK: - Methods
    func addNewNumber(message: String){
        let alertVC = UIAlertController(title: "Erreur", message: message, preferredStyle: .alert)
        alertVC.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil))
        self.present(alertVC, animated: true, completion: nil)
    }

    func updateDisplay() {
        var text = ""
        let stack = CountOnMeU.stringNumbers.enumerated()
        for (i, stringNumber) in stack {
            // Add operator
            if i > 0 {
                text += CountOnMeU.operators[i]
            }
            // Add number
            text += stringNumber
        }
        textView.text = text
    }

    func showAlert(message: String){
        let AlertVC = UIAlertController(title: "Erreur", message: message, preferredStyle: .alert)
        AlertVC.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil))
        self.present(AlertVC,animated: true, completion: nil)
    }

    func performOperation(operand: String){
        if CountOnMeU.canAddOperator{
            let result = CountOnMeU.formerResult
            if result != nil {
                CountOnMeU.roundResult(result)
                updateDisplayForResultReuse(operand: operand)
            } else {
                CountOnMeU.sendOperand(operand: operand, number: "")
                updateDisplay()}
        } else {
                self.showAlert(message: "Expression incorrecte")
            }
    }

    func updateDisplayForResultReuse(operand: String){
        updateDisplay()
        CountOnMeU.sendOperand(operand: operand, number: "")
        updateDisplay()
    }
}

标签: iosswift

解决方案


推荐阅读