PROGRAM VENTES;

(* Pour l'‚nonc‚, voir la proc‚dure AVERTIS.
   Particularit‚s du programme :
   - gestion des paramŠtres des proc‚dures
   - gestion des variables indic‚es
   - programme pas trŠs complexe n‚cessitant un minimum d'ordre dans les id‚es *)

USES CRT;

TYPE STR12 = ARRAY [1..12] OF STRING;
     INT12 = ARRAY [1..12] OF INTEGER;
     REA12 = ARRAY [1..12] OF REAL;

VAR  MOIS: STR12;        (* contiendra les noms des 12 mois de l'ann‚e         *)
     BOITES: INT12;      (* contiendra le nombre de boŒtes vendues chaque mois *)
     POURCENTAGE: REA12; (* contiendra le pourcentage de vente de chaque mois  *)
     CHOIX: CHAR;        (* contiendra le choix de l'utilisateur pour le classement des r‚sultats *)

PROCEDURE AVERTIS;
          BEGIN
          WRITELN ('Notre firme veut faire ses statistiques des ventes pour');
          WRITELN ('l''ann‚e pass‚e. Tu auras … introduire le nombre de boŒtes');
          WRITELN ('d''isopropargonoliphtaphŠne C vendues pour chaque mois de l''ann‚e.');
          WRITELN;
          WRITELN ('Les statistiques de ventes seront alors affich‚es, class‚es selon ton choix :');
          WRITELN ('Soit par ordre alphab‚tique des mois,');
          WRITELN ('Soit par ordre d‚croissant des pourcentages de ventes');
          WRITELN;
          END;

PROCEDURE INITIALISE (VAR MOIS: STR12);
          (* MOIS est modifi‚ et cela servira pour la suite: paramŠtre variable *)
          BEGIN
          (* Initialise les cases avec le nom de chaque mois de l'ann‚e *)
          MOIS [ 1] := 'janvier';
          MOIS [ 2] := 'f‚vrier';
          MOIS [ 3] := 'mars';
          MOIS [ 4] := 'avril';
          MOIS [ 5] := 'mai';
          MOIS [ 6] := 'juin';
          MOIS [ 7] := 'juillet';
          MOIS [ 8] := 'ao–t';
          MOIS [ 9] := 'septembre';
          MOIS [10] := 'octobre';
          MOIS [11] := 'novembre';
          MOIS [12] := 'd‚cembre';
          END;

PROCEDURE COMPLETE (MOIS: STR12; VAR BOITES: INT12);
          (* MOIS n'est pas modifi‚ (valeur) mais BOITES bien (variable) *)
          VAR i: SHORTINT;

          BEGIN
          (* ComplŠte ne nombre de boŒtes vendues chaque mois de l'ann‚e *)
          FOR i := 1 TO 12 DO
              BEGIN
              WRITE  ('Combien de boŒtes de ... vendues en ',MOIS [i]:9,' ? ');
              READLN (BOITES [i]);
              END;
          END;

PROCEDURE CHOISIS (VAR CHOIX: CHAR);
          BEGIN
          (* L'utilisateur choisit son critŠre de classement des r‚sultats *)
          REPEAT
                WRITELN;
                WRITELN ('Veux-tu trier par :');
                WRITELN ('- ordre alphab‚tique des mois  (a minuscule)');
                WRITELN ('- ordre d‚croissant des ventes (d minuscule)');
                WRITELN ('Pour arrˆter : taper 0');
                WRITE   ('Ton choix ? (a, d ou 0) : ');
                READLN  (CHOIX);
          UNTIL (CHOIX = 'a') OR (CHOIX = 'd') OR (CHOIX = '0');
          END;

PROCEDURE CALCULE (BOITES: INT12; VAR POURCENTAGE: REA12);
          (* Seul POURCENTAGE est modifi‚, BOITES ne sert qu'… faire le calcul *)
          VAR i, SOMME: INTEGER;

          BEGIN
          (* AprŠs le calcul de la masse totale des boŒtes vendues,
             calcul du pourcentage de vente pour chaque mois *)
          SOMME := 0;
          FOR i := 1 TO 12 DO
              SOMME := SOMME + BOITES [i];
          FOR i := 1 TO 12 DO
              POURCENTAGE [i] := BOITES [i] / SOMME * 100;
          END;

PROCEDURE TRIE (VAR MOIS: STR12; VAR BOITES: INT12; VAR POURCENTAGE: REA12; CHOIX: CHAR);
          (* Dans le tri, l'ordre des valeurs est modifi‚ (paramŠtres variables). CHOIX est valeur *)
          VAR i, ATTENTE_INT: INTEGER;
              ATTENTE_STR: STRING;
              ATTENTE_REA: REAL;
              PERMUTATION: BOOLEAN;

(* Pour les explications concernant le tri, voir le programme ELECTION.PAS *)

          BEGIN
          REPEAT
                PERMUTATION := FALSE;
                FOR i := 1 TO 11 DO
                    IF ((CHOIX = 'a') AND (MOIS [i] > MOIS [i+1])) OR
                       ((CHOIX = 'd') AND (BOITES [i] < BOITES [i+1])) THEN
(* SI (CHOIX est alphab‚tique ET la valeur alphab‚tique du nom du mois > que celle de la case suivante)
   (a ‚tant plus petit que b, b plus petit que c, ... ALBERT est plus petit qu'ALFRED)
   OU SI (CHOIX est par ordre d‚croissant des ventes ET le nombres de boŒtes de la case est < que celui
      de la case suivante) ALORS on permute *)
                       BEGIN
                       ATTENTE_STR       := MOIS [i];
                       ATTENTE_INT       := BOITES [i];
                       ATTENTE_REA       := POURCENTAGE [i];
                       MOIS [i]          := MOIS [i+1];
                       BOITES [i]        := BOITES [i+1];
                       POURCENTAGE [i]   := POURCENTAGE [i+1];
                       MOIS [i+1]        := ATTENTE_STR;
                       BOITES [i+1]      := ATTENTE_INT;
                       POURCENTAGE [i+1] := ATTENTE_REA;
                       PERMUTATION       := TRUE;
                       END;
          UNTIL NOT PERMUTATION;
          END;

PROCEDURE AFFICHE (MOIS: STR12; BOITES: INT12; POURCENTAGE: REA12);
          (* Tous les paramŠtres sont valeurs puisqu'on ne fait que les lire *)
          VAR i: SHORTINT;

          BEGIN
          CLRSCR;
          WRITELN ('Voici les r‚sultats selon l''ordre de classement demand‚ : ');
          WRITELN;
          FOR i := 1 TO 12 DO
              WRITELN ('Mois : ',MOIS [i]:9,', vente : ',BOITES [i]:5,' boŒtes, soit ',POURCENTAGE [i]:5:2,' % des ventes');
          END;

BEGIN (* du programme principal *)
CLRSCR;
AVERTIS;
INITIALISE (MOIS);
COMPLETE (MOIS, BOITES);
CALCULE (BOITES, POURCENTAGE);
REPEAT
      CHOISIS (CHOIX);
      IF CHOIX <> '0' THEN
         BEGIN  (* On ne fait rien si l'utilisateur a d‚cid‚ de quitter *)
         TRIE (MOIS, BOITES, POURCENTAGE, CHOIX);
         AFFICHE (MOIS, BOITES, POURCENTAGE);
         END;
UNTIL CHOIX = '0';
END.
