ED n·3 Algorithmique et Programmation--------Corrigé



Objectifs
 




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. 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:
 
référence
nombre d'exemplaires
212
70
43
15
423
37

Le magasin propose une liste de 5 d'articles:
 
nom
référence
prix
brosse à dents
564
4.50
peigne
423
1.35
ampoule 100Watts
212
7.25
coupe-ongle
43
3.70
pinceau
728
78.50

Solution

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;