--------------------------------------------------------------------- -- PR Miage 2 --------------------------------------------------------------------- -- TP2 : -- transformer une suite d'entiers de la forme 2 3 3 4 5 5 5 -- en 1 fois 2, 2 fois 3, 1 fois 4, 3 fois 5. -- et vice-versa. --------------------------------------------------------------------- -- Question 1 : -- On lit la suite -- 2 3 3 4 5 5 5 -- et on affiche -- 1 fois 2, 2 fois 3, 1 fois 4, 3 fois 5. With Text_Io; use Text_Io; with Ada.Integer_Text_Io; use Ada.Integer_Text_Io; procedure compression is Valeur_Precedente : Natural; -- avant-derniere valeur lue Valeur_Courante : Natural; -- derniere valeur lue Nbre_Oc : Natural:=0; -- nombre d'occurrences de la valeur courante begin Get(valeur_courante); Valeur_Precedente :=Valeur_Courante; while valeur_courante /= 0 loop if Valeur_Courante = Valeur_Precedente then Nbre_Oc:= Nbre_Oc +1; else Put(Integer'Image(Nbre_Oc)&" fois"&Integer'Image(Valeur_precedente)&","); Valeur_Precedente:=Valeur_Courante; Nbre_Oc:= 1; end if; Get(Valeur_Courante); end loop; Put(Integer'Image(Nbre_Oc)&" fois"&Integer'Image(Valeur_Precedente)&"."); end compression; -- Question 2 : -- On lit la suite de caracteres -- 1 fois 2, 2 fois 3, 1 fois 4, 3 fois 5. -- et on affiche 2 3 3 4 5 5 5 -- En cas d'erreur de syntaxe dans la suite entree, -- la procedure declenche l'exception CONSTRAINT_ERROR. -- L'analyse se fait avec un automate ŕ quatre états. With text_io; use text_io; procedure decompression is type Etat is (Facteur,Valeur,Fois,Virgule); -- les etats de l'automate subtype Chiffre is character range '0'..'9'; E:Etat:= Virgule; -- etat de l'automate F,V:Natural:=0; -- F est le facteur courant et V la valeur courante. C:Character; -- caractere courant begin get(C); while C /= '.' loop case e is when Facteur => case c is when Chiffre => F:=F*10+Character'pos(C)-Character'pos('0'); when '*' => E:=Fois; when ' ' => null; when others => raise constraint_error; end case; when Fois => case C is when Chiffre => E:= Valeur; V:=Character'pos(C)-Character'pos('0'); when ' ' => null; when others => raise constraint_error; end case; when Valeur => case C is when Chiffre => V:=V*10+Character'pos(c)-Character'pos('0'); when ',' => E:=virgule; for i in 1..F loop put(integer'image(V)); end loop; when ' ' => null; when others => raise constraint_error; end case; when Virgule => case C is when ' ' => null; when Chiffre => E:=Facteur; F:=Character'pos(C)-Character'pos('0'); when others => raise constraint_error; end case; end case; get(C); end loop; if E=Valeur then for i in 1..F loop put(integer'image(V)); end loop; else raise constraint_error; end if; end decompression;