%-------------------------------------------------------------------- % csc 148s, 1996, Assignment 1: Calculating grade-point averages % name: >> Vincent Gogan << % student number: >> Your student number here << % lecturer: >> Your lecturer's name here << % lecture time: >> Your lecture time here << % tutor: >> Your tutor's name here << %-------------------------------------------------------------------- % Converstion tables % ------------------------------------------------------------------- % The tables of conversion between percentages, letters and grade % points. % Instead of parallel arrays, I used an array of records. This % better reflects the structure of the data. const numThresholds := 14 const gradeTable : array 1..numThresholds of record percentage : int letter : string(2) points : real end record := init(init(90, "A+", 4.3), init(85, "A", 4.0), init(85, "A-", 3.7), init(77, "B+", 3.3), init(73, "B", 3.0), init(70, "B-", 2.7), init(67, "C+", 2.3), init(63, "C", 2.0), init(60, "C-", 1.7), init(57, "D+", 1.3), init(53, "D", 1.0), init(50, "D-", 0.7), init(35, "E", 0.3), init(0, "F", 0.0)) % function GradePoints % -------------------------------------------------------------------- % Given a percentage, return the corresponding grade point value. function GradePoints (percent : int) : real assert percent >= 0 for i : 1..numThresholds if percent >= gradeTable(i).percentage then result gradeTable(i).points end if end for % Should never happen assert false end GradePoints % function Letter % ------------------------------------------------------------------- % Given a grade-point value, return the corresponding letter grade. function Letter (gp : real) : string(2) assert gp >= 0.0 for i : 1..numThresholds if gp >= gradeTable(i).points then result gradeTable(i).letter end if end for % Should never happen assert false end Letter % Main Program % ------------------------------------------------------------------- % The variable names were determined by the code that was given. var studentNo, oldTotalCourses, newTotalCourses, nCourses : int var oldGPA, newGPA, termGPA : real var termGPAletter, newGPAletter : string(2) var studentName : string % For each student, read their data and process it. Stop when we get % a student number of 000000000. loop % Read the data for the next student get studentNo exit when studentNo = 0 get studentName, oldTotalCourses, oldGPA, nCourses % New code begins var markTotal : int := 0 var GPATotal : real := 0.0 % Read in course marks. for i : 1..nCourses var newMark : int get newMark markTotal += newMark GPATotal += GradePoints(newMark) end for % Calulate term GPA (watch out for division by zero). if nCourses > 0 then termGPA := GPATotal/nCourses else termGPA := 0.0 end if termGPAletter := Letter(termGPA) % Calculate overal GPA (watch out for division by zero). newTotalCourses := oldTotalCourses + nCourses if newTotalCourses > 0 then newGPA := (oldGPA*oldTotalCourses + GPATotal)/newTotalCourses else newGPA := 0.0 end if newGPAletter := Letter(newGPA) % New code ends % Output the results put studentNo, " ", studentName :20, " ", newTotalCourses :3, termGPA :6:2, " ", termGPAletter :2, newGPA :6:2, " ", newGPAletter :2 end loop