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

Delphi Discussion :

trouver 4 mots dans une StringList..


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 42
    Points : 11
    Points
    11
    Par défaut trouver 4 mots dans une StringList..
    Bonjour,

    je veux écrire un code qui vérifie bien l'existence de 4 mots (strings)dans les éléments d'une StingList.

    j'ai déja écrit le code d'une fonction qui recherche une chaine dans une autre chaine de caractères
    RechercheMot(phrase, Mot):boolean

    je sé que je peux écrire 4 fonctions qui vérifient l'existence de chaque mot dans ma StringList, mais ce code n'est évidemment pas du tt optimisé vu que j'ai besoin des 4 mots ensemble.. c'est à dire que je peux sortir de ma fonction si par exemple je parcours une fois la liste et que je trouve pas mon premier mot...


    Merci de m'éclairer SVP en s'appuyant sur la fonction RechercheMot..

  2. #2
    Membre confirmé
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Points : 647
    Points
    647
    Par défaut
    Bonsoir.

    Un peu plus de détails S.V.P. et un bout de code pour être explicite. Il y a tend de façon de gérer les chaines de caractères.

    A+
    Rien n'est moins sur que l'incertain : Pierre DAC

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 42
    Points : 11
    Points
    11
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function RechercheMot(Phrase,Mot:String):Boolean;
    var i:integer;
    Trouve:Boolean;
    begin
    Trouve:=False;
    for i:=0 to Length(Phrase)+1 do
    begin
    if Copy(Phrase,i,Length(Mot))=Mot then Trouve:=True;
    end;
    Result:=Trouve;
    end;
    voila ma fonction RechercheMot

    Maintenant, j'ai une TStringList "INTO"
    je veux que (i.e [For i=0 to Into.count-1 do]) vérifier l'existence des mots 'Mot1', 'Mot2', 'Mot3', 'Mot4' dans les (INTO.count) chaines de ma STringList 'INTO'.

    Par exemple:
    cet exemple est accepté selon la définition de mon alogorithme.
    INTO = ['...Mot1...','...Mot2...','...Mot4...','xxxxx','xxx','...Mot3...']

    Par contre,
    celui-là ne l'est pas:
    INTO = ['.....','...Mot2...','...Mot4...','xxxxx','xxx','...Mot3...'] car la chaine 'Mot1' n'existe dans aucune des chaines de INTO.

    j'espère que c'est à peu près clair..
    Merci et désolé pour le manque de précision dans le premier..

    En fait, je cherche une fonction optimisée (le minimum de parcours de la liste ou de vérifications possible)..

  4. #4
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonsoir,
    Un petit bout de code, en espérant avoir bien compris ton problème :
    (désolé, c'est sous C++Builder)
    .dans le .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    bool __fastcall ChercherMot(TStringList *base, TStringList *source);
    TStringList *aListe;
    .dans le .cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    bool __fastcall TForm1::ChercherMot(TStringList *base, TStringList *source)
    {
    bool result = true;
            for (int i = 0; i < source->Count; i ++)
            {
                    if (base->IndexOf(source->Strings[i]) == - 1)
                    {
                            result = false;
                    }
            }
    return result;
    }
    Je charge la première liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    aListe = new TStringList();
    aListe->Add("mot 1");
    aListe->Add("mot 2");
    aListe->Add("mot 3");
    aListe->Add("mot 4");
    puis l'autre avec pour comparaison :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    TStringList *bListe = new TStringList();
    bListe->Add("mot 1");
    bListe->Add("mot 2");
    bListe->Add("mot 4");
    ShowMessage(BoolToStr(ChercherMot(aListe, bListe), true));
    En espérant t'aider,
    @ +
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 42
    Points : 11
    Points
    11
    Par défaut
    non ce n'est pas du tout ça...

    c tout simple..

    ce code là devrait fonctionner, mais n'est évidemment pas optimisé:
    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
     
      counter := 0;
     
      while counter < into.Count do
        begin
          if RechercheMot(UpperCase(into[counter]), 'Mot1') then trouv_Mot1;
          if RechercheMot(UpperCase(into[counter]), 'Mot2') then trouv_Mot2;
          if RechercheMot(UpperCase(into[counter]), 'Mot3') then trouv_Mot3;
          if RechercheMot(UpperCase(into[counter]), 'Mot4') then trouv_Mot4;
       end;
     
    if trouv_Mot1 AND trouv_Mot2 AND trouv_Mot3 AND trouv_Mot4 then
       showmessage('OK')
       else
          showmessage('un des champs obligatoires n''existe pas');

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Moi j'aurais fait comma ca

    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
     
    function RechercheMot (lst, lstMot : TStringList) : Boolean;
    var
      i : integer;
    begin
      for i := 0 to lstMot.count -1 do
      begin
        if Pos(UpperCase(lstMot.Strings[i]),UpperCase(lst.Text)) > 0 then
          Result := True
       else begin
          Result := False;
          Break; // on sort de la boucle car on a pas trouvé le mot
       end;
      end;
    end;
    Après pour l'appel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    lstMot.Add('Mot1');
    lstMot.Add('Mot2');
    lstMot.Add('Mot3');
    lstMot.Add('Mot4');
    // on est plus limité a 4 mots de recherche ^^
     
    if RechercheMot(into,lstMot) then
      Showmessage('Ok');
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 42
    Points : 11
    Points
    11
    Par défaut
    excellent..
    c tout àa fait ce que je cherchais merci..

    par contre, comment je fais pour un traitement d'erreur propre
    (afficher le premier mot qui n'existe pas, et sortir de mon traitement)

    Merci bp

  8. #8
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Au lieu de mettre la fonction avec un retour boolean, tu peux mettre avec un integer qui t'indique quel est le mot qui a retourner l'erreur

    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
     
    function RechercheMot (lst, lstMot : TStringList) : Integer;
    var
      i : integer;
    begin
      for i := 0 to lstMot.count -1 do
      begin
        if Pos(UpperCase(lstMot.Strings[i]),UpperCase(lst.Text)) > 0 then
          Result := -1
       else begin
          Result := i;
          Break; // on sort de la boucle car on a pas trouvé le mot
       end;
      end;
    end;
    Pour le résultat

    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
     
    var
      indexMot : Integer;
    begin
      lstMot.Add('Mot1');
      lstMot.Add('Mot2');
      lstMot.Add('Mot3');
      lstMot.Add('Mot4');
      // on est plus limité a 4 mots de recherche ^^
     
      IndexMot := RechercheMot(into,lstMot);
      if  IndexMot = -1 then
        Showmessage('Ok')
      else
        Showmessage('Le mot ' + lstMot.Strings[IndexMot] + ' n''a pas été trouvé');
    end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  9. #9
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 42
    Points : 11
    Points
    11
    Par défaut
    Merci
    ça marche nickel et c'est exactement ce que je voulais..

    super bout de code à mon sens..

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

Discussions similaires

  1. Trouver un mot dans une chaine et l'afficher
    Par Invité dans le forum Langage
    Réponses: 2
    Dernier message: 18/11/2011, 15h40
  2. trouver les mots dans une chaine
    Par thierry007 dans le forum VB.NET
    Réponses: 5
    Dernier message: 21/04/2010, 09h30
  3. Trouver un mots dans une phrase
    Par VEN0M1 dans le forum Débuter
    Réponses: 2
    Dernier message: 07/05/2009, 16h46
  4. [RegEx] trouver un mot dans une chaine de caractère
    Par starr dans le forum Langage
    Réponses: 2
    Dernier message: 22/06/2007, 15h36
  5. requête pour trouver un mot dans une phrase
    Par FRIGAUX dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 25/11/2006, 22h18

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