【问题标题】:Swift string task [duplicate]Swift字符串任务[重复]
【发布时间】:2021-05-11 17:03:05
【问题描述】:

我有一系列方程:

let tasks = ["11 + 14 = 25", "2 + 2 = 5"]

和功能

func checkTask(task: String) throws -> String 

应该:

  1. 如果等式正确,则返回“Ok”,否则返回“正确答案:..”
  2. 如果字符串不是方程式,则抛出错误,描述为“这不是方程式”

等式左边有两个数字,右边有一个数字。运算:加法和减法。

我该怎么做?

【问题讨论】:

  • 请添加一些您尝试过的代码。
  • 您要问的是如何编写一个计算数学表达式的函数。这是一项庞大而复杂的任务,并且远远超出了 SO 帖子的范围。如果您将其限制为“a + b = c”形式的表达式,并且 a、b 和 c 都是整数,那将非常简单,但这不是代码编写服务。您需要 1) 更具体地定义您的问题,并且 2) 尝试自己解决问题。

标签: swift string


【解决方案1】:

这是一个快速实现:它处理具有 2 个整数值和一个运算符的表达式,其中运算符为 +-*/。表达式看起来像<value> <operator> <value> = <value>。表达式左侧的值是整数,但右侧的值可以是浮点值。 (例如try? checkTask(task: "7 / 2 = 3.5") 将打印OK

如果您想做更高级的事情,我认为这可能是一个很好的起点。

enum Error: Swift.Error {
    case malformed
}
func checkTask(task: String) throws -> String {
    let operations = "*/+-"
    let split = task.replacingOccurrences(of: " ", with: "").split(separator: "=")
    guard let resultString = split.last,
          let expressionString = split.first else {
        throw Error.malformed
    }
    let expression = expressionString.split { character in
        operations.contains(character)
    }
    
    guard let operationString = expressionString.first(where: { operation in operations.contains(operation) }),
          let lhsString = expression.first,
          let rhsString = expression.last,
          let equationResult = Double(String(resultString)),
          let lhs = Double(lhsString),
          let rhs = Double(rhsString) else {
        throw Error.malformed
    }
    
    var operation: (Double, Double) -> Double
    switch operationString {
    case "+":
        operation = (+)
    case "-":
        operation = (-)
    case "*":
        operation = (*)
    case "/":
        operation = (/)
    default:
        throw Error.malformed
    }
    let result = operation(lhs, rhs)
    guard result == equationResult else {
        return "Correct answer: \(result)"
    }
    return "OK"
}
let tasks = ["11 + 14 = 25", "2 + 2 = 5"]
let first = try? checkTask(task: tasks.first!) // "OK"
let second = try? checkTask(task: tasks.last!) // "Correct answer: 4.0"

如果您想要描述错误,您必须自己进行修改。

【讨论】:

  • 不错的精益实施。您应该描述它可以处理和不处理的内容(看起来它处理具有 2 个值和一个运算符的表达式,(+,-,/*)但它不会处理 6 - 2 * 3 = 0 它不处理括号、指数等。
  • 是的,你是对的,它只是处理 OP 描述的用例。我将编辑我的答案!
  • 它处理具有 2 个整数值和一个运算符的表达式,其中运算符为 +-*/。表达式看起来像<value> <operator> <value> = <value>。表达式左侧的值是整数,但右侧的值可以是浮点值。
  • 谢谢先生,请允许我复制/粘贴!
猜你喜欢
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 2015-11-26
  • 2015-12-03
相关资源
最近更新 更多