Enoncé précédent

PROGRAMME 10 : Inventaire

On dispose d'un fichier texte PASCAL décrivant la liste des produits en stock dans les différents magasin d'une chaîne de supermarchés. Chaque ligne de ce fichier a le format suivant :

n°produit   prix unitaire   nombre d'unités en stock
<-- 4 -->BB <---- 7 ---->BB <--------  4----------->

La dernière ne contient que des zéros. B désigne un blanc.

1) Créer à partir de ce fichier un autre fichier STOCK (de type FILE)  où chaque enregistrement est une structure à 3 champs : numéro du produit, prix unitaire et nombre d'unités en stock.


2) Pour l'inventaire de fin d'année et à partir du fichier STOCK défini en 1), éditer un état ayant la forme suivante:

MAGASIN 1
RAYON 1 : MONTANT DU STOCK ???
RAYON 2 : MONTANT DU STOCK ???
............
    MONTANT TOTAL DU STOCK ???

MAGASIN 2
RAYON 1 : MONTANT DU STOCK ???
............


MONTANT DU STOCK POUR L'ENSEMBLE DES MAGASIN  ???

où les '?' sont remplacés par les valeurs calculées par le programme.
- Les numéros de magasins et de rayons dans chaque magasin sont supposés tous présents à partir de 1. Le fichier est trié par numéro de magasin croissant et pour un magasin donné par numéro de rayon croissant.
- Pour un produit donné, e numéro de magasin est constitué par les deux premiers chiffres du numéro de produit, et le numéro du rayon par les deux chiffres suivants.
Exemple  : O4174043  produit vendu au magasin n° 4, rayon n° 17
Pour les exercices 1) et 2) fournir les algorithmes avant de donner les programmes PASCAL correspondants.

Le programme

PROGRAM Stock;
  TYPE
    T = RECORD
      Nm : INTEGER;{numéro de magasin}
      Nr : INTEGER;{numéro de rayon}
      Num: STRING
    END;

    Typearticle = RECORD
      Numprod : T;
      Pu : REAL;
      Qte : INTEGER
    END;

    Tfile = FILE OF Typearticle;
  VAR
    Im, Ir : INTEGER;
    Mmag, Mray, Mtotal : REAL;
    E : Typearticle;
    Fsort : TEXT;
    Fstock : Tfile;
    Ftext : TEXT;

  { Création du fichier Fstock à partir d'un fichier Text}

  PROCEDURE Creer(VAR Ft : TEXT; VAR Fs : Tfile );
    VAR Num : STRING;
      Pu : REAL;
      Qte : INTEGER;
      Nm, Nr : INTEGER;
      Art : Typearticle;

    PROCEDURE Lire( VAR Nm, Nr:INTEGER;VAR Num : STRING;VAR Pu:REAL;
                    VAR Qte : INTEGER );
      VAR N_m, N_r: STRING;
        J : INTEGER;
        C : CHAR;
      BEGIN
        N_m:='';
        FOR J:=1 TO 2 DO
          BEGIN READ(Ft, C);N_m := N_m+C   END;
        Nm := ORD(N_m(.2.))-48 + (ORD(N_m(.1.))-48)*10;
        N_r:='';
        FOR J:=1 TO 2 DO
          BEGIN READ(Ft, C);N_r := N_r+C   END;
        Nr := ORD(N_r(.2 .))-48 + (ORD(N_r(.1.))-48)*10;
        Num:='';
        FOR J:=1 TO 4 DO
          BEGIN READ(Ft, C);Num := Num+C   END;
        FOR J:=1 TO 2 DO READ(Ft,C);
        READ(Ft, Pu);
        READLN(Ft, Qte);
      END;

    BEGIN
      ASSIGN(Ft,'D_stock.Pas');
      ASSIGN(Fs,'R1_stock');
      RESET(Ft);
      REWRITE(Fs);
      Lire(Nm, Nr, Num, Pu, Qte);
      WHILE ( Nm <> 0 ) DO
        BEGIN
          Art.Numprod.Nm := Nm;
  Art.Numprod.Nr := Nr;
  Art.Numprod.Num := Num;
          Art.Pu := Pu;
  Art.Qte := Qte;
  WRITE(Fs, Art);
          Lire(Nm, Nr, Num, Pu, Qte);
        END;
      Art.Numprod.Nm := 0;
      WRITE(Fs,Art);
    END;

  { Inventaire}
  BEGIN
    ASSIGN(Fstock,'R1_stock');
    Creer(Ftext, Fstock);
    ASSIGN(Fsort,'R_stock.Pas');
    REWRITE(Fsort);
    RESET(Fstock);
    READ(Fstock, E);
    Im := 1; Ir := 1; Mray := 0;
    Mmag := 0;  Mtotal := 0;
    WRITELN(Fsort, ' ':5,'Magasin Nø',Im:3);
    WHILE (NOT EOF(Fstock) ) DO
      IF E.Numprod.Nm = Im
      THEN
        IF E.Numprod.Nr = Ir
    then
          BEGIN
            Mray := Mray + E.Qte * E.Pu;
            READ(Fstock, E)
          END
        ELSE
          BEGIN
    WRITELN(Fsort,' ':10,'Rayon Nø', Ir:3,':':10, Mray:8:2 );
            Mmag := Mmag + Mray;
            Mray := 0;
            Ir := Ir + 1
  END
      ELSE
        BEGIN
          Mmag := Mmag + Mray;
          Mtotal := Mtotal + Mmag;
          WRITELN(Fsort,' ':10,'Rayon Nø', Ir:3,':':10, Mray:8:2 );
          WRITELN(Fsort);
          WRITELN(Fsort,'*':10,' Montant total du rayon : ', Mmag:8:2);
          WRITELN(Fsort);
          WRITELN(Fsort,' ':5,'Magasin Nø', Im+1:3);
          Im:=Im + 1;
  Ir := 1;
          Mmag := 0;
          Mray := 0;
        END;
    WRITELN(Fsort,' ':10,'Rayon Nø', Ir:3,':':10, Mray:8:2 );
    Mmag := Mmag + Mray;
    WRITELN(Fsort,'*':10,' Montant total du rayon : ', Mmag:8:2);
    WRITELN(Fsort);
    Mtotal := Mtotal + Mmag;
    WRITELN(Fsort,'*':5,' Montant total du stock : ', Mtotal:8:2 );
    CLOSE(Fsort)
  END.

Les données

Contenu du fichier D_Stock.Pas

01014532  13.23  24
01014536  45.34  12
01022343  23.23  16
01025643  15.8   42
01036798  12     87
02016754  6.76   12
02016543  5.4    98
02017845  1.65   34
03014444  3.56   12
03025555  7.89   8
03036666  7.54   23
04012222  77.2   34
00000000  0000   00

Les résultats

Contenu du fichier  R_Stock.Pas

Magasin Nø  1
          Rayon Nø  1          :  861.60
          Rayon Nø  2          : 1035.28
          Rayon Nø  3          : 1044.00

         * Montant total du rayon :  2940.88

     Magasin Nø  2
          Rayon Nø  1          :  666.42

         * Montant total du rayon :   666.42

     Magasin Nø  3
          Rayon Nø  1          :   42.72
          Rayon Nø  2          :   63.12
          Rayon Nø  3          :  173.42

         * Montant total du rayon :   279.26

     Magasin Nø  4
          Rayon Nø  1          : 2624.80
         * Montant total du rayon :  2624.80

    * Montant total du stock :  6511.36