Faire une addition ou une multiplication

Fermé
jp - 10 oct. 2013 à 13:20
Matt 666 Messages postés 38 Date d'inscription jeudi 7 mars 2013 Statut Membre Dernière intervention 28 octobre 2020 - 8 déc. 2013 à 14:37
Bonjour

Je voudrais savoir si il est possible de faire des calculs en lisp
exemple a et b sont des nombres est lorsque je rentre a+b ou a x b je voudrai avoir le résultat de ses opération
(defun c:calcul ()
(Setq NB(getstring "\nDonner le nombre de barre:")) 'je rentre par exemple 2 + 4
(setq Somme NB) ' je suis censé avoir comme résultat 6


)

1 réponse

Matt 666 Messages postés 38 Date d'inscription jeudi 7 mars 2013 Statut Membre Dernière intervention 28 octobre 2020
8 déc. 2013 à 14:37
Salut !
Houlà non ! C'est beaucoup plus compliqué que ça !
Aucun langage de prog ne peut comprendre le sens d'une chaîne de caractères (strings quoi). C'est à toi de le guider !
Par exemple si tu gardes les espaces entre les nombres et l'opération (3 x 2.5), faut lui aider à trouver que "3" est un chiffre, que l'espace ne sert qu'à délimiter ce chiffre, que le caractères d'après est un symbole d'opération et ainsi de suite..
Pas simple ton affaire. Mais ça se fait quand même !
Genre ce truc là :

(defun c:calcul (/ lst)
(Setq lst (str->lst (getstring T "\nOperation (ex 3 x 2) : ") " "))
(if (eq (length lst) 3) ;vérifie si la liste est bien composée de 3 entités.
(if (eq (cadr lst) "x") ; Si l'opération est x
(princ (rtos (* (atof (car lst))(atof (last lst)))))
(if (eq (cadr lst) "+") ; Si l'opération est +
(princ (rtos (+ (atof (car lst))(atof (last lst)))))
(if (eq (cadr lst) "-") ; Si l'opération est -
(princ (rtos (- (atof (car lst))(atof (last lst)))))
(if (eq (cadr lst) "/") ; Si l'opération est /
(princ (rtos (/ (atof (car lst))(atof (last lst)))))
)
)
)
)
(princ "\nMauvaise operation.") ; La liste n'est pas composée de 3 entités.
)
(princ)
)

;Sous Programme permettant de transformer une chaine de caractères en liste, avec un séparateur.
(defun str->lst (str sep / pos)
(if (setq pos (stg-sch sep str nil))
(cons (substr str 1 pos)
(str->lst (substr str (+ (strlen sep) pos 1)) sep)
)
(list str)
)
)

;Sous Programme permettant de chercher une chaîne de caractères au sein d'une autre.
(defun stg-sch (pat str start / rslt)
(if (not start)
(setq start 0)
)
(while (and (< start (strlen str))
(not rslt)
)
(setq start (1+ start))
(if (= (substr str start (strlen pat)) pat)
(setq rslt (1- start))
)
)
rslt
)

Attention, ce bout de programme ne fait absolument pas de calcul complexe, juste des opérations simples. Mais ça a le mérite de fonctionne ah aha
0