我正在尝试完成讲座中发布的作业,但当然......我坚持第一次作业,我讨厌前进而不能解决问题。
我在实现π作为操作和以及操作数时遇到问题。我把它作为一个操作(它只是返回π的值)。例如。 'π输入π输入+' 会产生6.28 ...但如果我说 'π输入π输入+π输入÷' 当它应该是2.0时,它会产生1.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范例,所以我停止了。
答案 0 :(得分:1)
如果你按π然后输入,那么你实际上是将pi放入opStack两次。所以你实际上做的是ππππ+ππ÷。那有意义吗?为了将pi添加到自身,你会推动ππ+。如果你想将pi加在一起然后除以pi,它将是ππ+π÷。