我正在寻找创建一个函数,它返回一个可以在head中执行的数学方程式(显然这有点主观,但我不确定如何用它来表达它)。
我想使用操作+, - ,*,/,%和()。
目前我有这个功能:
func createMathString() -> String{
let firstNum = Int(arc4random_uniform(300))
let secNum = Int(arc4random_uniform(300))
let exp = Int(arc4random_uniform(4))
print("\(firstNum) \(self.expressions[exp]) \(secNum)")
return "\(firstNum) \(self.expressions[exp]) \(secNum)"
}
其中self.expression是一个包含+, - ,*,/的数组。
此函数返回一个字符串,然后使用此函数解释该字符串:
let question = createMathString()
let mathExpression = NSExpression(format: question)
let mathValue = mathExpression.expressionValue(with: nil, context: nil) as? Int
我的问题:
1)随着数字越来越高,除法和乘法越来越难
2)我不确定是否必须添加()。 (并非每个问题都由它们组成,取决于术语的数量。
3)我希望问题很容易在某些人的头脑中完成但不容易,我将随机数减少到0-50。
我找了一个可能的API但找不到符合我需要的API。
答案 0 :(得分:3)
我开始使用Turbo Pascal编程,正如Niklaus Wirth所说:Algorithms + Data Structure = Programs。您需要定义适合您的程序的数据结构。
首先,一些基本的数据结构。 (Swift枚举比其他语言强大得多)
factory = RequestHandlerFactory(GUI)
with ServerUseFactory((HOST, PORT), factory.start) as server:
server.serve_forever()
现在是主要班级:
enum MathElement : CustomStringConvertible {
case Integer(value: Int)
case Percentage(value: Int)
case Expression(expression: MathExpression)
var description: String {
switch self {
case .Integer(let value): return "\(value)"
case .Percentage(let percentage): return "\(percentage)%"
case .Expression(let expr): return expr.description
}
}
var nsExpressionFormatString : String {
switch self {
case .Integer(let value): return "\(value).0"
case .Percentage(let percentage): return "\(Double(percentage) / 100)"
case .Expression(let expr): return "(\(expr.description))"
}
}
}
enum MathOperator : String {
case plus = "+"
case minus = "-"
case multiply = "*"
case divide = "/"
static func random() -> MathOperator {
let allMathOperators: [MathOperator] = [.plus, .minus, .multiply, .divide]
let index = Int(arc4random_uniform(UInt32(allMathOperators.count)))
return allMathOperators[index]
}
}
用法:
class MathExpression : CustomStringConvertible {
var lhs: MathElement
var rhs: MathElement
var `operator`: MathOperator
init(lhs: MathElement, rhs: MathElement, operator: MathOperator) {
self.lhs = lhs
self.rhs = rhs
self.operator = `operator`
}
var description: String {
var leftString = ""
var rightString = ""
if case .Expression(_) = lhs {
leftString = "(\(lhs))"
} else {
leftString = lhs.description
}
if case .Expression(_) = rhs {
rightString = "(\(rhs))"
} else {
rightString = rhs.description
}
return "\(leftString) \(self.operator.rawValue) \(rightString)"
}
var result : Any? {
let format = "\(lhs.nsExpressionFormatString) \(`operator`.rawValue) \(rhs.nsExpressionFormatString)"
let expr = NSExpression(format: format)
return expr.expressionValue(with: nil, context: nil)
}
static func random() -> MathExpression {
let lhs = MathElement.Integer(value: Int(arc4random_uniform(10)))
let rhs = MathElement.Integer(value: Int(arc4random_uniform(10)))
return MathExpression(lhs: lhs, rhs: rhs, operator: .random())
}
}