MeWa
Messages postés13Date d'inscriptiondimanche 19 novembre 2000StatutMembreDernière intervention 7 juin 2007
-
20 juin 2005 à 15:33
darfeuille
Messages postés63Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention25 juillet 2005
-
21 juin 2005 à 08:22
Bonjour;
Alors voila j'ai un projet a fere qui est la creation d une mini calculette avec un arbre bianaire, ce ki permet de prendre en compte les parenthese.
Donc g créé l arbre binaire et il tien en compte de tout, c a dire lorsque je l affiche il sort parfaitement avec tous les caractere.
Mon probleme provien de ma fonction de calcule qui est une fonction recursive (enfin je pense). Car lorsque je melange 2 operateurs differents, il ne tien en compte que le premier operateur. Par exemple je pose ce calcul : ( ( 2 + 3 ) * ( 4 + 6 ) )
normalement c egal a 50, maisle resulta afficher est 15.
Donc si quelqu un aurait une solution qui me le dise.
Merci d 'avance
voici le code de ma fonction :
void calcul (arbre *a, double *R )
{
if (a->op != NULL)
{
opp = *(a->op);
calcul(a->g, R);
calcul(a->d, R);
}
else
{
if ( opp == '+' )
{
*R = *R + a->val ;
}
if ( opp == '-' )
{
*R = -*R - a->val ;
}
if ( opp == '*' )
{
if (*R == 0)
{
*R = 1;
}
*R = *R * a->val;
}
if ( opp == '/' )
{
if (*R == 0)
{
*R = 1;
}
darfeuille
Messages postés63Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention25 juillet 2005 20 juin 2005 à 17:04
ah d'accord, il est déclaré en dehors.
alors :
1/ initialise tu bien *R a 0 au debut?
2/ je pense que tu n'as pas compris le principe des arbres et de la récurrence.
Ce n'est pas, si on a a+b , de faire R 0+a puis R R+b
Mais c'est plutot :
Si tu as A+B :
tu calcule R1=calcul(A)
R2 = calcul(B)
puis enfin : R = R1+R2
J'espere que tu comprend ce que je veux dire.
Pour te donner un exemple, dans ton code, au lieu d'avoir
opp = *(a->op);
calcul(a->g, R);
calcul(a->d, R);
Tu dois faire :
R1 = calcul(a->g);
R2 = calcul(
a->d);
R = R1+R2;
Allez, avec ca, tu devrais t'en sortir .
Réfléchis bien aux variables, si tu garde des pointeurs, tu vas écraser
des valeurs au cours des itérations, donc ne renvoie pas de double*
mais des double.
et si op = NULL, alors tu renvoie simplement la variable.