Calculette / arbre binaire

Résolu
MeWa Messages postés 13 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 7 juin 2007 - 20 juin 2005 à 15:33
darfeuille Messages postés 63 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 25 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;
}


*R = a->val / *R ;

}


}


}

6 réponses

darfeuille Messages postés 63 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 25 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.
3
darfeuille Messages postés 63 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 25 juillet 2005
20 juin 2005 à 16:05
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 ??
0
MeWa Messages postés 13 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 7 juin 2007
20 juin 2005 à 16:20
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
0
MeWa Messages postés 13 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 7 juin 2007
20 juin 2005 à 20:18
Ok merci je pense ke ca devre aller.Mais OPP tu l initialise où?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MeWa Messages postés 13 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 7 juin 2007
20 juin 2005 à 20:38
c bon !!! g reussi
merci bcp
a la prochaine
0
darfeuille Messages postés 63 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 25 juillet 2005
21 juin 2005 à 08:22
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.
0
Rejoignez-nous