2015-02-06 6 views
0

나는 강의에서 발행 된 과제를하려고 노력하고 있지만 물론 ... 나는 첫 번째 과제에 붙어있어 뭔가를 해결할 수 없으면 앞으로 나아갈 수 없다.저는 Swift를 위해 방금 발표 된 CS193p 강의를 따라 계산기 앱을 만들고 있습니다. Pi를 피연산자와 연산으로 어떻게 구현할 수 있습니까?

과 피연산자로 모두 π를 구현하는 데 문제가 있습니다. 나는 그것을 연산 (모든 것은 π의 값을 반환한다)으로 작동하도록한다. 예 : 6.28에 결과를 '은 π가 π가 + Enter를 입력합니다'...하지만 난 을 말한다면 '는 π가 π가 + π 엔터 입력 ÷'가 1.0 결과을가 2.0

내가 '해야 할 때 StackOverflow를 검색하여 Objective-C 솔루션을 제외하고는 아무 것도 발견하지 못했습니다. 도움을 주시면 감사하겠습니다.

 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 
} 

참고 : 여기에

 @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 
        } 
       } 
      }  

모델에서 코드입니다 : 나는 과제의를 완료하기 위해 노력하고있어 여기에

는 작업을 탭합니다의 ViewController에서 트리거되는 액션입니다 강사가 따라야 할 구조에서 주어진 필수 작업. 여기에있는 (연산자를 Π로 추가하려고 시도한) 시도는 특정 상황에서만 가능하지만 모든 상황에서 작동하지는 않습니다 ...

다음은이 작업에 대한 할당입니다 : "π 값은 M_PI 표현식을 통해 사용할 수 있습니다. 예 : x = M_PI라고하면 π는 피연산자으로 생각할 수도 있고 연산 (즉, 스택에서 인수를 취하지 않고 값을 반환하는 새로운 종류의 연산)이라고 생각할 수 있습니다. 그러나 어느 쪽이든 최소한의 코드로 다른 상수를 계산기에 추가 할 수 있다면 좋을 것입니다. "

필자는 피연산자 접근법을 시도했지만 MVC 패러다임을 깨고 중지했습니다.

+0

이미 제대로 구현하지 않았습니까? 당신이 실패했다고 말하는 경우 오타가 있는지 확실하지 않습니다. π 입력 π 입력 + π 입력 %. 코드 나 할당에서 %에 대한 설명이 보이지 않으므로 어떻게 작동하는지 예상 할 수 없습니다. –

+0

@JeremyPope - 오타입니다. 나는 π 입력 π 입력 + π 입력 ÷ 2π/π와 같아야한다는 것을 의미했습니다. –

답변

1

π를 눌러 입력하면 효과적으로 opStack에 pi를 두 번 넣을 수 있습니다. 그래서 당신은 실제로 π π π π + π π ÷하고 있습니다. 말이 돼? pi를 그 자체에 추가하려면 π π +를 누르십시오. pi를 더하고 pi로 나누려면, π π + π ÷가됩니다.

+0

나는 Swift에 대한 서브 레딧에도이 질문을 올렸고 거의 똑같은 반응을 보였다. 이유는 모르겠지만 각 π 후에 ** Enter **를 눌러야한다는 인상하에있었습니다. 도움 주셔서 감사합니다. –