Forums Rue-Montgallet.com
Rue-Montgallet.comRue-Hardware.comRue-Occasion.comRue-DVD.comRue-Jeuxvideo.comRue-AudioVideo.comRue-Telephone.comForums
S'inscrire | S'identifier |
| Recherche avancée | Aide
 
 

Achat - Vente Informatique : herve_94220 et 34 utilisateurs inconnus

 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet :

rechercher un mot dans un arbre

 
n°17845
fleur de n​ostalgie
Profil : Jeune recrue
Posté le 10-11-2006 à 16:03:22  profilanswer
 

bonjour,
je bloque sur ma fonction qui teste l'appartenance d'un mot à un texte sachant que le texte est mis dans une structure d'arbre voila ma fonction mais elle m'affiche toujours 0 ce qui veut aucun mot n'appartient au texte
int Appartient(Arbre a,char* mot) /*a c'est l'arbre qui contient le texte et mot le mot recherché*/
{
  int i=0;
  if(a==NULL)
 
    return 0;
 
  while(i<strlen(mot))
    {
      if((mot[i]=='\0')||(a->Lettre=='\0'))
 return 1;   /* on renvoi 1 si le mot est dans l'arbre*/
     
      else return 0;
     
      if(mot[i]==a->Lettre)
 return  Appartient(a->fils,mot);
 
      else if(mot[i]<a->Lettre)
 return Appartient(a->freregauche,mot);  
 
      else  
 return  Appartient(a->freredroit,mot);
 
    }  
 
}

n°17846
cmoila
Profil : Membre
Posté le 10-11-2006 à 16:33:39  profilanswer
 

Où est incrémenté i ?
 
Ta fonction "Appartient()" renvoie vrai/faux, donc c'est un bool pas un int. Les return n'en seront que plus clair.
 
Poste ta structure Arbre (d'ailleurs tu devrais l'appeller SArbre). ta fonction etant récursive on a besoin de tout savoir.  
 
 

n°17850
fleur de n​ostalgie
Profil : Jeune recrue
Posté le 11-11-2006 à 09:59:07  profilanswer
 

i s'incremente dans le while et la fonction renvoi 0 si le mot n'existe pes ou 1 si le mot appartient à l'arbre c'est pour ça que c'est un int  
typedef struct noeud{
  char lettre;
  struct noeud* fils;
  struct noeud* freredroit;
  struct noeud* freregauche;
}Noeud, *Arbre;

n°17855
cmoila
Profil : Membre
Posté le 11-11-2006 à 19:08:20  profilanswer
 

Je disais que comme ta fonction "Appartient()" répond en binaire , oui/non, elle devrait etre typée bool. c'est bien plus cohérent qu'un int qui donne des valeurs multiples. C'est juste un conseil.
 
Ta structure Arbre est comme j'avais cru la deviner, c'est à dire très curieuse.
Déja tu es conscient que c'est pas un "arbre", mais un noeud, puisque tu l'as nommé comme cela. Et ensuite tu appelles "Arbre" un pointeur sur un noeud c'est ce que j'avais pas compris, car c'est vraiment pas standard comme facon de nommer.
 
typedef struct noeud {
  char lettre;
  struct noeud *fils, *freredroit, *freregauche;
} SNoeud, *PSNoeud;
 
A mon avis le type PSNoeud n'apporte rien de plus.
L'Arbre lui doit se trouver ailleurs dans ton programme, puisque c'est l'ensemble des noeuds. Ca doit etre un tableau de noeuds que tu réserves en mémoire d'une façon ou d'une autre.
 
Ce que je trouve curieux, c'est le contenu de la structure. Tu réserves un seul caractère "lettre", et 3 pointeurs. Donc pour stocker une seule lettre d'un mot qui tient sur 1 octet, tu reserves 13 octets. Et comme il y aura forcement un alignement de case mémoire entre le char et les pointeurs, la place reservée sera de 14 ou plus surement 16 octets !
Mise à part la perte énorme de place, je ne comprends pas comment sont stockés les mots dans un arbre bati sur cette structure. (il semblerait que ce soit les noeuds fils )
 
int i = 0;  
while ( i < strlen(mot) ) {
      if ( (mot[i]=='\0')  ||  (a->Lettre=='\0') )  return 1;    
      else  return 0;
     
      if ( mot[i]==a->Lettre )  return Appartient(a->fils,mot);
      else if ( mot[i] < a->Lettre )  return Appartient(a->freregauche,mot);  
      else  return Appartient(a->freredroit,mot);

}    
 
 
Où est incrémenté "i" ? A quoi sert le "while" puisque dans tous les cas testé on execute un "return" ?  
La 2eme partie (rouge), n'est jamais accédée. Normalement ton compilateur aurait du te le dire (en warning)


Message édité par cmoila le 11-11-2006 à 19:24:46
n°17875
jxano
Le 'x' ? C'est pour décorer.
Profil : Membre
Posté le 16-11-2006 à 12:32:58  profilanswer
 

Selon la définition de la structure, cet arbre est lexicographique. Pas besoin de trois branches, deux suffisent : une pour avancer dans le mot recherché, et une pour passer aux lettres suivantes dans l'alphabet. L'arbre n'est pas un texte, mais un dictionnaire.
 
A mon humble avis, le while n'est pas nécessaire. N'oublions pas que char *mot pointe en fait sur une lettre... on peut utiliser cela dans la récursion :
 
typedef struct  
{  
  char lettre;  
  noeud* suivAlpha;  
  noeud* lettreSuiv;  
} noeud;
 
EDIT (19 nov, soir) : Il y a un problème sur le caractère récursif de la définition du type. Il y a un petit quelque chose à mettre en plus pour que ça marche, mais je ne m'en souviens plus.
 
char Appartient(noeud *a,char* lettreDuMot)
{  
  if(a==NULL) return 'N'; /* Dictionnaire vide, le mot n'y est pas ! */
 
  if (*lettreDuMot == '\0') return 'O'; /* Mot trouvé, puisqu'on est à la fin */
       
 if(*lettreDuMot==a->Lettre)  
   return  Appartient(a->lettreSuiv, &lettreDuMot [1]); /* Recherche sur la lettre suivante */
 
 if(*lettreDuMot < a->Lettre)  
   return Appartient(a->suivAlpha,mot); /* progression dans les pages du dico */
 
 return 'N'; /* Mot absent du dico */  
}  
 
Mon truc de renvoyer 'O' (oui) ou 'N' (non) n'est sans doute pas très "informatique", mais il est très efficace pour s'y retrouver !
 
Le code pour insérer un mot dans le dictionnaire n'est pas beaucoup plus long, mais plus délicat à mettre au point.


Message édité par jxano le 19-11-2006 à 23:54:55

---------------
Miximus in lecto, fateor peccavimus hospes. Si dices quare nulla matella fuit !
n°17881
cmoila
Profil : Membre
Posté le 17-11-2006 à 23:43:44  profilanswer
 

on est passé de la fonction binaire renvoyant un "int", à la fonction binaire renvoyant un "char".
on est en gros progrès, meme si la problématique n'a pas encore vraiment trouvé sa "vérité".
 
Soit dit en passant, répondre par un "char" a une fonction, je ne l'avais jamais vu avant aujourd'hui, en 25 ans de programmation.  
On en apprend tous les jours !
 


Aller à :
Ajouter une réponse