Calculette / arbre binaire [Résolu]

Signaler
Messages postés
13
Date d'inscription
dimanche 19 novembre 2000
Statut
Membre
Dernière intervention
7 juin 2007
-
Messages postés
63
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
25 juillet 2005
-
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;
}


*R = a->val / *R ;

}


}


}

6 réponses

Messages postés
63
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
25 juillet 2005

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.
Messages postés
63
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
25 juillet 2005

if (a->op != NULL)

{

opp = *(a->op);

calcul(a->g, R);

calcul(a->d, R);
}
else
{
if ( opp == '+' )
{

.............



Euh...... si a->op == NULL alors opp n'existe pas; ca ne
peut pas compiler tout ca; comment tu as fait pour le compiler sans
qu'il mette d'erreur ??
Messages postés
13
Date d'inscription
dimanche 19 novembre 2000
Statut
Membre
Dernière intervention
7 juin 2007

ben ca le compile très bien. Ca me semblait bizard au debut, mais ca marche, donc voila. Ou pt etre que c ca le probleme. je c pa
Messages postés
13
Date d'inscription
dimanche 19 novembre 2000
Statut
Membre
Dernière intervention
7 juin 2007

Ok merci je pense ke ca devre aller.Mais OPP tu l initialise où?
Messages postés
13
Date d'inscription
dimanche 19 novembre 2000
Statut
Membre
Dernière intervention
7 juin 2007

c bon !!! g reussi
merci bcp
a la prochaine
Messages postés
63
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
25 juillet 2005

content de pouvoir rendre service



Si ta calculette marche, je pense que tu pourrais proposer les sources ici, en précisant bien que c'est sous forme d'arbre

Ca doit pouvoir intéresser des gens.