Bonjour,

J'ai un exercice à faire qui consiste à entrer une expression et donner sa dérivée.
Seulement j'ai un petit problème lors de la dérivée de l'expression (e^X)*Racine(x). Ca me donne le bon résultat lorsque je compile sur XCode, mais le mauvais résultat lorsque je compile sous Visual Studio.
Voici le résultat sous XCode :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
                                 +
                       
                   *                             *
 
          *                  R             R                /

1               E                 x           x       1           *

                       x                                           2         R

                                                                                          x
Et celui sous Visual Studio :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
                                 +
 
                   *                             *
 
          *                                                /
 
1               E                                     1           *
 
                       x                                           2         R
 
                                                                                          x
J'ai donc le fils droit de * (celui de gauche ) qui n'apparait pas, ainsi que le fils gauche de * (celui du droite).
Cela ne provient pas de ma procédure d'affichage, je l'ai testée.

Voici des morceaux de code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
 
 
TArbre ConsA(char c, TArbre F_g, TArbre F_d)  // Construit le nœud  <c, F_g, F_d>
{
	TArbre NA;
	NA = (TArbre )malloc(sizeof(TNoeud));
	if (NA == NULL)
	{
		printf("Attention : appel de ConsA() avec NA = vide !! \n");
		system("pause");
		exit(1);
	}
	else
	{
		NA->Valeur = c;
		NA->fg = F_g;
		NA->fd = F_d;
		return NA;
	}
}
 
TArbre ConsFeuille(char c)  // ConsFeuille Construit la feuille <c, *,*>
{
	TArbre NA;
	NA = (TArbre )malloc(sizeof(TNoeud));
	if (NA == NULL)
	{
		printf("Attention : appel de ConsFeuille() avec NA = vide !! \n");
		system("pause");
		exit(1);
	}
	else
	{
		NA->Valeur = c;
		NA->fg = NA->fd = NULL; //car pas de FG ni FD
		return NA;
	}
}
 
Et voici les parties de la fonction Derivation pour exponentielle et racine (notés respectivement E et R) : 
 
case 'R':
				if (E != VIDE)
				{
					TArbre CopieFd = CopieA(F_d); // Fils droit tjs rempli
					return ConsA('/', DeriveA(F_d), ConsA('*', ConsFeuille('2'), ConsA('R', VIDE, CopieFd)));
				}
				else
				{
					printf("Erreur Case R dans DeriveA() \n");
					//system('pause');
					exit(1);
				}
				break;
 
 
			case 'E':
				if (E != VIDE)
				{
					TArbre CopieFd = CopieA(F_d); // Fils droit tjs rempli
					return ConsA('*', DeriveA(F_d), ConsA('E', VIDE, CopieFd));
				}
				else
				{
					printf("Erreur Case E dans DeriveA() \n");
					//system('pause');
					exit(1);
				}
                                break;
Ma fonction CopieA est bonne également, j'ai testé de copier des arbres et de les afficher, c'était les mêmes que les arbres originaux à chaque fois.

Les dérivées sont bien :
(R(u))'=u'/2*R(u)
et
(E(u))'=u' * E(u)

A noter que pour le moment, je n'ai trouvé que cette "erreur" pour l'expression (e^X)*Racine(x). Pour les autres que j'ai testé, j'ai le même affichage sur XCode ou Studio.

A noter également, que dans mon raisonnement, on lit d'abord le fils gauche, la racine, puis le fils droite. Ex : u' * e(u), c'est Racine='*', FG=Derive(u), FD=e(u).
Quand une racine n'a qu'un fils, c'est toujours le fils droit qui est rempli, l'autre est mis à VIDE ( qui vaut NULL dans mon code ). Donc e(u) c'est ConsA('e',VIDE,ConsFeuille(u)).

D'avance merci pour votre aide.