Forum ada95000 Dernière connexion : 18/06/2025 à 04:20
Fin de session : 18/06/2025 à 04:30

Vous n'êtes pas connecté [Connexion - Inscription]
Go Bottom
Version imprimable | Envoyer à un ami | S'abonner | Ajouter aux Favoris Nouveau SujetNouveau sondageRépondre
Auteur: Sujet: Exo 6: Tab1 en séquence dans Tab2   ( Réponses: 1 | Vues: 736 )
ftbass
Administrator
StaffStaffStaffStaffStaffStaffStaffStaffStaff
 
images/avatars/WC3HumanOp1.gif
 
Messages: 72
Inscrit(e) le: 27/02/2004
Déconnecté(e)
Publié le 27/02/2004 à 22:02 Reply With Quote
Exo 6: Tab1 en séquence dans Tab2

Verifier si le contenu de Tab1 est retrouvé en séquence dans Tab2 :

code:
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;

with Nombres_aleatoires; use Nombres_aleatoires;

procedure Tab1EnSequenceDansTab2 is

Long1 : constant := 3;
Tab1 : array(1 .. Long1) of integer := (1, 2, 3);
Long2 : constant := 10;
Tab2 : array(1 .. Long2) of integer := (4, 3, 1, 2, 3, 9, 2, 1, 1, 2);
Trouve : boolean := false;
i : integer := 1;
j : integer;

begin
  while (i <= Long1) and (Trouve = false) loop
     if Tab2(i) /= Tab1(1) then
        i := i + 1;
       else
          Trouve := true;
          j := 1;
     end if;
     while (j < Long1) and (i <= Long2 - j) and (Trouve = true) loop
        if Tab2(i + j) = Tab1(j + 1) then
           j := j + 1;
        else
           Trouve := false;
           i := i + 1;
        end if;
     end loop;
  end loop;
  if (Trouve = true) and (j > Long1) then
     Trouve := false;
  end if;
  if Trouve = true then
     put("Trouve");
  else
     put("Pas trouve");
  end if;
end;


[Edité le 10/03/2004 à 09:12 par ftbass]
Go Top #7 Go Bottom
View ftbass's ProfileE-Mail ftbassVisit ftbass's HomepageView All Posts by ftbassU2U Member
bouba
Junior Member
MembreMembre
 
 
Messages: 3
Inscrit(e) le: 28/09/2006
Déconnecté(e)
Publié le 28/09/2006 à 09:34 Reply With Quote
RE : Exo 6: Tab1 en séquence dans Tab2

1. Il n'est jamais bon de s'amuser a faire soi-meme ce que le language peut faire pour nous.
Ada gere tres bien les comparaisons de donnees de type tableau, donc autant le laisser faire, cela simplifie
le code. ;)
2. De plus, on connait parfaitement la taille des donnees, donc il est preferable d'utiliser une boucle for plutot
qu'une boucle while.
3. Cette version est plus generale car elle autorise tout range entier valide pour indexer le tableau.
4. Si tab1 est plus grand que tab2, la boucle n'est pas executee, contrairement a la version precedente. D'ailleurs, si vous essayez de faire ce test, vous verrez que le compilo levera un warning car en verifiant les bornes du for, il s'en est apercu. ;) ... Si ce n'est pas le cas, changez de compilo, le votre est une bouze. ^^

code:

with Text_Io; use Text_Io;

procedure Tab is
 type Table is array(Integer range <>) of Integer;
 
 Tab1        : constant Table( 1 .. 3) := (1 , 2 , 3);
 Tab2        : constant Table(-3 .. 6) := (4, 3, 1, 2, 3, 9, 2, 1, 1, 2);
 Max         : constant Integer := Tab2'Last - Tab1'Length + 1;  
 
 type Result_T(Match_Found : Boolean := False) is
   record
     case Match_Found is
       when True  =>
         Index : Integer;
       when False =>
         null;
     end case;
   end record;
 
 Result : Result_T;
begin
 
 for Index in Tab2'First .. Max
 loop
   if Tab2(Index .. Index+Tab1'Length-1) = Tab1 then      
     Result := (Match_Found => True,
                Index       => Index);
     exit;
   end if;
 end loop;
 
 if Result.Match_Found then
   Put_Line("Tab1 trouve a partir de l'index " & Integer'Image(Result.Index));
 else
   Put_Line("Tab1 non trouve");
 end if;
end Tab;
Go Top #102 Go Bottom
View bouba's ProfileE-Mail boubaView All Posts by boubaU2U Member
Nouveau SujetNouveau sondageRépondre

Go Top
10.3.122.74 04:20 - 18 Juin 2025 10.3.122.74
[ 0.5659649 secondes | Effacer le cookie | 18 requêtes ]
Oxygen v1.0.11 © 2002  |  Oxygen WebSite © 2002