program StuAvg; {Input student records from StuFile, compute averages, output the passing and failing students to files.} type NameString = String[30]; GradeRange = 1..50; GradeType = 1..100; GradesType = array [GradeRange] of GradeType; StuRecType = record Name : NameString; Grades : GradesType; NumGr: GradeRange; Avg: Real end; var CurrStu : StuRecType; StuFile, PassFile, FailFile : Text; PassCount, FailCount : 0..MaxInt; procedure ReadStu (var StuFile : Text; var FStu {output} : StuRecType); { Reads one student record from text file StuFile into FStu. Pre : None Post: Data are read into record FStu. } var J : GradeRange; begin {ReadStu} with FStu do begin ReadLn(StuFile, Name); J := 1; while not EOLN(StuFile) do begin Read(StuFile, Grades[J]); J := Succ(J); end;{while} NumGr := Pred(J); ReadLn(StuFile); end {with} end; {ReadStu} procedure WriteStu( var WriteFile : Text; FName : NameString; FAvg : Real ); begin WriteLn(WriteFile, FName, FAvg:6:1); end; {ReadStu} function AvgMk( FGrades : GradesType; FNum : GradeRange ) : Real; {compute Avg for FStu} var J : GradeRange; GTot : Integer; begin GTot := 0; for J := 1 to FNum do GTot := GTot + FGrades[J]; AvgMk := GTot/FNum end;{GPA} begin{main} {first link to files} Assign(StuFile, 'C:\1711\StuFile.Txt'); Assign(PassFile,'PassFile.Txt'); Assign(FailFile,'FailFile.Txt'); {prepare for Input/OutPut} ReSet(StuFile); ReWrite(PassFile); ReWrite(FailFile); PassCount := 0; FailCount :=0; {initialize counters} while not EOF(StuFile) do begin ReadStu(StuFile, CurrStu); with CurrStu do begin Avg := AvgMk(Grades,NumGr); if Avg >= 50.0 then begin PassCount := PassCount +1; WriteStu(PassFile, Name, Avg) end else begin FailCount := FailCount +1; WriteStu(FailFile, Name, Avg) end;{if} end;{with} end;{while} Close(StuFile); Close(PassFile); Close(FailFile); {File processing complete} WriteLn; WriteLn(PassCount : 4, ' Passing records written.'); WriteLn(FailCount : 4, ' Failing records written.'); end.