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++Builder Discussion :

Treevien to string


Sujet :

C++Builder

  1. #1
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    14
    D�tails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 14
    Par d�faut Treevien to string
    je doit construire une phrase � partir de TTreeView telque les noeud sont les op�rateurs logique et les derni�re feuilles sont les phrases.cela dit que mon treeview est un arbre abstrait. la meilleur solution est de faire un parcour recursif pour construire ce texte (enssemble de phrase et op�rateur). j'ai siplifier le pb et je me dit il faut esseyer avec les expr�ssion arithm�tique au debut.
    voila ma fonction recursive mais je ne connai pas le pb car cette fonction est biensur fausse.

    si quelqu'un peut m'aider !!!
    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
    //------------------------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    S="";
    Edit1->Text=fonction(TreeView1->Items->GetFirstNode());
    }
    //---------------------------------------------------------------------------
    String fonction(TTreeNode *Nodef)
    {
    int i;
    TTreeNode *Node,*f,*l,*par;
     
    Node=Nodef;
    if(Node->HasChildren)
      {
      par=Node->getFirstChild();
     while(par!=Node->GetLastChild())
           {
           S=S+fonction(par)+"  "+Node->Text;
           par=par->GetNext();
           }
           S=S+fonction(par);
           return(S);
      }
      else return(Node->Text);
    }
    //------------------------------------------------------------------------------------------
    exemple
    *
    | *
    | |--+
    | | |---a
    | | |---b
    | |
    | |--+
    | | |---c
    | | |---d
    | |
    | |
    |
    |--/
    |--e
    |---f -----> ((a+b)*(c+d))*(e/f)

  2. #2
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    14
    D�tails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 14
    Par d�faut expr�ssion arithm�tique a partir de TreeView
    je doit construire une phrase � partir de TTreeView telque les noeud sont les op�rateurs logique et les derni�re feuilles sont les phrases.cela dit que mon treeview est un arbre abstrait. la meilleur solution est de faire un parcour recursif pour construire ce texte (enssemble de phrase et op�rateur). j'ai siplifier le pb et je me dit il faut esseyer avec les expr�ssion arithm�tique au debut.
    voila ma fonction recursive mais je ne connai pas le pb car cette fonction est biensur fausse.
    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
     
    void __fastcall TForm1::Button1Click(TObject *Sender) 
    { 
    S=""; 
    fonction(TreeView1->Items->GetFirstNode()); 
    Edit1->Text=S; 
    } 
    ----------------------------------------------------- 
    fonction(TTreeNode *Nodef) 
    { 
    TTreeNode *Node,*par; 
    Node=Nodef; 
    if(Node->HasChildren) 
    { 
    par=Node->getFirstChild(); 
    while(par!=Node->GetLastChild()) 
    { 
    fonction(par) 
    S=S+Node->Text; 
    par=par->GetNext(); 
    } 
    fonction(par) 
    } 
    else S=S+Node->Text; 
    } 
    ----------------------------------------------------- 
    si tu veux ajouter les parentheses: 
    la fonction devienne: 
    ---------------------------------- 
    fonction(TTreeNode *Nodef) 
    { 
    TTreeNode *Node,*par; 
    Node=Nodef; 
    if(Node->HasChildren) 
    { 
    S=S+"("; 
    par=Node->getFirstChild(); 
    while(par!=Node->GetLastChild()) 
    { 
    fonction(par) 
    S=S+Node->Text; 
    par=par->GetNext(); 
    } 
    fonction(par) 
    S=S+")"; 
    } 
    else S=S+Node->Text; 
    } 
     
    exemple 
    * 
    | * 
    | |--+ 
    | | |---a 
    | | |---b 
    | | 
    | |--+ 
    | | |---c 
    | | |---d 
    | | 
    | | 
    | 
    |--/ 
    |--e 
    |---f -----> ((a+b)*(c+d))*(e/f) 
     
    //c++builder 6

  3. #3
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Bonjour,
    Peux-tu rajouter les balises CODE?
    As-tu essayer de d�rouler ton code � la main (enfin, l'algo)?

    Il me semble que 'e' et 'f' devrait �tre enfant de '/' et non au m�me niveau.

    Pourrais-tu montrer la partie du code o� tu construit l'arbre des donn�es?

  4. #4
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    14
    D�tails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 14
    Par d�faut remarque
    l'arbre est deja construit

  5. #5
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Bonjour,
    L'algorithme semble donn�e la bonne solution, donc je pr�sume que le probl�me est plus li� � la construction de l'arbre. Fait un dump de celui-ci pour voir s'il correspond � ce que tu attends. En dernier, recours, d�buggue ta fonction pas � pas pour voir l� o� �a coince.

  6. #6
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    14
    D�tails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 14
    Par d�faut re
    jai pas pu detecter l'anomalie

  7. #7
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Bonjour abdenour-nab,
    Je suis d�sol� mais je n'arrive pas � reproduire ton probl�me avec les infos que tu as fournis. L'algo fonctionne (je l'ai fait tourn� avec une red�finition de TTreeNode en arbre). Je pense que le probl�me doit plus ou moins �tre li� � ton parcours d'arbre. Et l�, je ne vois pas d'autre solution que de regarder pas � pas avec le debugger comment se construit ta cha�ne S.
    Bon courage.

  8. #8
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    23
    D�tails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 23
    Par d�faut
    Salut

    Je te rassure ta fonction n'est pas fausse, enfin pas enti�rement
    Tu n'as pas trop expliqu� ton probl�me (compilation,execution ?) donc je vais t'expliquer tout ce que j'ai fait pour que ca marche.

    Si tu s un probl�me de linker � la compilation, c'est � cause de ta fonction "fonction" qui n'appartient pas � la Form1, donc rajoutes un TForm1::
    J'en profite �galement pour modifier ton type String en AnsiString.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    AnsiString TForm1::fonction(TTreeNode *Nodef)
    Ensuite la fonction compile, et avec ton arbre j'obtiens:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    a  +ba  +b  *a  *b  *c  +da  +ba  +b  *a  *b  *c  +da  +ba  +b  *a  *b  *c  +da  +ba  +b  *a  *b  *c  +d  *a  +ba  +ba  +b  *a  *b  *c  +da  +ba  +b  *a  *b  *c  +da  +ba  +b  *a  *b  *c  +da  +ba  +b  *a  *b  *c  +d  *a  +b  *a  *b  *c  +da  +ba  +b  *a  *b  *c  +da  +ba  +b  *a  *b  *c  +da  +ba  +b  *a  *b  *c  +da  +ba  +b  *a  *b  *c  +d  *a  +ba  +ba  +b  *a  *b  *c  +da  +ba  +b  *a  *b  *c  +da  +ba  +b  *a  *b  *c  +da  +ba  +b  *a  *b  *c  +d  *a  +b  *a  *b  *c  +d  *c  *d  *e  /fa  +ba  +b  *a  *b  *c  +da  +ba  +b  *a  *b  *c  +da  +ba  +b  *a  *b  *c  +da  +ba  +b  *a  *b  *c  +d  *a  +ba  +ba  +b  *a  *b  *c  +da  +ba  +b  *a  *b  *c  +da  +ba  +b  *a  *b  *c  +da  +ba  +b  *a  *b  *c  +d  *a  +b  *a  *b  *c  +da  +ba  +b  *a  *b  *c  +da  +ba  +b  *a  *b  *c  +da  +ba  +b  *a  *b  *c  +da  +ba  +b  *a  *b  *c  +d  *a  +ba  +ba  +b  *a  *b  *c  +da  +ba  +b  *a  *b  *c  +da  +ba  +b  *a  *b  *c  +da  +ba  +b  *a  *b  *c  +d  *a  +b  *a  *b  *c  +d  *c  *d  *e  /f
    L� je me dis qu'il y a un soucis !

    En y regardant de plus pr�s, ton "S", �tait une variable globale, et remis � z�ro uniquement avant la fonction. C'est un probl�me dans une fonction r�cursive, donc j'ai transform� "S" en variable locale, r�initialis�e � chaque it�ration, et j'obtiens:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    a  +b  *a  *b  *c  +d  *a  +b  *a  *b  *c  +d  *c  *d  *e  /f
    Ce qui est d�j� plus sympa !!
    Un petit peu de pas � pas, et je me rend compte que le probl�me vient de la ligne:
    un peit coup de F1 pour l'aide de la fonction GetNext(), et on trouve :
    it returns the next node including nodes that aren't visible and child nodes
    Or ici tu veux passer � la node soeur, en skippant les enfants !
    donc j'ai remplac� ta ligne par :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    par=par->getNextSibling();
    Et cette fois ci j'obtiens :
    a +b *c +d *e /f
    Et voil� le travail !
    Il ne manque plus que la gestion des parenth�ses et des espaces, mais l'id�e est l�, si t'as encore des questions n'h�sites pas !

    Bonne journ�e

  9. #9
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    14
    D�tails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 14
    Par d�faut font d'un noeud.
    merci vous m'avez sauvez . tu sais le malheur de programme avec la contrainte de d�lais et en plus mon arbre deviendra une d�composition Tache / M�thode
    (c'est la recomposition d'un probl�me complexe en sous probl�mes d'une mani�r� r�cursive jusqu'� l'obtention d'une tache terminale).

    reste une petit question

    comment changer le font d'une node donn�e (agrandir la police ,couleur..) sans affecter les autres.

  10. #10
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    14
    D�tails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 14
    Par d�faut
    le probl�me vient de par->Next();
    il faut remplacer par

    --------------->par=par->getNextSibling();

    merci.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. �liminer un caractere d'un string
    Par no-vice dans le forum Langage
    R�ponses: 5
    Dernier message: 09/08/2002, 14h55
  2. String -> long double (_strlold ?)
    Par haypo dans le forum C
    R�ponses: 7
    Dernier message: 25/07/2002, 20h22
  3. URGENT: retour de string
    Par Pinggui dans le forum CORBA
    R�ponses: 4
    Dernier message: 15/07/2002, 09h47
  4. R�ponses: 2
    Dernier message: 05/06/2002, 12h29
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    R�ponses: 12
    Dernier message: 17/05/2002, 15h23

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