Enoncé précédent  Programme suivant

PROGRAMME 3  : Course de SKI ( I )

Pendant une course de SKI, on a relevé après un essai les temps mis par N concurrents. On désire, après avoir mis les informations sur fichier, obtenir d'abord le tableau d'affichage des temps mis par les N concurrents,   puis le tableau d'affichage concernant uniquement les trois premiers.

Les Données sur fichier ont la forme suivante :

1ère ligne : Nombre de concurrents sur 3 positions
dans les N lignes suivantes, on a recensé les informations concernant les concurrents. Chaque ligne est organisée comme suit :

Col 1 à 4  : Numéro du concurrent
Col 12 à 19 : Nom du concurrent
Col 30 à 31 : minutes
col 32 à 33 : secondes
Col 34 à 35 : centièmes de seconde

Le tableau d'affichage aura la forme suivante :

*----------*---------------*--------------*
*          *               *              *
*  Numero  *      Nom      *    Temps     *
*          *               *----*----*----*
*          *               *-Mm-*-Ss-*-Cc-*
*----------*---------------*----*----*----*
*          *               *    *    *    *
*      234 *       Hakim   *  22*  33*  89*
*          *               *    *    *    *
*----------*---------------*--------------*
*          *               *    *    *    *
*      567 *       Fairouz *  21*  56*  23*
*          *               *    *    *    *
*----------*---------------*--------------*
*          *               *    *    *    *
*    Etc
Ecrire l'algorithme et le Programme PASCAL correspondant.

Le programme

PROGRAM Ski;
  VAR
    Mm, Ss, Cc : LONGINT;
    M1, M2, S1, S2, C1, C2, C : CHAR;
    T1, T2, T3, T : LONGINT;
    I, J, N : INTEGER;
    Num1, Num2, Num3, Num : STRING;
    Nom1, Nom2, Nom3, Nom : STRING;
    Fdon, Fsort : TEXT;

  PROCEDURE Entete;
    BEGIN
      WRITELN(Fsort,'*----------*---------------*--------------*');
      WRITELN(Fsort,'*           *                *               *');
      WRITELN(Fsort,'*  Numero  *       Nom      *    Temps      *');
      WRITELN(Fsort,'*           *                *----*----*----*');
      WRITELN(Fsort,'*           *                *-Mm-*-Ss-*-Cc-*');
      WRITELN(Fsort,'*----------*---------------*----*----*----*');
    END;

  PROCEDURE Ligne ( Num, Nom : STRING; Mm, Ss, Cc : INTEGER);
    BEGIN
      WRITELN(Fsort,'*           *                *     *    *    *');
      WRITELN(Fsort,'*',Num:10,'*', Nom:15,'*', Mm:4,'*',Ss:4,'*',Cc:4,'*');
      WRITELN(Fsort,'*           *                *     *    *    *');
      WRITELN(Fsort,'*----------*---------------*--------------*');
    END;

  BEGIN
    ASSIGN(Fdon,'D_ski.Pas');
    ASSIGN(Fsort,'R_ski.Pas');
    RESET(Fdon);
    REWRITE(Fsort);
    READLN(Fdon,N);
    WRITELN(Fsort, 'Nombre de concurrents : ', N);
    Entete;

    T1:= 300000; T2:=300000; T3 := 300000;
    Num1:=''; Num2:=''; Num3 := '';
    Nom1:=''; Nom2:=''; Nom3 := '';
    FOR I:=1 TO N DO
      BEGIN
         Num:='';
        FOR J:=1 TO 4 DO
          BEGIN READ(Fdon, C);Num := Num+C   END;
        FOR J:=1 TO 7 DO READ(Fdon,C);
        Nom:='';
        FOR J:=1 TO 8 DO
          BEGIN READ(Fdon, C);Nom := Nom+C   END;
        FOR J:=1 TO 10 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;
        Ligne( Num, Nom, Mm, Ss, Cc);
T:= (60*Mm + Ss)*100 + Cc;
{ C'est le temps exprimé‚ en Cc }
IF T < T1
        THEN
          BEGIN
    T3 := T2; num3 := Num2; nom3 := Nom2;
    T2 := T1; num2 := Num1; nom2 := Nom1;
    T1 := T; num1 := Num; nom1 := Nom;
          END
ELSE
       IF T < T2
  THEN
            BEGIN
              T3 := T2;Num3 := Num2; nom3 := Nom2;
      T2 := T;Num2 := Num; nom2 := Nom;
    END
          ELSE
            IF T < T3
            THEN
              BEGIN
                T3 := T; Num3 := Num; Nom3 := Nom
              END
      END;

    { Ecriture des trois premiers}
    WRITELN(Fsort);
    WRITELN(Fsort);
    WRITELN(Fsort, 'Les trois premiers : ');
    Entete;
    Ss := T1 DIV 100;
    Cc := T1 - 100*Ss;
    Mm := Ss DIV 60;
    Ss := Ss - 60*Mm;
    Ligne(Num1, Nom1, Mm, Ss, Cc);

    Ss := T2 DIV 100;
    Cc := T2 - 100*Ss;
    Mm := Ss DIV 60;
    Ss := Ss - 60*Mm;
    Ligne(Num2, Nom2, Mm, Ss, Cc);

    Ss := T3 DIV 100;
    Cc := T3 - 100*Ss;
    Mm := Ss DIV 60;
    Ss := Ss - 60*Mm;
    Ligne(Num3, Nom3, Mm, Ss, Cc);
    CLOSE(Fsort)
  END.

Les données

Fichier D_ski.pas
4
234        Hakim              223389
567        Fairouz            215623
6789       Rachida            241267
12         Hakima             232299

Les résultats

Fichier R_ski.pas
Nombre de concurrents : 4
*----------*---------------*--------------*
*          *               *              *
*  Numéro  *      Nom      *    Temps     *
*          *               *----*----*----*
*          *               *-Mm-*-Ss-*-Cc-*
*----------*---------------*----*----*----*
*          *               *    *    *    *
*      234 *       Hakim   *  22*  33*  89*
*          *               *    *    *    *
*----------*---------------*--------------*
*          *               *    *    *    *
*      567 *       Fairouz *  21*  56*  23*
*          *               *    *    *    *
*----------*---------------*--------------*
*          *               *    *    *    *
*      6789*       Rachida *  24*  12*  67*
*          *               *    *    *    *
*----------*---------------*--------------*
*          *               *    *    *    *
*      12  *       Hakima  *  23*  22*  99*
*          *               *    *    *    *
*----------*---------------*--------------*
Les trois premiers : 
*----------*---------------*--------------*
*          *               *              *
*  Numéro  *      Nom      *    Temps     *
*          *               *----*----*----*
*          *               *-Mm-*-Ss-*-Cc-*
*----------*---------------*----*----*----*
*          *               *    *    *    *
*      567 *       Fairouz *  21*  56*  23*
*          *               *    *    *    *
*----------*---------------*--------------*
*          *               *    *    *    *
*      234 *       Hakim   *  22*  33*  89*
*          *               *    *    *    *
*----------*---------------*--------------*
*          *               *    *    *    *
*      12  *       Hakima  *  23*  22*  99*
*          *               *    *    *    *
*----------*---------------*--------------*