with Ada.Integer_Text_Io, Ada.Text_Io; use Ada.Integer_Text_Io, Ada.Text_Io; procedure Exam_2006_Listes is ListeMax : constant Integer := 20; type TblEntier is array (1..ListeMax) of Integer; type Liste_Entier is record Liste : TblEntier; Taille : Integer; end record; -- q. a function Liste_Vide(L : in Liste_Entier) return Boolean is begin return L.Taille = 0; end Liste_Vide; procedure Liste_Init(L : out Liste_Entier) is begin L.Taille := 0; end Liste_Init; -- q. b function Liste_Taille(L : in Liste_Entier) return Integer is begin return L.Taille; end Liste_Taille; function Liste_Lire(L : in Liste_Entier; Pos : in Integer) return Integer is begin return L.Liste(Pos); end Liste_Lire; -- q. c procedure Liste_Copie(L1 : in Liste_Entier; L2 : out Liste_Entier) is begin for I in 1..L1.Taille loop L2.Liste(I) := L1.Liste(I); end loop; L2.Taille := L1.Taille; end Liste_Copie; -- q. d procedure Liste_Insere(L : in out Liste_Entier; Pos : in Integer; Val : in Integer) is begin for I in reverse Pos..L.Taille loop L.Liste(I + 1) := L.Liste(I); end loop; L.Liste(Pos) := Val; L.Taille := L.Taille + 1; end Liste_Insere; -- q. e procedure Liste_Supprime(L : in out Liste_Entier; Pos : in Integer) is begin for I in Pos..L.Taille - 1 loop L.Liste(I) := L.Liste(I + 1); end loop; L.Taille := L.Taille - 1; end Liste_Supprime; -- q. f procedure Liste_Fusion(L1, L2 : in Liste_Entier; L3 : out Liste_Entier) is I1, I2 : Integer := 1; begin Liste_Init(L3); while I1 <= Liste_Taille(L1) and I2 <= Liste_Taille(L2) loop if Liste_Lire(L1, I1) < Liste_Lire(L2, I2) then Liste_Insere(L3, Liste_Taille(L3) + 1, Liste_Lire(L1, I1)); I1 := I1 + 1; elsif Liste_Lire(L1, I1) > Liste_Lire(L2, I2) then Liste_Insere(L3, Liste_Taille(L3) + 1, Liste_Lire(L2, I2)); I2 := I2 + 1; else Liste_Insere(L3, Liste_Taille(L3) + 1, Liste_Lire(L1, I1)); I1 := I1 + 1; I2 := I2 + 1; end if; end loop; for I in I1..Liste_Taille(L1) loop Liste_Insere(L3, Liste_Taille(L3) + 1, Liste_Lire(L1, I)); end loop; for I in I2..Liste_Taille(L2) loop Liste_Insere(L3, Liste_Taille(L3) + 1, Liste_Lire(L2, I)); end loop; end Liste_Fusion; procedure Liste_Fusion_Gen(L1, L2 : in Liste_Entier; L3 : out Liste_Entier) is function isIn(L : in Liste_Entier; E : in Integer) return Boolean is begin for I in 1..Liste_Taille(L) loop if E = Liste_Lire(L, I) then return True; end if; end loop; return False; end isIn; V : Integer; begin Liste_Init(L3); for I in 1..Liste_Taille(L1) loop V := Liste_Lire(L1, I); if not IsIn(L3, V) then Liste_Insere(L3, Liste_Taille(L3) + 1, V); end if; end loop; for I in 1..Liste_Taille(L2) loop V := Liste_Lire(L2, I); if not IsIn(L3, V) then Liste_Insere(L3, Liste_Taille(L3) + 1, V); end if; end loop; end Liste_Fusion_Gen; --------------------------------------- ----- procedures/fonctions utilitaires type Uncontraint_Array is array (Integer range <>) of Integer; procedure Liste_Fill(L : out Liste_Entier; T : in Uncontraint_Array) is begin Liste_Init(L); for I in T'Range loop Liste_Insere(L, Liste_Taille(L) + 1, T(I)); end loop; end Liste_Fill; procedure Put(L : in Liste_Entier) is begin Put("Liste_entier("); for I in 1..Liste_Taille(L) - 1 loop Put(Liste_Lire(L, I), 0); Put(", "); end loop; if not Liste_Vide(L) then Put(Liste_Lire(L, Liste_Taille(L)), 0); end if; Put(')'); end Put; procedure Put_Line(L : in Liste_Entier) is begin Put(L); New_Line; end Put_Line; L1, L2, L3 : Liste_Entier; begin Liste_Fill(L1, (1,2,3,4)); Liste_Init(L2); Put("Liste_Fusion("); Put(L1); Put(", "); Put(L2); Put(") = "); Liste_Fusion(L1, L2, L3); Put_Line(L3); Liste_Fill(L1, (1,3,6)); Liste_Fill(L2, (1,2,4,6,9)); Liste_Fusion(L1, L2, L3); Put("Liste_Fusion("); Put(L1); Put(", "); Put(L2); Put(") = "); Put_Line(L3); Put("Liste_Fusion_Gen("); Put(L1); Put(", "); Put(L2); Put(") = "); Liste_Fusion_Gen(L1, L2, L3); Put_Line(L3); end Exam_2006_Listes;