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 :

V�rification du parenth�sage (m�thode r�cursive)


Sujet :

C++Builder

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    39
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 39
    Par d�faut V�rification du parenth�sage (m�thode r�cursive)
    Bonjour j'ai un petit probl�me de v�rification de parenth�sage sous c++ builder.

    Le principe est d'�crire une m�thode r�cursive qui indique si le parenth�sage est correct.
    Par exemple :
    ( ( [] ) ) : correct
    ( ( [ ) ( ) ] ) : incorrect
    ( [ [ ] ] ( ) : incorrect


    Une petite description : on a une liste L (qui affiche plusieurs lignes dans un Memo) et il faut tester les lignes du M�mo et indiquer si le parenth�sage est correct. je pr�f�re ne pas supprimer les parenth�ses d�ja test�es ( avec L.delete(1,1) par ex).

    Si quelqu'un a une id�e. Merci d'avance D�veloppez.com :p

  2. #2
    Expert confirm�
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par d�faut
    Je pense que le code suivant fonctionne:
    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
    bool TestPar(char **bc, char c=0)
     {
       char prov;
       while (**bc!= 0)
       {
        prov =**bc;
        (*bc)++;
        switch (prov)
         {
          case '('  :
          case '['  : if(!TestPar(bc,prov)) return false;
                         break ;
          case ')'  : return c=='(';
          case ']'  : return c=='[';
          case  0   : return c==0 ;
          default   : ;
         }
       }
      return c== 0 ;
    }
    Avec pour appel :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
      char * t = "xx(aa[bb]cc(dd)ee)z[ff([(vv)])]dd";
      char * bb=t;
      bool res = TestPar(&bb);
      if(!res)cout << setfill('-') << setw( bb-t) << right <<'!' << endl;
    en retour, si il y a une erreur, bb pointe sur le caract�re fautif

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    39
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 39
    Par d�faut
    Merci, c'est nickel !

    Seul probl�me, on m'a dit que char * ne peut pas etre utilis�.... et qu'il faudrait utiliser AnsiString... un type que l'on a d�fini � l'en-tete du programme.

    Indication (en tete du programme) :

    const AnsiString VIDE = "|";
    typedef AnsiString Liste;
    Liste L1 = VIDE;

    Dans le programme APPEL DE LA PROCEDURE (j'ai donc utilis� ton code ) :
    char (je voudrais un AnsiString � la place) * t = "xx(aa[bb]cc(dd)ee)z[ff([(vv)])]dd";
    char (je voudrais un AnsiString � la place) * bb=t;
    bool res = TestPar(&bb);
    if (res) Form1->Edit1->Text = "1" ;
    else Form1->Edit1->Text = "0";

  4. #4
    Expert confirm�
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par d�faut
    Seul probl�me, on m'a dit que char * ne peut pas etre utilis�.... et qu'il faudrait utiliser AnsiString... un type que l'on a d�fini � l'en-tete du programme
    L'utiliser exactement pour quoi faire ? Au minimum :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    AnsiString t ="xx(aa[bb]cc(dd)ee)z[ff([(vv)])]dd"; 
    char * bb= t.c_str(); 
    bool res = TestPar(&bb); 
    if (res) Form1->Edit1->Text = "1" ; 
    else Form1->Edit1->Text = "0";
    Si l'AnsiString doit �tre utilis� comme argument de TestPar, on a par exemple :
    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
    bool TestPar(AnsiString & s, char c=0)
     {
       char prov;
       while (s.Length()!=0)
       {
        prov =s[1];
        s.Delete(1,1);
        switch (prov)
         {
          case '('  :
          case '['  : if(!TestPar(s,prov)) return false;
                         break ;
          case ')'  : return c=='(';
          case ']'  : return c=='[';
          case  0   : return c==0 ;
          default   : ;
         }
       }
      return c== 0 ;
      };
    .....
    AnsiString t ="x]x(aa[bb]cc(dd)ee)z[ff([(vv)])]dd";
    bool res = TestPar(t);
    la fonction va �tre plus lourde (Appels � s.Length() et s.Delete()) et dans cette version, l'Ansistring de d�part est d�truit (mais on �vite la cr�ation d'AnsiString interm�diares). En cas d'erreur, L'AnsiString contient le reste de la cha�ne apr�s l'erreur

  5. #5
    Membre exp�riment�
    Avatar de Djob
    Inscrit en
    Ao�t 2002
    Messages
    215
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2002
    Messages : 215
    Par d�faut
    Cet algo est vraiment bien fait,
    c'est vrai que le premier est plus optimis�,


    mais si je peux me permettre ,suite � la version AnsiString que tu proposes:
    il est peut �tre possible d'eviter la destruction de l'ansistring et l'utilisation de Delete() en g�rant un indice :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    bool TestPar(AnsiString s,int &indice,char c=0)
    ainsi que le recalcul de la taille
    en le calculant qu'une fois avant la boucle (puisqu'avec un indice on a plus besoin de supprimer);


  6. #6
    Expert confirm�
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par d�faut
    Djob :
    Cet algo est vraiment bien fait,
    Merci
    mais si je peux me permettre ,suite � la version AnsiString que tu proposes:
    il est peut �tre possible d'eviter la destruction de l'ansistring et l'utilisation de Delete() en g�rant un indice :
    Oui, j'ai d'ailleurs h�sit� entre les deux possibilit�s. Mais j'ai donn� cette version parce qu'elle n'a pas de variable "ext�rieure" � d�finir par l'utilisateur de la fonction. Alors, tant qu'� ne pas "optimiser", autant faire plus propre pour l'utilisateur. Mais c'est vrai que le Delete dans la fonction r�cursive me chagrine plus que la destruction de l'AnsiString � laquelle il est peu couteux de rem�dier
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    AnsiString s ="x]x(aa[bb]cc(dd)ee)z[ff([(vv)])]dd"; 
    AnsiString t = s;
    bool res = TestPar(t);

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    39
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 39
    Par d�faut
    Haaaa je vois ! Effectivement �a fonctionne bien !

    Mais comment faire pour tester une liste ?
    J'ai une liste L1 (aussi affich�e dans un Memo) que je voudrais tester, j'ai essay� de prendre les lignes du Memo pour les concat�ner et les tester, sans succ�s

    En fait, au lieu de

    AnsiString s ="x]x(aa[bb]cc(dd)ee)z[ff([(vv)])]dd";
    Il faut que je test une liste

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    39
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 39
    Par d�faut
    C'est bon j'ai r�ussi !!

    Merci pour votre aide

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

Discussions similaires

  1. R�ponses: 17
    Dernier message: 20/01/2009, 10h39
  2. R�ponses: 7
    Dernier message: 29/11/2007, 00h50
  3. R�ponses: 8
    Dernier message: 23/09/2007, 19h40
  4. [POO]M�thode r�cursive pour tester d�pendances
    Par viviboss dans le forum Langage
    R�ponses: 4
    Dernier message: 28/05/2007, 12h06
  5. [algoritmique][d�butant]M�thode r�cursive
    Par lejimi dans le forum Langage
    R�ponses: 7
    Dernier message: 16/01/2006, 19h54

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