WITH Ada.Text_IO; WITH Pile_G; PROCEDURE Exercice04 IS -- Constantes MAX_CARACTERES : CONSTANT Natural := 20; -- Créer une instance du paquetage Pile_G qui opère sur des caractères, et qui a une capacité maximum de MAX_CARACTERE. PACKAGE PileCaracteres IS NEW Pile_G(Character, MAX_CARACTERES); -- LireChaine -- Description : Procédure utilitaire pour saisir une chaîne de caractères. Affiche l'invite et lit la chaîne au clavier. -- Entrées : invite -> Invite à afficher. -- Sorties : chaine -> Chaîne lue au clavier. -- longueur -> Longueur de la chaîne. -- Retour : N/A -- Pré : Aucune. -- Post : Aucune. PROCEDURE LireChaine(invite : String; chaine : OUT String; longueur : OUT Natural) IS BEGIN Ada.Text_IO.Put(invite); Ada.Text_IO.Get_Line(chaine, longueur); IF longueur = chaine'Length THEN Ada.Text_IO.Skip_Line; END IF; END LireChaine; -- InverserChaine -- Description : Procédure qui inverse une chaîne de caractères. -- Entrées : chaine -> Chaîne à inverser. -- Sorties : inverse -> Chaîne inversée. -- Retour : N/A -- Pré : Taille de inverse >= taille de chaine. -- Post : Inverse = chaine à l'envers. PROCEDURE InverserChaine(chaine : String; inverse : OUT String) IS pile : PileCaracteres.Pile; i : Integer; BEGIN -- Créer une pile PileCaracteres.Creer_Pile(pile); -- Empiler les caractères de la chaîne FOR i IN chaine'Range LOOP PileCaracteres.Empiler(pile, chaine(i)); END LOOP; -- Étant donné que la pile est une structure de données LIFO, on peut -- dépiler tous les caractères et on aura la chaîne en ordre inverse i := inverse'First; WHILE NOT PileCaracteres.Pile_Vide(pile) LOOP PileCaracteres.Depiler(pile, inverse(i)); i := i + 1; END LOOP; -- Détruire la pile PileCaracteres.Detruire_Pile(pile); END InverserChaine; -- Variables mot : String(1..MAX_CARACTERES); -- Mot à inverser inverse : String(1..MAX_CARACTERES); -- L'inverse du mot longueur : Natural; -- Longueur du mot -- Programme principal. BEGIN LOOP -- Saisir une chaîne de caractères Ada.Text_IO.New_Line(2); Ada.Text_IO.Put_Line("Programme d'inversion de mots"); LireChaine("Entrez un mot (max" & Natural'Image(MAX_CARACTERES) & " car.), pour quitter) : ", mot, longueur); -- Si seulement, on se tire... EXIT WHEN longueur = 0; -- Inverser la chaîne puis l'afficher InverserChaine(mot(1..longueur), inverse); Ada.Text_IO.Put_Line("Mot inverse : " & inverse(1..longueur)); END LOOP; END Exercice04;