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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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

+ 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