ED n·3 Algorithmique et Programmation--------Corrigé |
Les commandes des clients sont également représentées par un tableau. Une commande groupe l'ensemble des achats effectués par un client. Une commande 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. On se limitera à 10 achats par commande.
Travail demandé
Solution
type Achat is
record
ref:Integer;
nbExemplaires:Natural;
end record;
type TableAchats is array(Integer range <>) of Achat;
type Commande is
record
numeroCommande:Positive;
nomDuClient:String(1..4);
lesAchats:TableAchats(1..3);
solde:Float;
end record;
Question 3
On souhaite calculer le solde d'une commande.
Travail demandé
Solution
-- raffinement niveau 1
début
pour chaque achat de la commande
faire
chercher
la référence de l' article commandé;
chercher le prix
de l'article correspondant à cette reference;
calcul du coût
de la ligne de commande (prix*nombre d'exemplaires);
cumuler ce coût
au solde courant;
fin faire;
fin.
-- raffinement niveau 2
-- chercher le prix de l'article correspondant à
cette reference;
-- hypothèse: l'article recherché existe dans le tableau d'articles
début
pour chaque article du tableau
d'articles faire
si la référence
de l'article est égale à la référence de l'article
recherché
alors le
prix recherché est égal au prix de cet article;
fsi;
fin faire;
fin.
function chercherLePrixD_unArticle
(x:in TableauD_Articles;r:in
Integer) return Float is
begin
for i in x'range loop
if x(i).ref=r
then
return x(i).prix;
end if;
end loop;
end chercherLePrixD_unArticle;
function soldeD_uneCommande (c:in Commande;a:in TableauD_Articles)
return Float is
uneRef:integer;
unPrix:float;
total:Float:=0.0;
begin
s:=0.0;
for i in c.lesAchats'range
loop
--chercher la reference d un article commande
uneRef:=c.lesAchats(i).ref;
--chercher le prix de l article de cette reference
unPrix:=chercherLePrixD_unArticle(a,uneRef);
-- Total prix d'un meme article
total:=unPrix*Float(c.lesAchats(i).nbExemplaires);
--cumuler ce prix au solde courant
s:=s+total;
end loop;
return s;
end soldeD_uneCommande;
Question 4
Mr toto a acheté 3 articles:
|
|
|
|
|
|
|
|
Le magasin propose une liste de 5 d'articles:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
with Ada.Text_io;use Ada.Text_io;
with Ada.Float_Text_io;use Ada.Float_Text_io;
with Ada.Integer_Text_io;use Ada.Integer_Text_io;
procedure vpc is
type Article is
record
ref:Integer;
nom:String(1..3);
prix:Float;
end record;
type TableauD_Articles is array (Integer range <>) of Article;
type Achat is
record
ref:Integer;
nbExemplaires:Natural;
end record;
type TableAchats is array(Integer range <>) of Achat;
type Commande is
record
numeroCommande:Positive;
nomDuClient:String(1..4);
lesAchats:TableAchats(1..10);
nbAchats:Positive range 1..10;
solde:Float;
end record;
function chercherLePrixD_unArticle
(x: TableauD_Articles;r: Integer) return
Float is
begin
for i in x'range loop
if x(i).ref=r
then
return x(i).prix;
end if;
end loop;
end chercherLePrixD_unArticle;
function soldeD_uneCommande (c: Commande;a: TableauD_Articles) return Float
is
uneRef:integer;
unPrix:float;
total:Float:=0.0;
begin
s:=0.0;
for i in 1..c.nbAchats
loop
--chercher la reference d un article commande
uneRef:=c.lesAchats(i).ref;
--chercher le prix de l article de cette reference
unPrix:=chercherLePrixD_unArticle(a,uneRef);
-- Total prix d'un meme article
total:=unPrix*Float(c.lesAchats(i).nbExemplaires);
--cumuler ce prix au solde courant
s:=s+total;
end loop;
return s;
end soldeD_uneCommande;
procedure completerLeSoldeD_uneCommande
(c:in out Commande;a:in TableauD_Articles)
is
begin
c.solde:=soldeD_uneCommande(c,a);
end completerLeSoldeD_uneCommande;
tart:TableauD_Articles(1..3):=((43,"abc",10.0),(212,"cde",10.0),(423,"fgh",10.0));
tach:TableAchats(1..3):=((212,70),(43,15),(423,37));
com:Commande:=(1,"toto",tach,0.0);
solde:Float;
begin
put("Le solde de la commande de Mr toto est
de : ");
soldeD_uneCommande(com,tart,solde);
put(solde);new_line;
put_line("Ce solde est enregistre dans la commande
de Mr toto");
completerLeSoldeD_uneCommande(com,tart);
put("detail de cette commande : ");
put("numero : "); put(com.numeroCommande,width=>3);new_line;
put("nom du client : "); put(com.nomDuClient);new_line;
put("solde : ");put(com.solde);new_line;
new_line;new_line;
end vpc;