ED n·6-- Algorithmique et programmation-----corrigé


Objectifs


Exercice 2

On souhaite inverser un tableau de valeurs boursières. Une valeur boursière  est caractérisée par sa dénomination (un sigle de 5 caractères) et sa cotation. Le
tableau est préalablement trié selon l'ordre croissant des cotations, on veut le ranger selon l'ordre décroissant.

Question 1

-- Invariant :
--     T(a..i-1) et T(j+1..b) sont déjà inversés
-- Condition d'Arrêt de l'Itération :
--      si longueur(T) est impaire alors i=j
--      si longueur(T) est paire alors i=j+1
--      donc la CAI est : i>=j
-- Corps de boucle :
--      permuter(T(i) et T(j); incrémenter i; décrémenter j;
-- Initialisation :
--      le tableau T(a..b) est initialement non inversé, donc i=a et j=b
 

-- Algorithme
début
    i<-a;
    j<-b;
--  T(a..i-1) et T(j+1..b) sont déjà inversés
    tant que non(i>j) faire
        permuter(T(i) et T(j);
        incrémenter i;
        décrémenter j;
    fin tant que;
fin.
 

Question 2


 

subtype Cotation is Float range 0.0..Float'last;
type Sigle is String(1..5);
type ValeurBoursiere is
    record
        cote:Cotation;
        nom:Sigle;
    end record;
type Bourse is array(Natural range <>) of ValeurBoursiere;
 

Question 3

procedure inverser(T: in out Bourse);

Question 4

procedure inverser(T: in out Bourse) is
    i:Integer:=T'first;
    j:Integer:=T'last;
begin
    loop
    exit when i>=j;
        permuter(T(i),T(j));
        i:=i+1;
        j:=j-1;
    end loop;
end inverser;
 
 

Question 5


with Ada.Text_io;use Ada.Text_io;
with Ada.Float_Text_io;use Ada.Float_Text_io;

procedure inversion is
subtype Cotation is Float range 0.0..Float'last;
type Sigle is String(1..5);
type ValeurBoursiere is
    record
        nom:Sigle;
        cote:Cotation;
    end record;
type Bourse is array(Natural range <>) of ValeurBoursiere;

procedure permuter(x,y:in out ValeurBoursiere) is
  z:ValeurBoursiere:=x;
begin
  x:=y;
  y:=z;
end permuter;

procedure inverser(T: in out Bourse) is
    i:Integer:=T'first;
    j:Integer:=T'last;
begin
    loop
    exit when i>=j;
        permuter(T(i),T(j));
        i:=i+1;
        j:=j-1;
    end loop;
end inverser;

procedure put(T:in Bourse) is
begin
  put("(");new_line;
  for i in T'range loop
    put("(");
    put(T(i).cote);
    put(T(i).nom);
    put(")");
    new_line;
  end loop;
  put(")");
end put;

tab:Bourse(1..5):=(("BULL#",78.91),("accor",275.17),("valeo",406.69),("rexel",511.65),("Dexia",939.33));

begin
  put(tab);
  new_line;
  inverser(tab);
  put(tab);
  new_line;
end inversion;