7

me gustaría saber cómo evaluar una representación de cadena de una ecuación como si fuera una verdadera ecuación:Convertir NSString de una ecuación matemática en un valor

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

quiero volver "falso" porque 15 +14 no es igual a 23. ¿Cómo puedo hacer que esto funcione?

+0

posible duplicado de [Escribir un analizador simple ecuación] (http://stackoverflow.com/questions/4582398/writing-a-simple-equation-parser) –

+0

Son estas cadenas procedentes de una fuente de datos, o ¿entrada del usuario? Tendrá que averiguar qué tipos de ecuación matemática desea admitir y luego ir desde allí. (es decir, qué operandos, cuántos operandos y si el usuario alguna vez escribirá ==) (¿Desea soporte para 1 * 1 * 1 * 1x1 * 1 = 1?) –

+0

La cadena vendrá de una fuente de datos fija, hay números del 0 - 20, ecuación (+ - * /) e igual (==) –

Respuesta

7

Aquí es un ejemplo de cómo hacerlo con NSPredicate:

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

La primera NSLog produce porque 11+2==3 es cierto; el segundo produce 0.

+0

@ Mitra: en el mismo espíritu se podría decir que Apple está siendo demasiado amable con los programadores perezosos al proporcionar el objetivo c en lugar del ensamblaje. Los programadores perezosos escriben código que es menos funcional/más problemático, no menos código – Dani

+0

@Mithras No creo que sea un caso de "ser agradable": los analizadores son difíciles de corregir, incluso por programadores "trabajadores" que usan el derecho herramientas. Apple ofrece una solución simple, fácil de aprender, para todos, ayuda al mundo al no generar analizadores mal escritos :) – dasblinkenlight

+0

+1 escribiendo un analizador matemático * correcto * es extremadamente difícil. –

3

Por lo tanto, este es un problema que creo que es mucho más complicado de lo que permite la pregunta vinculada (aunque la pregunta es pedir un analizador de ecuaciones "simple").

Afortunadamente para ti, creo que este es un problema realmente interesante y ya he escrito uno para ti: DDMathParser.

Tiene un good amount of documentation, incluyendo cosas como how to add it to your project y high overview of its capabilities. Es compatible con all of the standard mathematical operators, incluidos los operadores lógicos y de comparación (||, &&, ==, !=, <=, etc.).

En su caso, usted haría algo como esto:

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

Como un mano a mano, DDMathParser está disponible bajo la licencia MIT, que requiere que se incluyan la información de derechos de autor y el texto completo de la licencia en cualquier cosa que lo use.

+0

Apuesto a que nunca verás tu aviso de copyright en el software de nadie en iTunes. El mismo tipo de pereza que hace que una persona no quiera aprender a escribir un evaluador de expresiones también los inclinará a robarle. Ayudaría más a la sociedad proporcionando tutoriales en lugar de código completo. –

+0

@ Mitras en realidad, sé de varias personas que lo usan y están siguiendo la licencia correctamente. Y no es la "pereza" lo que disuade a las personas de escribir un evaluador de expresiones; es que es un * problema realmente difícil * si quieres que sea universalmente correcto. Según su argumento, Apple debería proporcionar tutoriales sobre cómo implementar el manejo táctil, la cadena de respuesta, la detección de rotación, etc., en lugar de simplemente proporcionarnos el marco UIKit. Sí, no va a suceder. –

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

Esto no es diferente de la respuesta de @ dasblinkenlight; Acaba de explotar las expresiones izquierda y derecha en lugar de permitir que 'NSPredicate' maneje la comparación por usted. –

+0

solo para compartir conocimientos. –

Cuestiones relacionadas