나는 강의에서 발행 된 과제를하려고 노력하고 있지만 물론 ... 나는 첫 번째 과제에 붙어있어 뭔가를 해결할 수 없으면 앞으로 나아갈 수 없다.저는 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 패러다임을 깨고 중지했습니다.
이미 제대로 구현하지 않았습니까? 당신이 실패했다고 말하는 경우 오타가 있는지 확실하지 않습니다. π 입력 π 입력 + π 입력 %. 코드 나 할당에서 %에 대한 설명이 보이지 않으므로 어떻게 작동하는지 예상 할 수 없습니다. –
@JeremyPope - 오타입니다. 나는 π 입력 π 입력 + π 입력 ÷ 2π/π와 같아야한다는 것을 의미했습니다. –