Objective c 将数学方程的字符串转换为值

Objective c 将数学方程的字符串转换为值,objective-c,cocoa,cocoa-touch,nsstring,expression-evaluation,Objective C,Cocoa,Cocoa Touch,Nsstring,Expression Evaluation,我想知道如何评估方程的字符串表示,就像它是一个真实的方程一样: if(@"15+14==23") { //True statement... } else { //False statement.... } 我想返回“false”,因为15+14不等于23。我如何才能让它工作?下面是一个如何使用NSPredicate的示例: NSPredicate *p = [NSPredicate predicateWithFormat:@"1+2==3"]; NSLog(@"%d", [p

我想知道如何评估方程的字符串表示,就像它是一个真实的方程一样:

if(@"15+14==23")
{
    //True statement...
}
else
{
    //False statement....
}

我想返回“false”,因为15+14不等于23。我如何才能让它工作?

下面是一个如何使用
NSPredicate
的示例:

NSPredicate *p = [NSPredicate predicateWithFormat:@"1+2==3"];
NSLog(@"%d", [p evaluateWithObject:nil]);
p = [NSPredicate predicateWithFormat:@"1+2==4"];
NSLog(@"%d", [p evaluateWithObject:nil]);

第一个
NSLog
生成
1
,因为
1+2==3
为真;第二个问题产生
0

,因此,我认为这个问题比链接的问题复杂得多(尽管这个问题需要一个“简单”的方程解析器)

幸运的是,我认为这是一个非常有趣的问题,并且已经为您编写了一个:


它有一个,包括和。它支持,包括逻辑运算符和比较运算符(
|
和&
=
!=
这些字符串是否可能来自数据源或用户输入?您需要弄清楚要支持哪种类型的数学方程,然后从那里开始。(即什么操作数、多少个操作数以及用户是否会键入==)(是否支持1*1*1*1x1*1=1?)字符串将来自固定数据源,有0-20之间的数字、等式(+-*/)和相等(=)我们正在尝试创建一款类似拼字游戏的数学方程式游戏。请看我的答案@Mitras:本着同样的精神,你可以说苹果对懒惰的程序员太好了,因为它提供的是objective c而不是assembly。懒惰的程序员编写的代码功能更少、错误更多,而不是更少code@Mithras我不认为这是一个“友善”的例子:即使是“勤奋”的程序员使用正确的工具,解析程序也很难正确。苹果公司为每个人提供了一个简单、易学的解决方案,这有助于世界,因为它不会产生写得很差的解析程序:)@Dani我觉得你好像不想学习和成长。这是典型的对编程不太认真的人。@dasblinkenlight写一个基本的数学表达式解析器并不难,努力提高人们对计算机科学的理解和欣赏。@Mitras虽然写一个解析并不难r、 最好在你还在读高中或大学的时候把它作为练习来做。我自己写了十几个解析器,按照最实用的标准,我的前三四个都是一次性代码。我的观点是,学习练习和生产代码最好分开。我敢打赌,你永远不会在任何人身上看到你的版权声明iTunes上的软件。同样的懒惰导致人们不想学习如何编写表达式计算器,这也会使他们倾向于从你那里偷东西。你可以通过提供教程而不是完整的代码来帮助社会。@Mitras事实上,我知道有几个人在使用它,并且正确地遵循许可证这不是“懒惰”这阻止了人们编写表达式计算器;如果你想让它普遍正确,这是一个非常困难的问题。根据你的观点,苹果应该提供如何实现触摸处理、响应链、旋转检测等的教程,而不仅仅是给我们UIKit框架。是的,不会发生。这与@dasblinkenlight的答案没有什么不同;您只是将左右表达式分开,而不是让
NSPredicate
为您处理比较。只是为了分享知识。
NSNumber *result = [@"15+14 == 23" numberByEvaluatingString];
if ([result boolValue] == YES) {
  ....True statement....
} else {
  .....False statement.....
}
NSString *equation = @"15+14==29";


NSPredicate *pred = [NSPredicate predicateWithFormat:equation];

NSExpression *LeftExp = [pred leftExpression];

NSExpression *RightExp = [pred rightExpression];    


NSNumber *left = [LeftExp expressionValueWithObject:nil context:nil];

NSNumber *right = [RightExp expressionValueWithObject:nil context:nil];


if ([left isEqualToNumber:right]) {
    NSLog(@"yes left is equal to right");
}
else{
    NSLog(@"yes left is NOT equal to right");

}

NSLog(@"left %@", left); 

NSLog(@"right %@", right);