Recherche de mot

Recherche de mot - Ada - Programmation

Marsh Posté le 03-05-2009 à 00:43:51    

Bonsoir,
 
J'essaie d'écrire un programme me permettant de déterminer si une chaîne de caractères présente un (ou des) mot(s) ou non, et de connaître également les indices correspondant à la première lettre et la dernière lettre. Afin de voir si ce que j'ai écrit fonctionne, j'ai procédé à 6 tests unitaires; seulement, l'un d'entre eux ne fonctionne pas, comme vous allez le voir... Voici mon code:
 

Code :
  1. with Ada.Text_IO, Ada.Integer_Text_IO;
  2. use Ada.Text_IO, Ada.Integer_Text_IO;
  3. procedure programme is
  4.    procedure Chercher_Mot (Dans: in String; Trouve: out Boolean; Deb, Fin: out Positive) is
  5.    begin
  6.       Trouve := False;
  7.       for Indice in Dans'First..Dans'Last loop
  8.          if Dans(Indice) /= ' ' and  Trouve = False then
  9.             Deb := Indice;
  10.             Fin := Indice;
  11.             Trouve := True;
  12.          end if;
  13.          if Trouve = True then
  14.             if Dans(Dans'Last) /= ' ' then
  15.                Fin := Dans'Last;
  16.             else
  17.                for Indice2 in (Dans'First + Indice -1)..Dans'Last loop
  18.                   if Dans(Indice2) = ' ' then
  19.                      Fin := Indice2 -1;
  20.                   end if;
  21.                end loop;
  22.             end if;
  23.          end if;
  24.       end loop;
  25.    end Chercher_Mot;
  26.  
  27.    -- Test unitaire
  28.    procedure Tester_Chercher_Mot is
  29.       Mot_Trouve : Boolean;
  30.       Indice_Deb,
  31.       Indice_Fin : Positive;
  32.    begin
  33.       -- Cas 1 : Chaine nulle
  34.       Chercher_Mot("", Mot_Trouve, Indice_Deb, Indice_Fin);
  35.       if Mot_Trouve then
  36.          Put ("T1: Mot trouve!" );
  37.          Put(Indice_Deb);
  38.          Put(Indice_Fin);
  39.          New_Line;
  40.       else
  41.          Put("T1:Mot non trouve!" );
  42.          New_Line;
  43.       end if;
  44.       -- Cas 2: Chaine de longueur > 0 qu'avec des espaces
  45.       Chercher_Mot("    ", Mot_Trouve, Indice_Deb, Indice_Fin);
  46.       if Mot_Trouve then
  47.          Put("T2: Mot trouve!" );
  48.          Put(Indice_Deb);
  49.          Put(Indice_Fin);
  50.          New_Line;
  51.       else
  52.          Put("T2:Mot non trouve!" );
  53.          New_Line;
  54.       end if;
  55.       -- Cas 3: Chaine contenant un mot, sans espaces
  56.       Chercher_Mot("Bonjour!", Mot_Trouve, Indice_Deb, Indice_Fin);
  57.       if Mot_Trouve then
  58.          Put("T3:Mot trouve!" );
  59.          Put(Indice_Deb);
  60.          Put(Indice_Fin);
  61.          New_Line;
  62.       else
  63.          Put("T3:Mot non trouve!" );
  64.          New_Line;
  65.       end if;
  66.       -- Cas 4: Chaine comportant un mot precede par des espaces
  67.       Chercher_Mot("    Bonjour!", Mot_Trouve, Indice_Deb, Indice_Fin);
  68.       if Mot_Trouve then
  69.          Put("T4:Mot trouve!" );
  70.          Put(Indice_Deb);
  71.          Put(Indice_Fin);
  72.          New_Line;
  73.       else
  74.          Put("T4:Mot non trouve!" );
  75.          New_Line;
  76.       end if;
  77.       -- Cas 5: Chaine comportant un mot suivi d'espaces
  78.       Chercher_Mot("Bonjour!    ", Mot_Trouve, Indice_Deb, Indice_Fin);
  79.       if Mot_Trouve then
  80.          Put("T5:Mot trouve!" );
  81.          Put(Indice_Deb);
  82.          Put(Indice_Fin);
  83.          New_Line;
  84.       else
  85.          Put("T5:Mot non trouve!" );
  86.          New_Line;
  87.       end if;
  88.       -- Cas 6: Chaine comportant deux mots separes par des espaces
  89.       Chercher_Mot("Bonjour!  Bye!", Mot_Trouve, Indice_Deb, Indice_Fin);
  90.       if Mot_Trouve then
  91.          Put("T6:Mot trouve!" );
  92.          Put(Indice_Deb);
  93.          Put(Indice_Fin);
  94.          New_Line;
  95.       else
  96.          Put("T6:Mot non trouve!" );
  97.          New_Line;
  98.       end if;
  99.    end Tester_Chercher_Mot;
  100. begin
  101.    Tester_Chercher_Mot;
  102. end programme;


 
Il s'agit du Test 5 qui ne fonctionne pas, puisque le programme me revoit comme indice de fin, 11, au lieu de 8. Voyez-vous ce qui pose problème? Si des explications concernant mon code sont nécessaires, n'hésitez pas à me le faire savoir, je tenterai d'éclaircir ce que j'ai voulu faire!
 
Merci d'avance!

Reply

Marsh Posté le 03-05-2009 à 00:43:51   

Reply

Marsh Posté le 14-06-2009 à 05:37:30    

Déjà juste un avis, qui tiens qu'à moi.
Aux ligne 14 et 22 de ton code, les tests sur les booléens suffisent plutôt qu'une comparaison avec les constantes true et false. Les comparaisons sont superflus. Un simple test (ex: if Trouve then). De plus, ainsi l'expression ressemble plus à une phrase:

Code :
  1. if Dans(Indice) /= ' ' and not Trouve then


se traduit par: si Dans(Indice) n'est pas un espace et un mot pas trouvé alors...
Voilà ça ressemble pour moi à une phrase bien formé ce qui est dans l'esprit du langage ADA à été fait justement pour qu'un programme se lise comme une série de phrases.
 
Avant de voir ton problème, il y a une petite erreur à la ligne 31 de ton code:

Code :
  1. for Indice2 in (Dans'First + Indice -1)..Dans'Last loop


La partie "(Dans'First + Indice -1)" est erronnée.
En effet, la variable Indice est déjà dans l'intervalle Dans'First..Dans'Last à cause du "for" englobant.
La varible Indice n'est pas un offset (décalage) par rapport à Dans'First. Donc ceci est mieux:

Code :
  1. for Indice2 in Indice..Dans'Last loop


 
Pour ton problème maintenant.
Le problème de l'échec du test 5 vient du fait que la ligne 35 de ton code est exécuté plusieurs fois, ce qui écrase la valeur précédente. Donc en fait, l'argument Fin prends succéssivement les valeur 8, 9, 10 et 11 à chaque itération de la boucle. La valeur correcte 8 est bien afectée, mais est ecrasée ensuite. Il te faut une condition d'arrêt, c'est à dire un test qui disent si l'index de fin est trouvé.
 
De plus le test de la ligne 25 me parrait inutile, car il a l'air d'être une optimisation sans doute dans un souci d'une exécution plus rapide en enlevant des cas traités. Mais ce test ligne 25 offre une différence de comportement quand tu as plusieurs mots. Ton test unitaire 6 retroune un indice de fin différent si tu rajoute juste un espace à la fin de la chaine testée. A mon avis ce n'est pas ce que tu espérais, cela viens justement du test ligne 25.
Si pour autant tu souhaite concerver ce test, il te faut en fait partir de la fin de la chaine dans la boucle imbriquée (for Indice2) et remonter la chaine à l'envers pour trouvé le premier caractère qui ne soit pas un espace, cependant le test disparait au dépend justement de la boucle.
 
Je te poste 4 solutions:
1. Correction pour que cela fonctionne.
2. Correction plus complete en enlevant le test ligne 25
3. Autre correction plus complète avec un comportement homogène avec le test ligne 25 dans le cas où la chaine traitée a un espace à la fin.
4. Une solution plus performante.
 
Pourquoi la solution 4, car ton utilisation des boucles FOR, n'est pas une erreur en soit, puisque ça marche, mais si tu regarde attentivement, tu pourras voir des itérations dite poubelles, ces itérations, ne font rien, ne servent à rien, elles bouffent inutilement du temps de calcul. Et en plus, ces itérations "poubelle" introduit souvent des erreurs comme c'est le cas avec ton problème, donc comme avec le problème d'écrasement. En fait, ton problème de départ qui fait que le test unitaire 5 est erroné, est ce qu'on appelle justement un effet de bord qui n'est pas maitrisé.
 
De plus c'est assez visible, car le nombre de tests (if) dans la solution 4 est reduit au strict minimum.
 
Tu pourras faire des tests de vitesse, pour t'en convaincre, par exemple avec un ou plusieurs mots très longs, de mettre tes tests unitaire dans une boucle à 100000 itérations ou simplement de lancer plusieurs fois le même programme plusieurs fois (mais ce n'est pas très fiable comme test de vitesse).
 
Dans la solution 4, j'ai choisi de suivre l'idée de la solution 2, c'est à dire que l'index de fin pour le test unitaire 6 soit la in du premier mot. Ainsi on peut découper le texte en mots en appelant plusieurs fois la procédure Chercher_Mot, ce qui correspond pour moi au nom de la procédure: on cherche un mot. La solution 3 ressemble à une fonction Trim qui cherche à enlever les espaces de début et de fin.
 
Dans la solution 4, j'utilise la fonction Ada.Characters.Handling.Is_Alphanumeric plutôt que tester un simple espace, ainsi le mot découpé ne devrait contenir que des lettres et des chiffres et pas les retours à la ligne, les caractère de tabulation et des signes de ponctuation.
A la place de la fonction Ada.Characters.Handling.Is_Alphanumeric tu peux ainsi utiliser une autre fonction que tu veux pour sélectionner les caractères que tu veux dans le mot découpé. Tu peux aussi par la même occasion faire de la procédure Chercher_Mot une procédure générique avec comme paramètre une fonction de sélection des caractères.
 
Cette procédure Chercher_Mot est ainsi très proche des fonction strtok en C/C++ ou de la classe java.util.StringTokenizer en java si tu connais.
 
Solution 1:

Code :
  1. with Ada.Text_IO, Ada.Integer_Text_IO;
  2. use Ada.Text_IO, Ada.Integer_Text_IO;
  3. procedure programme is
  4.    procedure Chercher_Mot (Dans: in String; Trouve: out Boolean; Deb, Fin: out Positive) is
  5.       Fin_Trouvee : Boolean := False;
  6.    begin
  7.       Trouve := False;
  8.       for Indice in Dans'First..Dans'Last loop
  9.          if Dans(Indice) /= ' ' and not Trouve then
  10.             Deb := Indice;
  11.             Fin := Indice;
  12.             Trouve := True;
  13.          end if;
  14.          if Trouve and not Fin_Trouvee then
  15.             if Dans(Dans'Last) /= ' ' then
  16.                Fin := Dans'Last;
  17.                Fin_Trouvee := True;
  18.             else
  19.                for Indice2 in Indice..Dans'Last loop
  20.                   if not Fin_Trouvee and Dans(Indice2) = ' ' then
  21.                      Fin := Indice2 - 1;
  22.                      Fin_Trouvee := True;
  23.                   end if;
  24.                end loop;
  25.             end if;
  26.          end if;
  27.       end loop;
  28.    end Chercher_Mot;
  29.    -- Test unitaire
  30.    procedure Tester_Chercher_Mot is
  31.       Mot_Trouve : Boolean;
  32.       Indice_Deb,
  33.       Indice_Fin : Positive;
  34.    begin
  35.       -- Cas 1 : Chaine nulle
  36.       Chercher_Mot("", Mot_Trouve, Indice_Deb, Indice_Fin);
  37.       if Mot_Trouve then
  38.          Put ("T1: Mot trouve!" );
  39.          Put(Indice_Deb);
  40.          Put(Indice_Fin);
  41.          New_Line;
  42.       else
  43.          Put("T1:Mot non trouve!" );
  44.          New_Line;
  45.       end if;
  46.       -- Cas 2: Chaine de longueur > 0 qu'avec des espaces
  47.       Chercher_Mot("    ", Mot_Trouve, Indice_Deb, Indice_Fin);
  48.       if Mot_Trouve then
  49.          Put("T2: Mot trouve!" );
  50.          Put(Indice_Deb);
  51.          Put(Indice_Fin);
  52.          New_Line;
  53.       else
  54.          Put("T2:Mot non trouve!" );
  55.          New_Line;
  56.       end if;
  57.       -- Cas 3: Chaine contenant un mot, sans espaces
  58.       Chercher_Mot("Bonjour!", Mot_Trouve, Indice_Deb, Indice_Fin);
  59.       if Mot_Trouve then
  60.          Put("T3:Mot trouve!" );
  61.          Put(Indice_Deb);
  62.          Put(Indice_Fin);
  63.          New_Line;
  64.       else
  65.          Put("T3:Mot non trouve!" );
  66.          New_Line;
  67.       end if;
  68.       -- Cas 4: Chaine comportant un mot precede par des espaces
  69.       Chercher_Mot("    Bonjour!", Mot_Trouve, Indice_Deb, Indice_Fin);
  70.       if Mot_Trouve then
  71.          Put("T4:Mot trouve!" );
  72.          Put(Indice_Deb);
  73.          Put(Indice_Fin);
  74.          New_Line;
  75.       else
  76.          Put("T4:Mot non trouve!" );
  77.          New_Line;
  78.       end if;
  79.       -- Cas 5: Chaine comportant un mot suivi d'espaces
  80.       Chercher_Mot("Bonjour!    ", Mot_Trouve, Indice_Deb, Indice_Fin);
  81.       if Mot_Trouve then
  82.          Put("T5:Mot trouve!" );
  83.          Put(Indice_Deb);
  84.          Put(Indice_Fin);
  85.          New_Line;
  86.       else
  87.          Put("T5:Mot non trouve!" );
  88.          New_Line;
  89.       end if;
  90.       -- Cas 6: Chaine comportant deux mots separes par des espaces
  91.       Chercher_Mot("Bonjour!  Bye!", Mot_Trouve, Indice_Deb, Indice_Fin);
  92.       if Mot_Trouve then
  93.          Put("T6:Mot trouve!" );
  94.          Put(Indice_Deb);
  95.          Put(Indice_Fin);
  96.          New_Line;
  97.       else
  98.          Put("T6:Mot non trouve!" );
  99.          New_Line;
  100.       end if;
  101.       -- Cas 7: Chaine comportant deux mots separes par des espaces et un espace à la fin
  102.       Chercher_Mot("Bonjour!  Bye! ", Mot_Trouve, Indice_Deb, Indice_Fin);
  103.       if Mot_Trouve then
  104.          Put("T7:Mot trouve!" );
  105.          Put(Indice_Deb);
  106.          Put(Indice_Fin);
  107.          New_Line;
  108.       else
  109.          Put("T7:Mot non trouve!" );
  110.          New_Line;
  111.       end if;
  112.    end Tester_Chercher_Mot;
  113. begin
  114.    Tester_Chercher_Mot;
  115. end programme;


 
Solution 2:

Code :
  1. with Ada.Text_IO, Ada.Integer_Text_IO;
  2. use Ada.Text_IO, Ada.Integer_Text_IO;
  3. procedure programme is
  4.    procedure Chercher_Mot (Dans: in String; Trouve: out Boolean; Deb, Fin: out Positive) is
  5.       Fin_Trouvee : Boolean := False;
  6.    begin
  7.       Trouve := False;
  8.       for Indice in Dans'First..Dans'Last loop
  9.          if Dans(Indice) /= ' ' and not Trouve then
  10.             Deb := Indice;
  11.             Fin := Indice;
  12.             Trouve := True;
  13.          end if;
  14.          if Trouve and not Fin_Trouvee then
  15.             for Indice2 in Indice..Dans'Last loop
  16.                if not Fin_Trouvee and Dans(Indice2) = ' ' then
  17.                   Fin := Indice2 - 1;
  18.                   Fin_Trouvee := True;
  19.                end if;
  20.                end loop;
  21.          end if;
  22.       end loop;
  23.    end Chercher_Mot;
  24.    -- Test unitaire
  25.    procedure Tester_Chercher_Mot is
  26.       Mot_Trouve : Boolean;
  27.       Indice_Deb,
  28.       Indice_Fin : Positive;
  29.    begin
  30.       -- Cas 1 : Chaine nulle
  31.       Chercher_Mot("", Mot_Trouve, Indice_Deb, Indice_Fin);
  32.       if Mot_Trouve then
  33.          Put ("T1: Mot trouve!" );
  34.          Put(Indice_Deb);
  35.          Put(Indice_Fin);
  36.          New_Line;
  37.       else
  38.          Put("T1:Mot non trouve!" );
  39.          New_Line;
  40.       end if;
  41.       -- Cas 2: Chaine de longueur > 0 qu'avec des espaces
  42.       Chercher_Mot("    ", Mot_Trouve, Indice_Deb, Indice_Fin);
  43.       if Mot_Trouve then
  44.          Put("T2: Mot trouve!" );
  45.          Put(Indice_Deb);
  46.          Put(Indice_Fin);
  47.          New_Line;
  48.       else
  49.          Put("T2:Mot non trouve!" );
  50.          New_Line;
  51.       end if;
  52.       -- Cas 3: Chaine contenant un mot, sans espaces
  53.       Chercher_Mot("Bonjour!", Mot_Trouve, Indice_Deb, Indice_Fin);
  54.       if Mot_Trouve then
  55.          Put("T3:Mot trouve!" );
  56.          Put(Indice_Deb);
  57.          Put(Indice_Fin);
  58.          New_Line;
  59.       else
  60.          Put("T3:Mot non trouve!" );
  61.          New_Line;
  62.       end if;
  63.       -- Cas 4: Chaine comportant un mot precede par des espaces
  64.       Chercher_Mot("    Bonjour!", Mot_Trouve, Indice_Deb, Indice_Fin);
  65.       if Mot_Trouve then
  66.          Put("T4:Mot trouve!" );
  67.          Put(Indice_Deb);
  68.          Put(Indice_Fin);
  69.          New_Line;
  70.       else
  71.          Put("T4:Mot non trouve!" );
  72.          New_Line;
  73.       end if;
  74.       -- Cas 5: Chaine comportant un mot suivi d'espaces
  75.       Chercher_Mot("Bonjour!    ", Mot_Trouve, Indice_Deb, Indice_Fin);
  76.       if Mot_Trouve then
  77.          Put("T5:Mot trouve!" );
  78.          Put(Indice_Deb);
  79.          Put(Indice_Fin);
  80.          New_Line;
  81.       else
  82.          Put("T5:Mot non trouve!" );
  83.          New_Line;
  84.       end if;
  85.       -- Cas 6: Chaine comportant deux mots separes par des espaces
  86.       Chercher_Mot("Bonjour!  Bye!", Mot_Trouve, Indice_Deb, Indice_Fin);
  87.       if Mot_Trouve then
  88.          Put("T6:Mot trouve!" );
  89.          Put(Indice_Deb);
  90.          Put(Indice_Fin);
  91.          New_Line;
  92.       else
  93.          Put("T6:Mot non trouve!" );
  94.          New_Line;
  95.       end if;
  96.       -- Cas 7: Chaine comportant deux mots separes par des espaces et un espace à la fin
  97.       Chercher_Mot("Bonjour!  Bye! ", Mot_Trouve, Indice_Deb, Indice_Fin);
  98.       if Mot_Trouve then
  99.          Put("T7:Mot trouve!" );
  100.          Put(Indice_Deb);
  101.          Put(Indice_Fin);
  102.          New_Line;
  103.       else
  104.          Put("T7:Mot non trouve!" );
  105.          New_Line;
  106.       end if;
  107.    end Tester_Chercher_Mot;
  108. begin
  109.    Tester_Chercher_Mot;
  110. end programme;


 
Solution 3:

Code :
  1. with Ada.Text_IO, Ada.Integer_Text_IO;
  2. use Ada.Text_IO, Ada.Integer_Text_IO;
  3. procedure programme is
  4.    procedure Chercher_Mot (Dans: in String; Trouve: out Boolean; Deb, Fin: out Positive) is
  5.       Fin_Trouvee : Boolean := False;
  6.    begin
  7.       Trouve := False;
  8.       for Indice in Dans'First..Dans'Last loop
  9.          if Dans(Indice) /= ' ' and not Trouve then
  10.             Deb := Indice;
  11.             Fin := Indice;
  12.             Trouve := True;
  13.          end if;
  14.          if Trouve and not Fin_Trouvee then
  15.             if Dans(Dans'Last) /= ' ' then
  16.                Fin := Dans'Last;
  17.                Fin_Trouvee := True;
  18.             else
  19.                for Indice2 in reverse Indice..Dans'Last loop
  20.                   if not Fin_Trouvee and Dans(Indice2) /= ' ' then
  21.                      Fin := Indice2;
  22.                      Fin_Trouvee := True;
  23.                   end if;
  24.                end loop;
  25.             end if;
  26.          end if;
  27.       end loop;
  28.    end Chercher_Mot;
  29.    -- Test unitaire
  30.    procedure Tester_Chercher_Mot is
  31.       Mot_Trouve : Boolean;
  32.       Indice_Deb,
  33.       Indice_Fin : Positive;
  34.    begin
  35.       -- Cas 1 : Chaine nulle
  36.       Chercher_Mot("", Mot_Trouve, Indice_Deb, Indice_Fin);
  37.       if Mot_Trouve then
  38.          Put ("T1: Mot trouve!" );
  39.          Put(Indice_Deb);
  40.          Put(Indice_Fin);
  41.          New_Line;
  42.       else
  43.          Put("T1:Mot non trouve!" );
  44.          New_Line;
  45.       end if;
  46.       -- Cas 2: Chaine de longueur > 0 qu'avec des espaces
  47.       Chercher_Mot("    ", Mot_Trouve, Indice_Deb, Indice_Fin);
  48.       if Mot_Trouve then
  49.          Put("T2: Mot trouve!" );
  50.          Put(Indice_Deb);
  51.          Put(Indice_Fin);
  52.          New_Line;
  53.       else
  54.          Put("T2:Mot non trouve!" );
  55.          New_Line;
  56.       end if;
  57.       -- Cas 3: Chaine contenant un mot, sans espaces
  58.       Chercher_Mot("Bonjour!", Mot_Trouve, Indice_Deb, Indice_Fin);
  59.       if Mot_Trouve then
  60.          Put("T3:Mot trouve!" );
  61.          Put(Indice_Deb);
  62.          Put(Indice_Fin);
  63.          New_Line;
  64.       else
  65.          Put("T3:Mot non trouve!" );
  66.          New_Line;
  67.       end if;
  68.       -- Cas 4: Chaine comportant un mot precede par des espaces
  69.       Chercher_Mot("    Bonjour!", Mot_Trouve, Indice_Deb, Indice_Fin);
  70.       if Mot_Trouve then
  71.          Put("T4:Mot trouve!" );
  72.          Put(Indice_Deb);
  73.          Put(Indice_Fin);
  74.          New_Line;
  75.       else
  76.          Put("T4:Mot non trouve!" );
  77.          New_Line;
  78.       end if;
  79.       -- Cas 5: Chaine comportant un mot suivi d'espaces
  80.       Chercher_Mot("Bonjour!    ", Mot_Trouve, Indice_Deb, Indice_Fin);
  81.       if Mot_Trouve then
  82.          Put("T5:Mot trouve!" );
  83.          Put(Indice_Deb);
  84.          Put(Indice_Fin);
  85.          New_Line;
  86.       else
  87.          Put("T5:Mot non trouve!" );
  88.          New_Line;
  89.       end if;
  90.       -- Cas 6: Chaine comportant deux mots separes par des espaces
  91.       Chercher_Mot("Bonjour!  Bye!", Mot_Trouve, Indice_Deb, Indice_Fin);
  92.       if Mot_Trouve then
  93.          Put("T6:Mot trouve!" );
  94.          Put(Indice_Deb);
  95.          Put(Indice_Fin);
  96.          New_Line;
  97.       else
  98.          Put("T6:Mot non trouve!" );
  99.          New_Line;
  100.       end if;
  101.       -- Cas 7: Chaine comportant deux mots separes par des espaces et un espace à la fin
  102.       Chercher_Mot("Bonjour!  Bye! ", Mot_Trouve, Indice_Deb, Indice_Fin);
  103.       if Mot_Trouve then
  104.          Put("T7:Mot trouve!" );
  105.          Put(Indice_Deb);
  106.          Put(Indice_Fin);
  107.          New_Line;
  108.       else
  109.          Put("T7:Mot non trouve!" );
  110.          New_Line;
  111.       end if;
  112.    end Tester_Chercher_Mot;
  113. begin
  114.    Tester_Chercher_Mot;
  115. end programme;


 
Solution 4:

Code :
  1. with Ada.Text_IO, Ada.Integer_Text_IO;
  2. use Ada.Text_IO, Ada.Integer_Text_IO;
  3. with Ada.Characters.Handling; use Ada.Characters.Handling; -- Is_Alphanumeric
  4. procedure programme is
  5.    procedure Chercher_Mot (Dans: in String; Trouve: out Boolean; Deb, Fin: out Positive) is
  6.       Indice : Positive := Dans'First;
  7.    begin
  8.       Trouve := False;
  9.       while Indice <= Dans'Last and then not Is_Alphanumeric(Dans(Indice)) loop
  10.          Indice := Positive'Succ(Indice);
  11.       end loop;
  12.       if Indice <= Dans'Last then
  13.          Trouve := True;
  14.          Deb := Indice;
  15.          while Indice <= Dans'Last and then Is_Alphanumeric(Dans(Indice)) loop
  16.             Indice := Positive'Succ(Indice);
  17.          end loop;
  18.          Fin := Positive'Min(Indice, Dans'Last);
  19.       end if;
  20.    end Chercher_Mot;
  21.    -- Test unitaire
  22.    procedure Tester_Chercher_Mot is
  23.       Mot_Trouve : Boolean;
  24.       Indice_Deb,
  25.       Indice_Fin : Positive;
  26.    begin
  27.       -- Cas 1 : Chaine nulle
  28.       Chercher_Mot("", Mot_Trouve, Indice_Deb, Indice_Fin);
  29.       if Mot_Trouve then
  30.          Put ("T1: Mot trouve!" );
  31.          Put(Indice_Deb);
  32.          Put(Indice_Fin);
  33.          New_Line;
  34.       else
  35.          Put("T1:Mot non trouve!" );
  36.          New_Line;
  37.       end if;
  38.       -- Cas 2: Chaine de longueur > 0 qu'avec des espaces
  39.       Chercher_Mot("    ", Mot_Trouve, Indice_Deb, Indice_Fin);
  40.       if Mot_Trouve then
  41.          Put("T2: Mot trouve!" );
  42.          Put(Indice_Deb);
  43.          Put(Indice_Fin);
  44.          New_Line;
  45.       else
  46.          Put("T2:Mot non trouve!" );
  47.          New_Line;
  48.       end if;
  49.       -- Cas 3: Chaine contenant un mot, sans espaces
  50.       Chercher_Mot("Bonjour!", Mot_Trouve, Indice_Deb, Indice_Fin);
  51.       if Mot_Trouve then
  52.          Put("T3:Mot trouve!" );
  53.          Put(Indice_Deb);
  54.          Put(Indice_Fin);
  55.          New_Line;
  56.       else
  57.          Put("T3:Mot non trouve!" );
  58.          New_Line;
  59.       end if;
  60.       -- Cas 4: Chaine comportant un mot precede par des espaces
  61.       Chercher_Mot("    Bonjour!", Mot_Trouve, Indice_Deb, Indice_Fin);
  62.       if Mot_Trouve then
  63.          Put("T4:Mot trouve!" );
  64.          Put(Indice_Deb);
  65.          Put(Indice_Fin);
  66.          New_Line;
  67.       else
  68.          Put("T4:Mot non trouve!" );
  69.          New_Line;
  70.       end if;
  71.       -- Cas 5: Chaine comportant un mot suivi d'espaces
  72.       Chercher_Mot("Bonjour!    ", Mot_Trouve, Indice_Deb, Indice_Fin);
  73.       if Mot_Trouve then
  74.          Put("T5:Mot trouve!" );
  75.          Put(Indice_Deb);
  76.          Put(Indice_Fin);
  77.          New_Line;
  78.       else
  79.          Put("T5:Mot non trouve!" );
  80.          New_Line;
  81.       end if;
  82.       -- Cas 6: Chaine comportant deux mots separes par des espaces
  83.       Chercher_Mot("Bonjour!  Bye!", Mot_Trouve, Indice_Deb, Indice_Fin);
  84.       if Mot_Trouve then
  85.          Put("T6:Mot trouve!" );
  86.          Put(Indice_Deb);
  87.          Put(Indice_Fin);
  88.          New_Line;
  89.       else
  90.          Put("T6:Mot non trouve!" );
  91.          New_Line;
  92.       end if;
  93.       -- Cas 7: Chaine comportant deux mots separes par des espaces et un espace à la fin
  94.       Chercher_Mot("Bonjour!  Bye! ", Mot_Trouve, Indice_Deb, Indice_Fin);
  95.       if Mot_Trouve then
  96.          Put("T7:Mot trouve!" );
  97.          Put(Indice_Deb);
  98.          Put(Indice_Fin);
  99.          New_Line;
  100.       else
  101.          Put("T7:Mot non trouve!" );
  102.          New_Line;
  103.       end if;
  104.    end Tester_Chercher_Mot;
  105. begin
  106.    Tester_Chercher_Mot;
  107. end programme;


Message édité par Corebreaker le 14-06-2009 à 05:43:04
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed