Enoncé précédentProgramme suivant 

PROGRAMME 8  : Course de ski (II)

On désire contrôler par ordinateur l'affichage d'une course de ski. Ecrire l'algorithme et le programme Pascal qui après chaque arrivée d'un concurrent affiche le classement partiel sous la forme :
<---10----> <------20-----------><-4-> <----14------>
*****************************************************
*Classement*  Nom Du Concurrent *Pays*    Temps     *
*          *                    *    *              *
*          *                    *    * Mn   Sec  Ct *
*****************************************************
*          *                    *    *              *
*      1   * ? ? ?              * ?  *   ?   ?    ? *
*          *                    *    *              *
*****************************************************
*          *                    *    *              *

Remarques :

1) A chaque arrivée, il faudra insérer le concurrent à la place correspondante au classement fait sur le temps de parcours.

2) description des données :
Pays, Nom prénom, Temps( en minutes, secondes et centièmes de seconde).  Les données sont disposées à raison d'une ligne par concurrent comme suit :

Pays BB    nom et prénom   BBMnScCs
< 4>  <     20            >  <  6   >

3) L'affichage se fera sur imprimante suivant le format ci-dessus. Chaque tableau sera imprimé au milieu d'une page du listing.

4 Le jeu d'essai comportera 10 concurrents, on n'oubliera pas de traiter les ex-aequos.

Le programme

PROGRAM Ski1;
  TYPE Typ = RECORD
    Nom , Pays : STRING;
    Temps : INTEGER
  END;
  VAR Mm, Ss, Cc : INTEGER;
    Trouv : BOOLEAN;
    T, I, J, K, N, Nbr : INTEGER;
    Pays, Nom : STRING;
    Fdon, Fsort : TEXT;
    Tab : ARRAY[1..10] OF Typ;

  PROCEDURE Entete;
    BEGIN
      WRITELN(Fsort);
      WRITELN(Fsort);
      WRITELN(Fsort,'*****************************************************');
      WRITELN(Fsort,'*Classement*  Nom Du Concurrent *Pays*     Temps     *');
      WRITELN(Fsort,'*           *                     *     *               *');
      WRITELN(Fsort,'*           *                     *     * Mn   Sec  Ct *');
      WRITELN(Fsort,'*****************************************************');
    END;

  PROCEDURE Ligne ( Rang : INTEGER; Pays,Nom : STRING; Mm, Ss, Cc : INTEGER);
    BEGIN
      WRITELN(Fsort,'*           *                     *     *               *');
      WRITELN(Fsort,'*   ',Rang:4,'*':4, Nom:15,'*', Pays:4,'*',Mm:4,' ',
                     Ss:4,' ',Cc:4,'*');
      WRITELN(Fsort,'*           *                     *     *               *');
WRITELN(Fsort,'*****************************************************');      END;
  PROCEDURE Lire(VAR Pays,Nom : STRING; VAR Mm, Ss, Cc :INTEGER);
    VAR J : INTEGER;
      M1, M2, S1, S2, C1, C2, C : CHAR;
    BEGIN
      Pays:='';FOR J:=1 TO 4 DO BEGIN READ(Fdon, C);Pays:= Pays+C END;
      FOR J:=1 TO 2 DO READ(Fdon,C);
      Nom:='';FOR J:=1 TO 20 DO BEGIN READ(Fdon, C);Nom := Nom+C   END;
      FOR J:=1 TO 2 DO READ(Fdon, C);
      READ(Fdon,M1);READ(Fdon,M2);
      Mm := (ORD(M2)-48) + (ORD(M1)-48)*10;
      READ(Fdon,S1);READ(Fdon,S2);
      Ss := ORD(S2)-48 + (ORD(S1)-48)*10;
      READ(Fdon,C1);READLN(Fdon,C2);
      Cc := ORD(C2)-48 + (ORD(C1)-48)*10;
    END;

   {Initialisation}
   BEGIN
     ASSIGN(Fdon,'D_ski1.Pas');
     ASSIGN(Fsort,'R_ski1.Pas');
     RESET(Fdon);
     REWRITE(Fsort);
     READLN(Fdon,N);
     WRITELN(Fsort, 'Nombre de concurrents : ', N);
     Nbr := 0;
     FOR I:=1 TO N DO
       BEGIN
         Lire(Pays, Nom, Mm, Ss, Cc);
         T := (60*Mm + Ss)*100 + Cc;
         J:= 1; Trouv := FALSE;
         WHILE ( J <= Nbr) AND (NOT Trouv) DO
          IF Tab(.J.).Temps >= T
           THEN    Trouv := TRUE
           ELSE    J := J + 1;
         IF Trouv
         THEN
            FOR K:=Nbr DOWNTO J DO   Tab(.K+1.) := Tab(.K.);
        Tab(.J.).Temps := T;
         Tab(.J.).Nom := Nom;
         Tab(.J.).Pays := Pays;
