Простое математическое выражение решить в задаче c слева направо - PullRequest
4 голосов
/ 17 июня 2011

У меня просто есть это выражение в цели 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.

Хотя написание собственной функции - последний вариант, но я действительно не хочу портить строковые функции. Я хотел бы использовать что-то встроенное.

Спасибо

******* Рабочий раствор ********

Спасибо за вашу помощь, Эйко и Озаир! Основываясь на их ответах, я написал этот пакет кода, который отлично работает для меня!

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 ]

6 голосов
/ 17 июня 2011

Не уверен, что это так же, как @ Озаир Кафрай говорит ...

Для каждого оператора, который вы добавляете в строку, сначала добавьте ) и добавьте соответствующий ( в начале. * 1007 Т.е. *

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

Просто убедитесь, что при удалении оператора также удаляются также круглые скобки.

3 голосов
/ 17 июня 2011

Начиная с вашего ответа на мой вопрос в комментариях, вы генерируете строку во время ввода. Я бы предложил добавить круглые скобки после каждого операнда, кроме первого.

То есть вы ничего не добавляете в строку после 10, тогда добавляется оператор +. После этого для каждого операнда 5 добавьте закрывающую скобку ) и соответствующую открывающую скобку ( в начало строки. Аналогично после 2. Таким образом, вам не придется писать что-то свое для обработки строки.

3 голосов
/ 17 июня 2011

Нет встроенного способа сделать это, о котором я знаю.Я думаю, вам просто нужно засучить рукава и написать функцию.Если вы хотите использовать target-c, используйте NSScanner.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...