program GPAv; {Input a student record, compute GPA, output the record.} type IDType = 1..2500; NameString = String[30]; GradeRange = 1..50; GradeType = 'A'..'F'; GradesType = array [GradeRange] of GradeType; StuRecType = record ID : IDType; Name : NameString; PersInfo : Char; Grades : GradesType; end; var St1, St2 : StuRecType; procedure ReadStu (var FStu {output} : StuRecType); { Reads one student record into FStu. Pre : None Post: Data are read into record FStu. } var J : GradeRange; begin {ReadEmployee} with FStu do begin Write ('ID> '); ReadLn (ID); Write ('Name> '); ReadLn (Name); Write ('Sex (F or M)> '); ReadLn (PersInfo); J := 1; Write ('Grades in completed courses (end with Z)> '); Read(Grades[J]); while ('A' <= Grades[J]) and (Grades[J] <= 'F') do begin J := Succ(J); Read (Grades[J]) end{while} end {with} end; {ReadStu} procedure WriteStu( FStu {input} : StuRecType ); var J : GradeRange; begin with FStu do begin Write ('ID = ', ID :4); Write (' Name: ', Name); WriteLn (' Gender: ', PersInfo : 2); WriteLn; J := 1; Write ('Grades in completed courses: '); repeat Write (Grades[J] : 2); J := Succ(J) until Grades[J] > 'F'; WriteLn end {with} end; {ReadStu} function GPA ( FGrades : GradesType ) : Real; {compute GPA for FStu} var J : GradeRange; GTot : Integer; begin GTot := 0; J := 1; repeat case FGrades[J] of 'A' : GTot := GTot + 4; 'B' : GTot := GTot + 3; 'C' : GTot := GTot + 2; 'D' : GTot := GTot + 1 end{case}; J := Succ(J) until FGrades[J] > 'F'; GPA := GTot/Pred(J) end;{GPA} begin{main} ReadStu(St1); St2 := St1; WriteLn; WriteLn('The student described by: '); WriteStu(St2); WriteLn; WriteLn('has Grade Point Average: ', GPA(St2.Grades) : 5:1) end.