IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème affichage dérivation sur les arbres


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Par défaut Problème affichage dérivation sur les arbres
    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.

  2. #2
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Bonjour,

    je n'ai pas trop jeté un œil sur ton code car je me suis arrêté sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TArbre NA;
    NA = (TArbre )malloc(sizeof(TNoeud));
    Tu alloues une zone mémoire de la taille d'un objet de type TNoeud mais tu dis que c'est un TArbre ? Déjà ça ça me paraît louche.
    Sinon, cacher un pointeur dans un type n'est pas une bonne pratique, caster les malloc non plus.

  3. #3
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Par défaut
    Bonjour,

    Concernant ConsA et ConsFeuille, j'ai repris ce que j'ai dans mon cours, donc je fais confiance au prof sur ce point.
    Peut-être que ce morceau de code (qui est au tout début de mon programme) t'expliqueras ce que j'ai fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    typedef struct Noeud { char Valeur;
    						struct Noeud *fg, *fd;
    					}TNoeud, *TArbre;
    En ce qui concerne mon problème, c'est vraiment bizarre je trouve, car j'ai déroulé plusieurs fois à la main, et je ne comprends pas V.Studio, je ne vois pas pourquoi il ne fait pas comme Xcode.
    Je n'ai pas mis le code du case '*' pour la multiplication, mais je ne pense pas que le problème vienne de là.

  4. #4
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Par défaut
    Bonjour,

    J'ai bien tout re-contrôlé, et en fait mon erreur venait de ma fonction de Copie... Je pensais qu'elle était juste, mais finalement, elle ne recopiait que le premier noeud je crois... La récursivité ne se faisait pas complètement je pense.

    Merci quand même !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DOM] Problème d'accent sur les noms de fichier avec mon parseur
    Par ujoodha dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 06/04/2006, 21h55
  2. Problèmes de pointeurs avec les arbres
    Par thierry57 dans le forum C
    Réponses: 17
    Dernier message: 22/12/2005, 23h35
  3. Tutoriel sur les arbres
    Par emidelphi77 dans le forum Langage
    Réponses: 2
    Dernier message: 09/10/2005, 23h09
  4. Recherche documentation sur les arbres
    Par Oberown dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 22/09/2004, 01h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo