3MMALG11 Soutien S06

De Ensiwiki
Aller à : navigation, rechercher
AttentionCette page est maintenue uniquement par les enseignants. Afin de ne pas perturber le déroulement des cours, elle n'a pas vocation à être modifiée par les élèves. Mais si vous avez des modifications à proposer, merci d'en discuter ou d'envoyer un e-mail aux auteurs de la page (cf. historique)

Placement de pivot

Vous avez déjà travaillé sur cet exercice (sous le nom de P15) en TP encadré.

On va implanter les procédures PlaceDernier et PlacePivot des questions 2 et 3 de cet exercice. Il faut d'abord récupérer le module de gestion de tableaux fourni (.ads et .adb).

On considèrera dans tout l'exercice que le tableau est au moins de taille = 1.

On pourra tester l'implantation des deux procédures à l'aide du programme principal suivant (à copier-coller dans un fichier s06_e1.adb) :

with Ada.Text_IO, Ada.Integer_Text_IO, DefTab;
with Ada.Numerics.Discrete_Random;
use Ada.Text_IO, Ada.Integer_Text_IO, DefTab;

procedure S06_E1 is

   procedure PlaceDernier(T: in out Tab; Piv: out Integer) is
   begin
      --  A COMPLETER !
      null;
   end PlaceDernier;

   procedure PlacePivot(T: in out Tab; Piv: in Integer; Deb, Fin: out Integer) is
   begin
      --  A COMPLETER !
      null;
   end PlacePivot;

   procedure Test(Taille: Positive; PlacePiv: Boolean) is
      subtype Indice is Integer range 1 .. Taille;
      package Aleatoire is new Ada.Numerics.Discrete_Random(Indice);
      use Aleatoire;
      G: Generator;
      S: String(1 .. Taille);
      Deb, Fin, Piv: Integer;
   begin
      Reset(G);
      for I in S'Range loop
         S(I) := Character'Val(Character'Pos('A') + Random(G) - 1);
      end loop;
      declare
         T: Tab := Make(S);
      begin
         Put("Tableau initial : "); Put_Line(T);
         if PlacePiv then
            Piv := Random(G);
            Put("  Pivot : " & T(Piv).Clef & " (ix : ");
            Put(Piv, Width => 0); Put_Line(")");
            PlacePivot(T, Piv, Deb, Fin);
            Put("  Tableau re-arrange : "); Put_Line(T);
            Put("  Position du pivot : ["); Put(Deb, Width => 0); Put("..");
            Put(Fin, Width => 0); Put_Line("]");
         else
            PlaceDernier(T,Piv);
            Put("  Tableau re-arrange : "); Put_Line(T);
            Put("  Position de "); Put(T(Piv)); Put(": "); Put(Piv, Width => 0);
            New_Line;
         end if;
      end;
   end Test;

begin

   Put_Line("-- Tests de PlaceDernier --");
   for I in 1 .. 5 loop
      Put("- Taille = "); Put(I, Width => 0); Put_Line(" -");
      --  A decommenter quand PlaceDernier est implantee
      --  for J in 1 .. I loop
         --  Test(I, False);
      --  end loop;
      New_Line;
   end loop;
   New_Line;
   Put_Line("-- Tests de PlacePivot --");
   for I in 1 .. 5 loop
      Put("- Taille = "); Put(I, Width => 0); Put_Line(" -");
      --  A decommenter quand PlacePivot est implantee
      --  for J in 1 .. I loop
         --  Test(I, True);
      --  end loop;
      New_Line;
   end loop;
end S06_E1;