Enoncé précédent Programme suivant

PROGRAMME 6 : Analyse des constantes 'virgule flottante'

Soit sur le ruban de la machine caractères une suite de constantes réelles représentées en Virgule flottante. La suite est terminée par le caractères '$'. Les constantes sont séparées par une combinaison de blancs et de virgules. Ecrire un algorithme qui donne pour chaque constante correcte ses attributs w et d. On imprimera le nombre de constantes incorrectes. Une constante en virgule flottante a la forme suivante :
[+/-] [chchch...] [.][chchch....] E [+/-]chch

Les crochets désignent les parties facultatives, le symbole / désigne ou.

Le programme

PROGRAM Virguleflottante;
  VAR Mot : STRING[30];
    Fe, Fs : TEXT;
    C : CHAR; W, D : INTEGER;

  FUNCTION Chiffre( C : CHAR) : BOOLEAN;
    BEGIN
      IF (C >='0' ) AND ( C <= '9')
      THEN Chiffre := TRUE
      ELSE Chiffre := FALSE;
    END;

  PROCEDURE Erreur;
    BEGIN
      WHILE (C <>' ')  AND  ( C <>'$' )   DO
        BEGIN
          Mot := Mot + C;
          READ(Fe,C);
        END;
      WRITELN(Fs, Mot : 35, ' Constante erronée' : 30);
    END;

  BEGIN
    ASSIGN(Fe, 'D_vf.Pas');
    ASSIGN(Fs, 'R_vf.Pas');
    RESET(Fe);
    REWRITE(Fs);
    READ(Fe, C);

    WHILE C <> '$' DO
      BEGIN
        Mot := '';
        W := 0; D := 0;

        WHILE C=' ' DO   READ(Fe,C);
          IF (C = '+') OR( C ='-')
          THEN
            BEGIN
              W := 1; Mot := Mot + C; READ(Fe,C);
            END;

        WHILE ( ( C<>'.')  AND (C<>'E') AND ( C<> ' ') AND (C<>'$')
                  AND ( Chiffre(C) )  ) DO
          BEGIN
            W := W + 1;
            Mot := Mot + C;
            READ(Fe, C)
          END;

        IF C = '.'
        THEN
          BEGIN
            W := W + 1;
            Mot := Mot + C;
            READ(Fe,C);
            WHILE ( ( C<>' ') AND ( C <>'$') AND (Chiffre(C)) AND
                    ( C<>'E') ) DO
              BEGIN
                W := W + 1; D := D + 1; Mot := Mot + C;
                READ(Fe,C)
              END;
          END;

        IF C = 'E'
        THEN
          BEGIN
            Mot := Mot + C;
            W := W + 1;
            READ(Fe, C);

            IF (C='+')  OR (C='-')
            THEN
              BEGIN
                W := W +1; Mot := Mot + C; READ(Fe, C)
              END;

            IF Chiffre(C)
            THEN
              BEGIN
                W := W + 1; Mot := Mot + C; READ(Fe, C);
                IF Chiffre(C)
                THEN
                  BEGIN
                    W := W + 1;
                    Mot := Mot + C;
                    READ(Fe,C);
                    IF( C =' ') OR( C='$')
                    THEN
                      WRITELN (Fs, Mot: 35, 'W=':10 ,W:2, '  D=':10, D:2);
                  END
                ELSE Erreur
              END
            ELSE Erreur
          END
        ELSE
          IF C <> '$' THEN Erreur
      END;
      CLOSE(Fs);
  END.

Les données

Contenu du fichier D_Vf.Pas

123.. 234.543E02     12E21     23.6754E-23  EEE   231E.23  E+12    1.1E-11 .345E04   -.23E00   34ADSE $

Les résultats

Contenu du fichier R_Vf.Pas

123..       Constante erronée
234.543E02  W=10        D= 3
12E21       W= 5         D= 0
23.6754E-23 W=11        D= 4
EEE         Constante erronée
231E.23     Constante erronée
E+12        W= 4         D= 0
1.1E-11     W= 7        D= 1
.345E04     W= 7        D= 3
-.23E00     W= 7        D= 2
34ADSE      Constante erronée