Nbr := Nbr + 1;
         WRITELN(Fsort);
         WRITELN(Fsort, ' >>> Classement après le concurrent ', I);
         WRITELN(Fsort);
         Entete;
         FOR K := 1 TO Nbr DO
           BEGIN
             T := Tab(.K.).Temps;
             Ss := T DIV 100;
             Cc := T - 100*Ss;
             Mm := Ss DIV 60;
             Ss := Ss - 60*Mm;
             Nom := Tab(.K.).Nom;
             Pays := Tab(.K.).Pays;
             Ligne(K, Pays, Nom, Mm, Ss, Cc)
           END
END;
       CLOSE(Fsort)
   END.

Les données

Contenu du fichier D_Ski1.Pas

4
ALGE   Hakima                014579
GERM   Rachida               025480
URSS   Hakim                 015987
BRES   Fairouz               013410

Les résultats

Contenu du fichier R_Ski1.Pas

Nombre de concurrents : 4

 >>> Classement après le concurrent 1

*****************************************************
*Classement*  Nom Du Concurrent *Pays*    Temps     *
*          *                    *    *              *
*          *                    *    * Mn   Sec  Ct *
*****************************************************
*          *                    *    *              *
*      1   * Hakima             *ALGE*   1   45   79*
*          *                    *    *              *
*****************************************************
 >>> Classement après le concurrent 2

*****************************************************
*Classement*  Nom Du Concurrent *Pays*    Temps     *
*          *                    *    *              *
*          *                    *    * Mn   Sec  Ct *
*****************************************************
*          *                    *    *              *
*      1   * Hakima             *ALGE*   1   45   79*
*          *                    *    *              *
*****************************************************
*          *                    *    *              *
*      2   * Rachida            *GERM*   2   54   80*
*          *                    *    *              *
*****************************************************
 >>> Classement après le concurrent 3
*****************************************************
*Classement*  Nom Du Concurrent *Pays*    Temps     *
*          *                    *    *              *
*          *                    *    * Mn   Sec  Ct *
*****************************************************
*          *                    *    *              *
*      1   * Hakima             *ALGE*   1   45   79*
*          *                    *    *              *
*****************************************************
*          *                    *    *              *
*      2   * Hakim              *URSS*   1   59   87*
*          *                    *    *              *
*****************************************************
*          *                    *    *              *
*      3   * Rachida            *GERM*   2   54   80*
*          *                    *    *              *
*****************************************************

>>> Classement après le concurrent 4

*****************************************************
*Classement*  Nom Du Concurrent *Pays*    Temps     *
*          *                    *    *              *
*          *                    *    * Mn   Sec  Ct *
*****************************************************
*          *                    *    *              *
*      1   * Fairouz            *BRES*   1   34   10*
*          *                    *    *              *
*****************************************************
*          *                    *    *              *
*      2   * Hakima             *ALGE*   1   45   79*
*          *                    *    *              *
*****************************************************
*          *                    *    *              *
*      3   * Hakim              *URSS*   1   59   87*
*          *                    *    *              *
*****************************************************
*          *                    *    *              *
*      4   * Rachida            *GERM*   2   54   80*
*          *                    *    *              *
*****************************************************