acx01b
Messages postés
280
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
8 juillet 2014
6
3 janv. 2008 à 14:14
tu ne connais pas les arbres ?
je vais te proposer une méthode générale pour ton programme
tu as par exemple (2 + 3) * 5
tu vas commencer par lire ta chaine de caratère pour la découper en éléments simples:
parenthèse ouvrante, parenthèse fermante, opération, nombre
tu vas mettre dans un tableau les éléments simples:
int elem_simples[500];
int nb_elem_simples;
int nombres[500];
char operateurs[500];
int pou 0, pfe 1, op = 2, nb = 3; // parenthèse ouvrante, parenthèse fermante, opération, nombre
avec l'exemple (2 + 3) * 5 tu auras mis dans tes tableaux:
elem_simples : pou, nb, op, nb, pfe, op, nb
nombres : 0, 2, 0, 3, 0, 0, 5
operateurs: 0, 0, '+', 0, 0, '*', 0
et nb_elem_simples = 7;
ensuite pour calculer bêtement l'expression de la gauche vers la droite (sans les priorités des opérations) ça devient simple:
int calculer_expr(int *pind) {
int nb1, nb2, ind;
char op;
ind = *pind;
/*
si elements_simples[ind] est une parenthèse ouvrante
alors on appelle calculer_expr sur l sous expression:
ind++;
calculer_expr(&ind);
sinon c'est un nombre on le stocke dans nb1
on incrémente ind
ensuite si il n'y a rien après on renvoie nb1
sinon c'est un opérateur et on le stocke dans op = operateurs[ind]
enfin on refait pareil: soit c'est un nombre soit c'est une sous expression parenthésée
on stocke dans nb2
on renvoie le résultat nb1 op nb2 (selon si op est + - * / ^)
et on renvoie aussi l'index de la fin de l'expression
*pind = ind
*/
}
l'astuce c'est que c'est la même fonction qui calcule l'expression entière que une sous expression,
grâce à l'index qui se positionne au début de l'expression et qui à la fin de la fonction est positionné à la fin de l'expression (après la parenthèse fermante si c'est une sous expression)
calculer_expr est donc récursive elle s'appelle elle même pour calculer les sous expressions
ensuite il ne te reste qu'à rajouter des parenthèses autour des expressions prioritaires comme je t'ai dit plus haut
d'abord de la droite vers la gauche pour ^
puis de la gauche vers la droite pour * /
Renaud