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 :
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 + * * * R R / 1 E x x 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).
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
Cela ne provient pas de ma procédure d'affichage, je l'ai testée.
Voici des morceaux de code :
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.
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 nud <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;
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.
Partager