PROGRAM NOTA_TEST ;

uses Crt,dOS;

LABEL REL;

CONST  NUME_FISIER = 'SDH.REQ';
CONST  FISIER_NOTE = 'APEL.prn';

CONST  TIMP_INJUM  =2.0;  { in minute; se obtine nota/2 }
CONST  TIMP_TOTAL  =3.0;  { in minute; expira timpul de gindire }
CONST  __CEAS      =15000;  { reglaj fin temporizare; aproximativ 250  }

CONST  NR_INTREBARI=10; { nr. de intrebari selectate din fisier }


TYPE INTREB =  STRING[120];
     RAS = ARRAY[1..3] OF STRING[80];
     I_R = RECORD
             INTREBARE:INTREB;
             RASPUNS:RAS;
           END;
     MAT1 = ARRAY[1..3] OF REAL;
     MAT2 = ARRAY[1..3] OF INTEGER;

VAR I,J,F,K,R_C,Q,R,NR_TOTAL_INTR:INTEGER;
    TTI:LONGINT;
    VT:I_R;
    FISIER: FILE OF I_R;
    F_NOTE: TEXT;
    AFIS:MAT1;
    ORDDD:MAT2;
    REQ:ARRAY[1..30] OF INTEGER;
    CH: CHAR;
    nume:string[40];
    MIN,OX,OY:WORD;
    NOTA,IND_TP:REAL;

PROCEDURE MAX(AFIS:MAT1;VAR ORDDD:MAT2);

 VAR R:REAL;
     C,I,K :INTEGER;
 BEGIN
   REPEAT
     C:=0;
     FOR I:=1 TO 2 DO
      IF AFIS[I] > AFIS[I+1]
         THEN
           BEGIN
             C:= 1;
             R:=AFIS[I];
             AFIS[I]:=AFIS[I+1];
             AFIS[I+1]:=R;
             K:=ORDDD[I];
             ORDDD[I]:=ORDDD[I+1];
             ORDDD[I+1]:=K;
           END;
   UNTIL C = 0;
 END;

PROCEDURE INIT_FIS_NOTE; { deschide fisierul de note }

 VAR
      EXISTA:BOOLEAN;
 BEGIN
      ASSIGN(F_NOTE,FISIER_NOTE);
      {$I-}
      RESET(F_NOTE);
      CLOSE(F_NOTE);
      {$I+}
      EXISTA := (IOResult = 0);
      IF EXISTA=TRUE THEN APPEND(F_NOTE)
      ELSE REWRITE(F_NOTE);
 END; { init_fis_note }


PROCEDURE SALV_NOTA; { scrie numele si nota curenta in fisier }

 VAR
    LG:INTEGER;
 BEGIN
      LG:=LENGTH(NUME);
      WRITELN(F_NOTE,NUME,' ':(30-LG),NOTA:2:1,' / ',NR_INTREBARI,' intr.');
 END; { salv_nota }


BEGIN
     RANDOMIZE;
     ASSIGN(FISIER,NUME_FISIER);
     RESET(FISIER);
     NOTA:= 0;
     NR_TOTAL_INTR:=FILESIZE(FISIER);
     ClrScr;
     writeln(' Numele studentului');
     readln(nume);
     F:=0;
     FOR I:= 1 TO NR_INTREBARI DO
      BEGIN
            ClrScr;
            Writeln(nume);
            gotoxy(0,2); write('NOTA = ',NOTA:3:1);
            GOTOXY(1,5);
            WRITELN(' INTREBAREA NR.  ',I);WRITELN;
       REL: Q:= TRUNC(RANDOM(NR_TOTAL_INTR));
            IF I > 1 THEN
                       BEGIN
                         F:=0;
                         FOR K:=1 TO I-1  DO
                           IF Q=REQ[K] THEN F:=1;
                       END
                     ELSE REQ[1]:=Q;
            IF F=0 THEN
                     BEGIN
                     if q=0 then goto rel;
                      REQ[I]:=Q;
                      SEEK(FISIER,Q-1);
                      READ(FISIER,VT);
                      FOR J:=1 TO 3 DO
                        BEGIN
                          AFIS[J]:= RANDOM;
                          ORDDD[J]:=J;
                        END;
                      MAX(AFIS,ORDDD);
                      WRITELN(VT.INTREBARE);
                      WRITELN; WRITELN;
                      FOR J:=1 TO 3 DO
                        BEGIN
                          WRITELN(j,'.   ',VT.RASPUNS[ORDDD[J]]);
                          WRITELN;
                          IF ORDDD[J] = 1 THEN R_C := J;
                        END;
                      WRITELN; WRITELN;
                      WRITE('          RASPUNS CORECT 1 / 2 / 3 ?      ');

                      { TEMPORIZARE }

                      IND_TP:=1;
                      CH:='0';
                      MIN:=0;
                      OX:=WHEREX; OY:=WHEREY;

                      WHILE (MIN<60*TIMP_TOTAL) AND (CH='0') DO
                          BEGIN
                          GOTOXY(60,1);
                          WRITE('T = ',MIN,'/',60*TIMP_TOTAL:4:0);
                          MIN:=MIN+1;
                          IF MIN>60*TIMP_INJUM THEN
                                                BEGIN
                                                  IND_TP:=2;
                                                  GOTOXY(55,2);
                                                  WRITE('!! Ati depasit 2 minute !!');
                                                END;
                          TTI:=0;
                          WHILE (TTI<70*__CEAS) AND (CH='0') DO
                               BEGIN
                               IF KEYPRESSED THEN
                                     BEGIN
                                          CH:=READKEY;
                                          IF ((CH<'1') OR (CH>'3')) THEN
                                          CH:='0';
                                     END;
                               TTI:=TTI+1;
                               END;

                          END; { WHILE }

                      GOTOXY(OX,OY);
                      IF(CH<>'0') THEN BEGIN
                           WRITE(CH);
                           R:=ORD(CH)-ORD('0');
                           IF R = R_C THEN
                                   BEGIN
                                     NOTA := NOTA + 1/IND_TP;
                                     WRITELN('          RASPUNS CORECT  ');
                                   END
                                 ELSE
                                     WRITELN('          RASPUNS INCORECT ');
                           END
                      ELSE      WRITELN('          TIMP EXPIRAT ');
                      GOTOXY(60,1);
                      WRITE('T = ',MIN,'/',60*TIMP_TOTAL:4:0);
                      
                      REPEAT UNTIL KEYPRESSED;
                      CH:=READKEY;
                      END
                   ELSE GOTO REL;
       END;
     CLOSE(FISIER);

     INIT_FIS_NOTE;
     SALV_NOTA;
     CLOSE(F_NOTE);

     ClrScr;
     Writeln(nume);
     gotoxy(30,7);
     WRITELN;
     WRITELN;
     WRITELN('            NOTA : ':37,NOTA:2:1);
     IF NOTA = 10 then begin
                         gotoxy(27,4);
                         writeln(' F O A R T E    B I N E ');
                       END;
     {GoToXY(1,18);
     writeln('Algoritm pentru calculul notei la examen :');
     writeln;
     writeln('  ( Nota laborator + Punctaj examen x 2 ) / 5 ');
     Writeln;
     Writeln('Nota maxima = ( 10 + 20 x 2 ) / 5 = 10 ');}

     REPEAT UNTIL KEYPRESSED;
     CH:=READKEY;
END.

