PROGRAM CourseWork(Input,Output); USES Crt,dos; TYPE Mark_Type = ARRAY[1..8] OF Byte; VAR CW,A : Byte; PROCEDURE First_Record( VAR Possible : Mark_Type; VAR X : Byte; VAR FileCW : Text); VAR Ch : Char; path : string; BEGIN getdir(0,path); ASSIGN(FileCW,path+'\Student.dat'); RESET(FileCW); READ(FileCW,CW); IF (CW < 6) OR (CW > 8) THEN BEGIN WRITELN('Error, Coursework must be between 6 and 8'); Ch := READKEY; HALT; END; CASE CW OF 6 : X := 29; 7 : X := 33; 8 : X := 37; END; FOR A := 1 TO CW DO BEGIN READ(FileCW,Possible[A]); IF (Possible[A] < 10) OR (Possible[A] > 100) THEN BEGIN WRITELN('Error, Possible must be between 10 and 100'); Ch := READKEY; HALT; END; END; END; PROCEDURE Mark_Record( Possible : Mark_Type; VAR Mark : Mark_Type; VAR ID : Integer; VAR FileCW : Text); VAR Ch : Char; BEGIN READ(FileCW,ID); FOR A := 1 TO CW DO BEGIN READ(FileCW,Mark[A]); IF (Mark[A] < 0) OR (Mark[A] > Possible[A]) THEN BEGIN WRITELN('Error, Mark must be greater than 0 and less than possible'); Ch := READKEY; HALT; END; END; END; PROCEDURE Calc_Average( Mark, Possible : Mark_Type; VAR Aver : Byte); VAR MarkTot, PosTot : Integer; BEGIN MarkTot := 0; PosTot := 0; FOR A := 1 TO CW DO BEGIN MarkTot := MarkTot + Mark[A]; PosTot := PosTot + Possible[A]; END; Aver := Round(MarkTot / PosTot * 100); END; PROCEDURE Calc_Grades( Aver : Byte; VAR Grade : Byte; VAR Result : String); BEGIN IF Aver >= 50 THEN Result := 'Pass' ELSE Result := 'Fail'; CASE Aver OF 80..100 : Grade := 1; 70..79 : Grade := 2; 60..69 : Grade := 3; 55..59 : Grade := 4; 50..54 : Grade := 5; 45..49 : Grade := 6; 40..44 : Grade := 7; 35..39 : Grade := 8; 30..34 : Grade := 9; 0..29 : Grade := 10; END; END; PROCEDURE Pause( VAR Row,Page : Byte); VAR Ch : Byte; BEGIN GOTOXY(12,24); WRITELN('Please press the spacebar to continue !'); WHILE Ch <> 32 DO Ch := ORD(READKEY); Page := Page + 1; Row := 1; CLRSCR; END; PROCEDURE Display_Coursework( Mark, Possible : Mark_Type; Aver,Grade,X : Byte; Result : String; ID : Integer; VAR Row,Page : Byte); CONST Space = ' '; BEGIN GOTOXY(27,23); WRITELN('Page ',Page); GOTOXY(1,Row); WRITE('ID NO. ',ID,Space:2); FOR A := 1 TO CW DO WRITE('CW',A,' '); WRITELN(' Aver Grade'); WRITELN('Actual ',Space:X, Aver:3,Space:2,Grade:4); WRITELN('Possible',Space:X, '100',Space:2,Result:4); GOTOXY(12,Row + 1); FOR A := 1 TO CW DO WRITE(Mark[A]:4); GOTOXY(12,Row + 2); FOR A := 1 TO CW DO WRITE(Possible[A]:4); Row := Row + 4; END; { Start Of Main Program } VAR Mark : Mark_Type; Possible : Mark_Type; FileCW : Text; Result : String; ID : Integer; Grade,Average : Byte; X,Y,Row,Page : Byte; BEGIN CLRSCR; Row := 1; Page := 1; First_Record( Possible,X,FileCW); Mark_Record( Possible, Mark,ID,FileCW); WHILE ID <> -1 DO BEGIN Calc_Average(Mark,Possible,Average); Calc_Grades(Average,Grade,Result); Display_Coursework( Mark,Possible,Average,Grade,X,Result,ID, Row,Page); Y := WHEREY; IF Y = 19 THEN Pause(Row,Page); Mark_Record(Possible,Mark,ID,FileCW); END; IF Y <> 19 THEN Pause(Row,Page); CLOSE(FileCW); END. { End of Main Program }