Cours de programmation n°2

Procédures, fonctions, types et tableaux

Procédures et fonctions : principe

Les paramètres

Procédure ou fonction

procedure Proc_Ou_Fonc is

   function Plus  (X, Y  : Integer) return Integer is
      -- plus (x,y) = x+y
   begin
      return X+Y ;
   end Plus ;

   procedure Ajouter (X, Y : in Integer ; R : out Integer) is
      -- e.i.  indifferent (pas de condition). notons x0 la valeur de X, y0 la valeur de Y
      -- e.f.  R vaut x0 + y0.
   begin
      R := X + Y ;
   end Ajouter ;

   A, B, S : Integer ;

begin
   Put_Line("Entrez deux nombres");
   Get (A);
   Get (B);

   -- Pour imprimer la somme de A et B :
   Put (Plus (A, B)) ; -- une fonction s'utilise dans une expression, comme en maths

   -- ou :
   Ajouter (A, B, S) ; -- une procedure s'utilise comme une action,
   Put (S) ;           -- par exemple dans une sequence, entre des points-virgules

   -- put (Ajouter (A, B, ...))  n'a pas de sens
   -- Plus (A, B) tout seul n'en a pas non plus

end Proc_Ou_Fonc ;
Exercice : Faire une procédure (une fonction?) qui échange le contenu de deux variables (Integer)

Types de variables

Types enregistrement : record

procedure type_enregistrement is
 type Couleur is (Rouge, Vert, Bleu, Jaune);
 type Figure is
  record
    X,Y : Integer range 0..1000;
    Coul : Couleur;
  end record;

  cercle : Figure := (100,222,Rouge);
  Carre  : Figure;

  procedure Afficher(Fig : in Figure) is
  begin
     Put("La figure est placée en (");
     Put(Integer'Image(Fig.X) & "," & Integer'Image(Fig.Y));
     Put_Line("), elle est de couleur " & Couleur'Image(Fig.Coul));
  end Afficher;

begin
   Carre.X := 34;
   Carre.Y := 89;
   Carre.Coul := Vert;
   Afficher(Cercle);
   Afficher(Carre);
end type_enregistrement;

Les tableaux

type Tab is array (integer range 0..99) of Positive;
t1,t2,t3 : Tab;

Pluviosite : array (1..365) of Natural;

type Mois is (Janvier, Février, Décembre);
subtype nbJoursParMois is Natural range 28..31;
DureeMois : array (Mois) of nbJoursParMois;

begin
 Pluviosite(23) := 34;
 DureeMois(Février) := 28; -- ou 29
end;

Tableaux non contraints

type tabint is array (integer range <>) of integer ;
Doivent être instanciés pour être utilisables :
   type TabInt is array (Integer range <>) of Integer;

   procedure AfficheTab(T : in TabInt) is
   begin
      for I in T'Range loop   -- Range est très utile ici
         Put_Line("La valeur de T(" & Integer'Image(I) & ") est " & Integer'Image(T(I)));
      end loop;
   end AfficheTab;

   MonTab : TabInt(1..5); -- Il faut donner les bornes quand on en crée une variable
begin
   MonTab(1) := 51; -- etc...
   AfficheTab(MonTab);
end tableaux;

Tableaux dynamiques, declare au milieu des instructions.

N : natural ;
type Truc is ... ;

begin
    put("Nombre de trucs a stocker :");
    get (N) ;
    declare
        T : array (1..N) of Trucs  ;
        -- noter que si l'on tape 0, le tableau est vide.
    begin
        -- utiliser T 
        -- si on modifie N, la taille de T ne change pas. 
    end ;
end ;

Tableaux à plusieurs dimensions

type MatriceInt is array (integer range <>, integer range <>) of integer ;
subtype carre3 is MatriceInt (1..3, 1..3);
subtype rectangle34 is MatriceInt (1..3, 1..4);
C : carre3 ;
R : rectangle34 ;
...
C (i, j) ; -- acces aux elements

Tableaux créés pré-remplis

T : array ( 1..12 )  of integer := (others => 0); -- tout à 0
T : array (1..4) of integer := (1, 6, 3, 9);      -- toutes les valeurs, par position
-- ou (1 => x, 2..4 => 0); 		          -- des intervalles d'indices
-- ou (1|3 => x, 2 => 0, ...  );                  -- des cas non adjacents
-- ou ( .....   , others=>0);                     -- tous les cas restants.  

M : array (1..3, 1..4) of integer := 
    ( 1 => (0, 1, 2, 3),
      2 => (1|3 => 4, 2|4 => 7),
      3 => (others => 42)) ;

Le type String, un tableau de Character;

Comme si on avait : type String is array (positive range <>) of Character
S : String := "toto" ; -- indices 1..4

Opérations sur les tableaux

T1 := T2;  -- Affectation de toutes les cases 
T1(1..5) := T2(3..7);  -- Affectations de tranches
if (T1 = T2) then Put_Line("Tableaux identiques"); end if;

Parcours d'un tableau

T : array (1..12) of chose;

for i in T'Range loop
    -- traiter l'objet T(i) qui est de type chose
end loop ;

Recherche dans un tableau

Tableau sous utilisé

Traitement de tableaux en place