7

chciałbym umieć ocenić ciąg znaków reprezentujący równaniem jakby to było prawdziwe równanie:Konwersja NSString równania matematyczne do wartości

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

chcę wrócić „false”, ponieważ 15 +14 nie równa się 23. Jak mogę to uruchomić?

+0

możliwe duplikat [Napisanie prostego równania parser] (http://stackoverflow.com/questions/4582398/writing-a-simple-equation-parser) –

+0

Czy te struny pochodzące ze źródła danych, lub dane wejściowe użytkownika? Będziesz musiał dowiedzieć się, jakie rodzaje równań matematycznych chcesz wspierać, a następnie stamtąd. (czyli jakie operandy, ile operandów i czy użytkownik kiedykolwiek napisze ==) (Czy potrzebujesz wsparcia dla 1 * 1 * 1 * 1x1 * 1 = 1?) –

+0

Łańcuch będzie pochodził ze stałego źródła danych, są Liczby od 0 - 20, równanie (+ - * /) i równe (==) –

Odpowiedz

7

Oto przykład jak to zrobić z NSPredicate:

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

Pierwszy NSLog produkuje 1 ponieważ 1+2==3 jest prawdą; drugi produkuje 0.

+0

@Mithras: w tym samym duchu można powiedzieć, że Apple jest zbyt miły dla leniwych programistów, zapewniając obiektyw c zamiast montażu. Leniwi programiści piszą kod, który jest mniej funkcjonalny/bardziej błędny, nie mniej kod – Dani

+0

@Mithras Nie sądzę, że jest to przypadek "bycia miłym": parsery są trudne do uzyskania, nawet przez "pracowitych" programistów używających właściwych przybory. Apple oferuje proste, łatwe do opanowania, rozwiązanie dla każdego, pomaga światu, nie rozmnażając słabo spisanych parserów :) – dasblinkenlight

+0

+1 pisanie * poprawnego * paralizatora matematycznego jest niezwykle trudne. –

3

Tak, to jest problem, który moim zdaniem jest dużo bardziej skomplikowana niż związane pytanie pozwala na (chociaż pytanie jest pytaniem o „proste” równanie parsera).

Na szczęście dla ciebie, myślę, że jest to naprawdę interesujący problem i napisałem już dla ciebie: DDMathParser.

Ma numer good amount of documentation, w tym rzeczy takie jak how to add it to your project i high overview of its capabilities. Obsługuje all of the standard mathematical operators, w tym operatorów logicznych i porównawczych (||, &&, ==, !=, <=, etc).

W twoim przypadku, można by zrobić coś takiego:

NSNumber *result = [@"15+14 == 23" numberByEvaluatingString]; 
if ([result boolValue] == YES) { 
    ....True statement.... 
} else { 
    .....False statement..... 
} 

jako heads-up, DDMathParser jest udostępniane na licencji MIT, który wymaga do zawierają informacje o prawach autorskich i pełny tekst licencja na wszystko, co jej używa.

+0

Założę się, że nigdy nie zobaczysz informacji o prawach autorskich w czyimś oprogramowaniu w iTunes. Ten sam rodzaj lenistwa, który powoduje, że dana osoba nie chce nauczyć się pisać ewaluatora wyrażenia, również skłoni je do okradania się od ciebie. Pomożesz społeczeństwu bardziej, dostarczając samouczki zamiast gotowego kodu. –

+0

@Mithras faktycznie, wiem o kilku ludziach, którzy go używają i odpowiednio przestrzegają licencji. I nie jest to "lenistwo", które zniechęca ludzi do pisania oceniającego ekspresję; jest to * naprawdę trudny problem *, jeśli chcesz, aby był on uniwersalny. Podsumowując, Apple powinien po prostu dostarczyć samouczki dotyczące implementacji obsługi dotykowej, łańcucha responderów, wykrywania rotacji itp. Zamiast dostarczania nam struktury UIKit. Tak, nie nastąpi. –

0
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); 
+0

Nie różni się to od odpowiedzi @ dasblinkenlight; Właśnie złamałeś lewe i prawe wyrażenia, zamiast pozwolić, aby 'NSPredicate' poradził sobie z porównaniem. –

+0

tylko dla kumpla dzielącego się wiedzą. –