ED n°7-----Algorithmique et programmation----corrigé

Objectifs


Exercice 1

Un magasin de vente par correspondance souhaite utiliser un logiciel de gestion de ses ventes. Chaque article disponible dans le magasin est décrit par sa
référence (entier), par sa dénomination (une chaine de 10 caractères) et par son prix. L'ensemble des articles est représenté par un tableau.
 

Question 1

type Article(N:Positive:=10) is
   record
      ref:Positive;
      nom:String(1..N);
      prix:Float;
   end record;

type TableauD_Articles is array(Positive range <>) of Article;
 

Question 2

Les commandes des clients sont également représentées par un tableau. Une commande groupe l'ensemble des achats effectués par un client. Elle est
caractérisée par un numéro de commande, le nom du client, les achats et le solde. Un achat est caractérisé par la référence de l'article et le nombre
d'exemplaires commandés. Les achats du client sont représentés par une liste chainée. type Achat is
 record
  ref:Positive;
  nbExemplaires:Natural;
 end record;
 

type Cellule;
type RefAchats is access Cellule;
type Cellule is
 record
  elem:Achat;
  suivant:RefAchats;
 end record;

type Commande(N:Positive:=20) is
   record
      numeroCommande:Positive;
      nomDuClient:String(1..N);
      lesAchats:RefAchats;
      solde:Float;
   end record;
 

Question 3

procedure ajouter(a:in Achat; c:in out Commande) is
-- création d'un objet lesAchats

refA:RefAchats:=new Cellule'(a,Null);
begin
-- ajout en tete de liste

  refA.suivant:=c.lesAchats;
 c.lesAchats:=refA;
end ajouter;

ou bien

procedure ajouter(a:in Achat; c:in out Commande) is
begin
 c.lesAchats:=new Cellule'(a,c.lesAchats);
end ajouter;
 

Question 4

procedure modifier(c:in out Commande; n:in Natural;r:in Positive) is
-- pointeur auxiliaire pour parcourir la liste

courant:RefAchats:=c.lesAchats;
referenceInconnue:exception;
begin
 loop
  --fin de la liste

  if courant=null then raise referenceInconnue; end if;
  -- on a trouvé l'achat

  exit when courant.elem.ref=r;
  -- faire progresser le pointeur
   courant:=courant.suivant;
  end loop;
  courant.elem.nbExemplaires:=n;
 exception
  when referenceInconnue=> put("reference inconnue");raise;
end modifier;

Question 5

function nbAchats(c:Commande) return Natural is
courant:RefAchats:=c.lesAchats;
nb:Natural:=0;
begin
  loop
    exit when courant=null;
    nb:=nb+courant.elem.nbExemplaires;
    courant:=courant.suivant;
  end loop;
  return nb;
end nbAchats;

ou bien

function nbAchats(c:Commande) return Natural is
  function lg(l:RefAchats) return Natural is
  begin
    if l=NULL then return 0;
    else 1+lg(l.suivant);
   end if;
  end lg;
begin
  return lg(c.lesAchats);
end nbAchats;