with ada.Text_IO, Ada.Integer_Text_IO; with ada.Calendar; use ada.Text_IO; procedure Chaine is -- Sous-types & variables globales LMT : constant Integer := 100; -- Taille maximun du traitement Type Buffer is array (1..LMT) of Character; type Position is record Debut : Integer; Fin : Integer; end record; -- Lecture d'entrée console function Lire_Entree return String is Saisie : String (1..LMT); Last : Natural; begin Get_Line(Saisie, Last); declare Phrase : String(Saisie'First..(Last+2)); begin Phrase(Phrase'First) := ' '; Phrase(Phrase'Last) := ' '; Phrase((Phrase'First+1)..(Phrase'Last-1)) := Saisie((Saisie'First)..Last); return Phrase; end; end Lire_Entree; -- Extrait le premier mot d'un string function Extraire_Mot(Text : in out String; Trouve : out Boolean) return Position is I : Integer := 1; Pos : Position; Fin : Boolean := False; begin Trouve := True; while Text(I) = ' ' and not Fin loop I := I + 1; if I >= Text'Last then Trouve := False; Fin := True; end if; end loop; Pos.Debut := I; while not Fin loop if Text(I) = ' ' then Fin := True; else I := I + 1; end if; end loop; Pos.Fin := I; for J in Text'First..I loop Text(J) := ' '; end loop; return Pos; End Extraire_Mot; -- Procedure de recherche de mot procedure Fnd_Mot (Txt : String) is Fini : Boolean := False; Compteur : Integer := 0; Pos : Position; Trouve : Boolean; Text : String(Txt'Range) := Txt; -- question de compatibilité begin while not Fini loop Pos := Extraire_Mot(Text, Trouve); if not Trouve then Fini := True; Put_Line("Extraction terminée"); else Compteur := Compteur + 1; Put("Mot n°" & Integer'Image(Compteur) & " trouvé : "); for I in Pos.Debut..Pos.Fin loop Put(Txt(I)); Text(I) := ' '; end loop; New_Line; end if; end loop; end Fnd_Mot; begin Put_Line("Saisir une phrase : "); Fnd_Mot(Lire_Entree); end Chaine;