Подтвердить что ты не робот

Как оценить строковое уравнение в ios

Есть ли способ решить строковые уравнения в ios?

Например

Input:

NSString * str [email protected]"1+2";

Вывод:

NSInteger result = 3//i.e сумма 1 + 2 из str

Как это сделать и получить ожидаемый результат!

Пожалуйста, помогите!

4b9b3361

Ответ 1

Вы можете использовать NSExpression для этого:

NSExpression *expression = [NSExpression expressionWithFormat:@"1+2"];
NSLog(@"%@", [expression expressionValueWithObject:nil context:nil]);

Для получения дополнительной информации ознакомьтесь с документацией по используемым методам.

Ответ 2

Если ваши математические выражения достаточно просты, вы можете пойти по ручному маршруту, как это предложил Раджан Балана.

Чтобы оценить более сложные выражения, вы можете использовать /abuse NSPredicate в сочетании с NSExpression, как описано в этом сообщении в блоге: http://funwithobjc.tumblr.com/post/1553469975/abusing-nspredicate

Обратите внимание, что NSPredicate необходимо только в том случае, если ваш вход действительно является уравнением (включая правую часть):

NSPredicate* parsedExpression = [NSPredicate predicateWithFormat:@"1+2=x"];
NSExpression* leftPart = [(NSComparisonPredicate*)parsedExpression leftExpression];
NSNumber* evaluatedResult = [leftPart expressionValueWithObject:nil context:nil];
NSLog(@"Expr:%@", evaluatedResult);

Чтобы добиться правильного разбора, вы можете использовать один из парсеров математики для Objective-C. Я не использовал их сам, но популярные, кажется,

Ответ 3

Используйте это:

NSString * str [email protected]"1+2";

NSArray *arr = [str componentsSeparatedByString:@"+"];
int sum = 0;
for (int i = 0; i < [arr count]; i++) {
    sum += [[arr objectAtIndex:i] intValue];
}
NSLog(@"sum : %d",sum); 

Выход: sum = 6

Вы также можете использовать NSExpression.

Выражения являются ядром реализации предиката. Когда вызывается выражениеValueWithObject:, выражение оценивается и возвращается значение, которое затем может обрабатываться оператором. Выражения могут быть любыми: от констант до вызовов метода. Scalaры должны быть обернуты в соответствующие классы NSValue.

Пример:

    NSLog(@"sum : %@", [[NSExpression expressionWithFormat:@"1+4"] expressionValueWithObject:nil context:nil]);
Output :- sum : 5
    NSLog(@"mulitple : %@", [[NSExpression expressionWithFormat:@"2*4"] expressionValueWithObject:nil context:nil]);
Output :- mulitple : 8

Надеюсь, это поможет вам.

Ответ 4

Что вы можете сделать, вы можете получить компоненты строки, разделенные знаком "+", используя этот метод, а затем вы получите массив компонентов, то есть 1,2.

NSArray* foo = [str componentsSeparatedByString: @"+"];

int result = [[foo objectAtIndex:0] integerValue] + [[foo objectAtIndex:1] integerValue];

а затем вы можете использовать целочисленное значение для этих двух элементов и добавить их и сохранить результат в целочисленной переменной.

Ответ 5

Я думаю, вам нужно subString вашу строку и сохранить каждое число в новой переменной NSstring (integerValue) или Integer.

Пример:

NSString *str = @"1+2";
    int x = [[str substringToIndex:1]integerValue];
    int y = [[str substringFromIndex:1]integerValue];
    int z = x+y;
    NSLog(@"Sum === %d",z);

Ответ 6

Зависит от сложности ваших уравнений входной строки. Вы можете использовать алгоритм Shunting-yard для анализа математических уравнений, а затем вычислить уравнение из Abstract Syntact Tree (AST)

Но я ожидаю, что вы ищете небольшое, желательно уже готовое решение. В этом случае вы можете попробовать один из них (нет гарантии, я не пробовал эти, просто googled):