J'aimerais savoir comment évaluer une représentation de chaîne d'une équation comme s'il s'agissait d'une équation réelle: je veux retourner "false" car 15 + 14 ne sont pas égaux 23. Comment puis-je obtenir cela pour travailler? P> p>
3 Réponses :
Voici un exemple de comment le faire avec le premier nspredicate code>:
nslog code> produit
1 code > parce que
1 + 2 == 3 code> est vrai; La seconde produit
0 code>. p> p>
@Mithras: Dans le même esprit, vous pouvez dire que Apple est trop gentil avec les programmeurs paresseux en fournissant à l'objectif C au lieu de l'assemblage. Les programmeurs paresseux écrivent du code qui est moins fonctionnel / plus de buggy, pas moins de code
@Mithras Je ne pense pas que ce soit un cas de "être gentil": les analyseurs sont difficiles à obtenir, même par des programmeurs "actifs du travail" utilisant les bons outils. Apple offre une solution simple, facile à apprendre, solution pour tout le monde aide le monde en ne reproduisant pas d'analyseurs mal écrites :)
@Dani Cela me semble que vous ne voulez pas apprendre et grandir. C'est typique des personnes qui ne sont pas trop sérieuses sur la programmation.
@dasblinkenlight Ce n'est pas si difficile d'écrire un analyseur d'expression mathématique de base et de rendre l'effort améliore sa compréhension et son appréciation de l'informatique.
@Mithras Bien qu'il ne soit pas difficile d'écrire un analyseur, il est préférable de le faire comme un exercice pendant que vous êtes toujours dans un lycée ou dans une université. J'ai écrit plus d'une douzaine d'analyseurs moi-même, et mes trois premiers ou quatre premiers ont été un code de jeton par la plupart des normes pratiques. Mon point est que les exercices d'apprentissage et le code de production sont mieux conservés.
@Mithras, il n'est peut-être pas difficile d'écrire un analyseur de base, mais dès que vous souhaitez écrire un qui gère correctement l'associativité de l'opérateur, l'exponenciation et la négation, les choses obtiennent vraiment i> compliqué. Même nspredicate code> obtient des choses mal.
@Mithras: J'ai écrit assez d'échelles pour apprendre et grandir sur ce sujet. Cependant, je n'utiliserai pas un Manuall One lorsque Nspredicate est disponible, tout comme vous n'écrirez pas votre propre fonction d'impression formatée lorsque PrintF est disponible.
@Punataroropuhnchaturaphit qu'en est-il? C'est un prédicat valide, ce n'est tout simplement pas évident ce qu'il fait.
@Punataroropuhnchaturaphit Il ne ressemble pas à l'analyseur du PredicatewithFormat: Code> est suffisamment intelligent pour analyser les conditions sur les booléens: il ne parle pas d'analyser
(1 <2) == (3 <4) < / code> aussi. Il gère des entiers ok, cependant.
Utilisation de Nsexpression code> pour cela semble être plus proche du problème. Stackoverflow.com/Questtions/16785873/...
Donc, c'est un problème que je crois que c'est beaucoup plus compliqué que la question liée ne le permet (bien que la question demande un "simple" analyse d'équation).
Heureusement pour vous, je pense que c'est un Problème vraiment intéressant et déjà écrit un pour vous: ddmathparser code>
. P >
Il a un Bon montant de la documentation , y compris des éléments tels que Comment l'ajouter à votre projet et un aperçu élevé de ses capacités . Il prend en charge Tous les opérateurs mathématiques standard , y compris les opérateurs logiques et comparatifs ( Dans votre cas, vous feriez quelque chose comme ceci: p> comme une tête up, | | code>,
&& code>,
== code>,
! = code>,
<= code>, etc.). p>
ddmathparser code> est mis à disposition sous le Licence MIT, qui nécessite que vous incluez les informations sur le droit d'auteur et le texte intégral de la licence dans tout ce qui l'utilise. P> p>
Je parierais que vous ne verrez jamais votre avis de copyright dans le logiciel de quiconque sur iTunes. Le même type de paresse qui provoque une personne de ne pas vouloir apprendre à écrire un évaluateur d'expression les inclinera également à vous voler essentiellement de vous. Vous aideriez la société plus en fournissant des tutoriels plutôt que sur le code terminé.
@Mithras en fait, je connais de plusieurs personnes qui l'utilisent et qui suivent correctement la licence. Et ce n'est pas une "paresse" qui dissuade les gens d'écrire un évaluateur d'expression; C'est que c'est un problème vraiment dur i> si vous voulez que ce soit universellement correct. Par votre argument, Apple devrait simplement fournir des tutoriels sur la manière de mettre en œuvre une manipulation tactile, la chaîne de répondeur, la détection de rotation, etc. au lieu de nous donner le cadre Uikit. Oui, n'allez pas arriver.
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);
Ce n'est pas différent de la réponse de @ Dasblinkenlight; Vous venez de panner les expressions gauche et droite au lieu de laisser nspredicate code> gérer la comparaison pour vous.
Juste pour le partage de connaissances Buddy.
Dupliqué possible de écrire un analyseur d'équation simple
Ces chaînes provenaient-elles d'une source de données ou d'une entrée utilisateur? Vous devrez déterminer quels types d'équation mathématiques vous souhaitez soutenir et ensuite partir de là. (c'est-à-dire quels opérandes, combien d'opérandes et si l'utilisateur tient jamais ==) (voulez-vous prendre en charge 1 * 1 * 1 * 1x1 * 1 = 1?)
La chaîne proviendra d'une source de données fixe, il existe des nombres de 0 à 20, équation (+ - * /) et égale (==)
Nous essayons de créer un jeu d'équation mathématique semblable au Scrabble
Voir ma réponse Stackoverflow.com/questions/ 14155360 / ...