I'我按照刚刚为Swift发布的CS193p讲座创建了一个计算器应用程序.如何将Pi同时实现为操作数&以



我正在努力完成课堂上的作业,但当然。。。我被困在第一项任务上,我讨厌在没有解决问题的情况下继续前进。

我在将π同时实现为运算以及操作数时遇到问题。我把它当作一个运算(它所做的只是返回π的值)。例如,"π输入πEnter+"结果为6.28……但如果我说‘π输入πEnter+πEnter÷’,结果为1.0,而应为2.0

我搜索了StackOverflow,除了Objective-C解决方案之外,什么也没找到。感谢您的帮助。

以下是点击操作时在ViewController中触发的操作:

        @IBAction func operate(sender: UIButton) {
                let operand = sender.currentTitle!
                if (userIsInTheMiddleOfTypingANumber){
                    enter()
                }
                if let operation = sender.currentTitle{
                    if let result = brain.performOperation(operation){
                        displayValue = result
                    } else {
                        displayValue = 0
                    }
                }
            }    

这是模型的代码:

        private enum Op: Printable  {
    case Operand(Double)
    case UnaryOperator(String, Double -> Double)
    case BinaryOperator(String, (Double, Double) -> Double)
    case ConstantOperator (String, Double)
    var description: String {
        get {
            switch self {
            case .Operand(let operand):
                return "(operand)"
            case .UnaryOperator(let symbol, _ ):
                return symbol
            case .BinaryOperator(let symbol, _ ):
                return symbol
            case .ConstantOperator(let symbol, _ ):
                return symbol
            }
        }
    }
}
func performOperation(symbol: String) -> Double?  {
    if let operation = knownOps[symbol]{
        opStack.append(operation)
    }
    return evaluate()
}
private var opStack = [Op]()
private var knownOps = [String:Op]()
init(){
    func learnOp(op: Op){
        knownOps[op.description] = op
    }
    learnOp(Op.BinaryOperator("✕", *))
    //knownOps["✕"] = Op.BinaryOperator("✕", *)
    knownOps["÷"] = Op.BinaryOperator("÷") {$1 / $0}
    knownOps["+"] = Op.BinaryOperator("+", +)
    knownOps["−"] = Op.BinaryOperator("−") {$1 - $0}
    knownOps["√"] = Op.UnaryOperator("√", sqrt)
    learnOp(Op.UnaryOperator("cos", cos))
    learnOp(Op.UnaryOperator("sin", sin))
    learnOp(Op.ConstantOperator("∏", M_PI))
}
private func evaluate(ops: [Op]) -> (result: Double?, remainingOps: [Op]){
    if !ops.isEmpty {
        var remainingOps = ops
        let op = remainingOps.removeLast() //get the first op off the stack
        switch op {
        case .Operand(let operand):
            return (operand, remainingOps)
        case .UnaryOperator(_, let operation):
            let operationEvaluation = evaluate(remainingOps)
            if let operand = operationEvaluation.result {
                return(operation(operand), operationEvaluation.remainingOps)
            }
        case .BinaryOperator(_ , let operation):
            let op1Eval = evaluate(remainingOps)
            if let op1 = op1Eval.result{
                let op2Eval = evaluate(op1Eval.remainingOps)
                if let op2 = op2Eval.result {
                    return (operation(op1, op2), op2Eval.remainingOps)
                }
            }
        case .ConstantOperator(_, let value):
            return(value, remainingOps)
        }
    }
    return(nil, ops)
}
func evaluate() -> Double? {
    let (result, remainder) = evaluate(opStack)
    println("(opStack) = (result) with (remainder) left over.")
    return result
}

注意:我正在努力完成作业中要求的任务,给定教练希望我们遵循的结构。我在这里的尝试(试图添加π作为运算符)在某些情况下有效,但不是所有情况。。。

以下是作业对这项任务的说明:"π的值可以通过表达式M_PI获得。例如,让x=M_PI。你可以把π看作一个操作数,也可以把它看作一个操作(即一种新的操作,它不从堆栈中取任何参数,但返回一个值)。由你自己决定。但是,无论哪种方式,都可以用最少的代码将其他常数添加到计算器中。"

我尝试了操作数方法,但我打破了MVC范式,所以我停止了。

如果按π并输入,则实际上是在opStack中放入π两次。所以你实际上是在做πππ+ππ÷。这有道理吗?为了给π本身加上π,你可以推ππ+。如果你想把π加在一起,然后除以π,它将是ππ+π÷。

最新更新