简单的数学表达式从左到右解决了目标c

时间:2011-06-17 07:35:24

标签: iphone objective-c math

我只是在目标c NSString中有这个表达式:@“10 + 5 * 2”。 我想自动解决这个表达式,并找到了解决方案:

UIWebView *webView = [[UIWebView alloc] init];
NSString *result = [webView stringByEvaluatingJavaScriptFromString:expression];
NSLog(@"%@",result); 

以上效果很好,但结果却是:20。 实际上这评估“*”首先意味着首先它是5 * 2 = 10 + 10。 但我想删除这个优先级,只是希望每个运算符从左到右具有相同的优先级,以便答案可以是10 + 5 = 15 * 2 = 30.

虽然编写自己的函数是最后一个选项,但我真的不想弄乱字符串函数。我想使用内置的东西。

谢谢,

** * ** * * 工作解决方案 * ** * ****

感谢您对Eiko和Ozair的所有帮助! 基于他们的答案,我写了一堆代码,对我来说非常合适!

NSString *expression = lblBox.text; // Loads the original expression from label.
    expression = [expression stringByReplacingOccurrencesOfString:@"+" withString:@")+"];
    expression = [expression stringByReplacingOccurrencesOfString:@"-" withString:@")-"];
    expression = [expression stringByReplacingOccurrencesOfString:@"*" withString:@")*"];
    expression = [expression stringByReplacingOccurrencesOfString:@"/" withString:@")/"];


    NSUInteger count = 0, length = [expression length];
    NSRange range = NSMakeRange(0, length); 

    while(range.location != NSNotFound)
    {
        range = [expression rangeOfString: @")" options:0 range:range];
                 if(range.location != NSNotFound)
                 {
                     range = NSMakeRange(range.location + range.length, length - (range.location + range.length));
                     count++; 
                 }
    }

    for (int i=0; i<count; i++) {
        expression = [@"(" stringByAppendingString:expression];
    }


    UIWebView *webView = [[UIWebView alloc] init];
    NSString *result = [webView stringByEvaluatingJavaScriptFromString:expression];
    [webView release];
    NSLog(@"%@ = %@",expression, result);

3 个答案:

答案 0 :(得分:6)

不确定它是否与@Ozair Kafray说的相同......

对于附加到字符串的每个运算符,首先添加)并在开头添加匹配的(。即。

10
(10 ) +
(10 ) + 5
((10 ) + 5 ) *
((10 ) + 5 ) * 2

确保删除操作符时也要删除括号。

答案 1 :(得分:3)

我知道没有内置的方法可以做到这一点。我想你只需卷起袖子写一个功能。如果您想使用objective-c,请使用NSScanner。

答案 2 :(得分:3)

从您在评论中回答我的问题,您在输入过程中生成字符串。我建议你在每个操作数之后添加一个括号,除了第一个操作数。

因此,您不必在10之后向字符串添加任何内容,然后添加运算符+。之后,对于5的每个操作数,在字符串的开头添加一个右括号)和一个对应的左括号(。同样在2之后。这样您就不必编写自己的任何东西来处理字符串了。