ED n°7-----Algorithmique et programmation----corrigé |
Objectifs
-
Type accès
-
Utilisation de liste
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
-
Définir le type Article et le type
TableauDArticles.
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.
-
Définir le
type Commande.
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
-
Ecrire une procédure Ada qui ajoute un achat à une commande.
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
-
Ecrire une procédure qui modifie, dans une
commande, le nombre d'exemplaires d'un article acheté connaissant
sa référence.
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
-
Ecrire une fonction qui retourne le nombre d'articles achetés lors
d'une commande.
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;