Lab 2: Code Reading
{ Examine the following program and answer these questions. Where a }
{ asks for a line number or numbers, use the line number as shown at the }
{ bottom of editor screen. }
{ }
{ 1. How many procedures are declared in the program? }
{ 2. What is the declared type for the variables Percent? }
{ 3. On what lines is there a test with the operator >= ? }
{ 4. On what line does the first IF-THEN-ELSE statement in procedure }
{ LetterGrade start? }
{ 5. On what line does it end? }
{ 6. On what lines is there an operator for division? }
{ 7. What lines make up the main program? }
{ 8. Does procedure GetData contain an assignment operation? }
{ 9. On what lines (note the plural) is the FOR loop in the main program? }
{ 10. What is the initial value of Index in the FOR loop? }
{ 11. What is the name of the program? }
{ 12. On what line are there two statements? }
{ 13. What value is assigned to NumD in procedure Initialization? }
{ 14. Is there an assignment statement in procedure GetData? }
{ 15. How many statements are there in procedure PrintDetail? }
{ }
{ WRITE YOUR ANSWERS ON A SHEET OF PAPER AND HAND IT TO ME (RTH) OR NICK }
{ If you have time, compile and run the program to see what it does }
PROGRAM Problem6_5 (Data6_5) ;
{*************************************************************************}
{
This is problem 5 from chapter 6. This program
calculates total points, percentage grade, and
letter grade given five quiz scores, three test
scores, and a final score.
}
{*************************************************************************}
USES
Crt;
CONST
TestPoints = 100;
QuizPoints = 10;
FinalPoints = 200;
TotalPoints = 550;
Skip = ' ';
TYPE
TestRange = 1..TestPoints;
QuizRange = 1..QuizPoints;
FinalRange = 1..FinalPoints;
VAR
Quiz1, Quiz2, Quiz3, Quiz4, Quiz5 : QuizRange;
Test1, Test2, Test3 : TestRange;
Final : FinalRange;
Total, NumStudents, ClassTotal,
NumA, NumB, NumC, NumD, NumE,
Index : integer;
Percent, ClassAve : real;
Letter : char;
Data6_5 : text;
{*************************************************************************}
{
VARIABLE DICTIONARY
Quiz1, Quiz2, Quiz3
Quiz4, Quiz5 Quiz scores from input
Test1, Test2, Test3 Test scores from input
Final Final score from input
Total Total points for student
NumStudents Number of students from input
ClassTotal Total points of class
NumA Number of A's
NumB Number of B's
NumC Number of C's
NumD Number of D's
NumE Number of E's
Index Loop control variable
Percent Student's percentage grade
ClassAve Overall class average
Letter Student's letter grade
Data6_5 Data for program
}
{*************************************************************************}
PROCEDURE GetData (VAR Q1, Q2, Q3, Q4, Q5 : QuizRange;
VAR T1, T2, T3 : TestRange;
VAR Fin : FinalRange);
{ Given : Nothing }
{ Task : This procedure gets the data }
{ Return : Q1, Q2, Q3, Q4, Q5, T1, T2, T3, and Fin }
BEGIN
readln (Data6_5,Q1,Q2,Q3,Q4,Q5,T1,T2,T3,Fin)
END; { of PROCEDURE GetData }
{*************************************************************************}
PROCEDURE Initialization (VAR Data6_5 : text; VAR ClassTot, NumA, NumB,
NumC, NumD, NumE, NumStu : integer);
{ Given : Nothing }
{ Task : Initialize accumulators, reset the datafile and read in the }
{ the number of students }
{ Return : Data6_5, ClassTot, NumA, NumB, NumC, NumD, NumE, NumStu }
BEGIN
assign (Data6_5,'C06P05.DAT');
reset (Data6_5);
ClassTot := 0;
NumA := 0;
NumB := 0;
NumC := 0;
NumD := 0;
NumE := 0;
readln (Data6_5,NumStu);
END; { of PROCEDURE Initialization }
{*************************************************************************}
FUNCTION Points (Q1, Q2, Q3, Q4, Q5 : QuizRange;
T1, T2, T3 : TestRange;
Fin : FinalRange) : integer;
{ Given : Q1, Q2, Q3, Q4, Q5, T1, T2, T3, and Fin }
{ Task : This function calculates total points for a student }
{ Return : Points }
BEGIN
Points := Q1 + Q2 + Q3 + Q4 + Q5 + T1 + T2 + T3 + Fin
END; { of FUNCTION TotalPoints }
{*************************************************************************}
FUNCTION Percentage (Tot : integer) : real;
{ Given : Tot }
{ Task : This function calculates the percentage grade for a student }
{ Return : Percentage }
BEGIN
Percentage := Tot / TotalPoints
END; { of FUNCTION Percentage }
{*************************************************************************}
PROCEDURE LetterGrade (VAR Let : char;
VAR A, B, C, D, E : integer;
Per : real);
{ Given : Per, A, B, C, D, and E }
{ Task : This procedure assigns a letter grade for a student and }
{ increments the grade counters }
{ Return : Let, A, B, C, D, and E }
BEGIN
IF Per >= 0.90 THEN
BEGIN
Let := 'A';
A := A + 1
END
ELSE IF Per >= 0.80 THEN
BEGIN
Let := 'B';
B := B + 1
END
ELSE IF Per >= 0.70 THEN
BEGIN
Let := 'C';
C := C + 1
END
ELSE IF Per >= 0.60 THEN
BEGIN
Let := 'D';
D := D + 1
END
ELSE
BEGIN
Let := 'E';
E := E + 1
END
END; { of PROCEDURE LetterGrade }
{*************************************************************************}
PROCEDURE CalcClassTotal (VAR ClassTot : integer; Tot : integer);
{ Given : Tot and ClassTot }
{ Task : This procedure accumulates the class total }
{ Return : ClassTot }
BEGIN
ClassTot := ClassTot + Tot
END; { of PROCEDURE CalcClassTotal }
{*************************************************************************}
FUNCTION ClassAverage (ClassTot, Student : integer) : real;
{ Given : ClassTot and Student }
{ Task : This function calculates the class average }
{ Return : ClassAverage }
BEGIN
ClassAverage := ClassTot / (Student * TotalPoints)
END; { of FUNCTION ClassAverage }
{*************************************************************************}
PROCEDURE PrintHeading;
{ Given : Nothing }
{ Task : This procedure prints a heading }
{ Return : Nothing }
BEGIN
writeln; writeln;
writeln (Skip:20,'Mr. Lae Z. Programmer');
writeln (Skip:23,'Final Grades');
writeln (Skip:20,'---------------------');
writeln;
write (Skip:3,'Quiz Scores',Skip:6,'Test Scores',Skip:3,'Final');
writeln (Skip:3,'Total',Skip:3,'Percent',Skip:3,'Grade');
write (Skip:3,'-----------',Skip:6,'-----------',Skip:3,'-----');
writeln (Skip:3,'-----',Skip:3,'-------',Skip:3,'-----');
writeln
END; { of PROCEDURE PrintHeading }
{*************************************************************************}
PROCEDURE PrintDetail (Q1, Q2, Q3, Q4, Q5 : QuizRange;
T1, T2, T3 : TestRange;
Fin : FinalRange; Tot : integer;
Per : real; Gr : char);
{ Given : Q1, Q2, Q3, Q4, Q5, T1, T2, T3, Fin, Tot, Per, and Gr }
{ Task : This procedure prints a line of detail for a student }
{ Return : Nothing }
BEGIN
write (Q1:3,Q2:3,Q3:3,Q4:3,Q5:3,T1:8,T2:4,T3:4);
writeln (Fin:7,Tot:8,Per * 100:10:1,Skip:6,Gr);
readln
END; { of PROCEDURE PrintDetail }
{*************************************************************************}
BEGIN
Initialization (Data6_5, ClassTotal, NumA, NumB, NumC, NumD, NumE,
NumStudents);
PrintHeading;
FOR Index := 1 TO NumStudents DO
BEGIN
GetData (Quiz1, Quiz2, Quiz3, Quiz4, Quiz5, Test1, Test2, Test3, Final);
Total := Points (Quiz1, Quiz2, Quiz3, Quiz4, Quiz5, Test1, Test2,
Test3, Final);
Percent := Percentage (Total);
LetterGrade (Letter, NumA, NumB, NumC, NumD, NumE, Percent);
CalcClassTotal (ClassTotal, Total);
PrintDetail (Quiz1, Quiz2, Quiz3, Quiz4, Quiz5, Test1, Test2, Test3,
Final, Total, Percent, Letter)
END; { of FOR }
Close (Data6_5);
ClassAve := ClassAverage (ClassTotal, NumStudents);
writeln; writeln;
writeln (Skip:5,'The class average:',ClassAve * 100:8:1);
writeln (Skip:5,'A:',Skip:6,NumA);
writeln (Skip:5,'B:',Skip:6,NumB);
writeln (Skip:5,'C:',Skip:6,NumC);
writeln (Skip:5,'D:',Skip:6,NumD);
writeln (Skip:5,'E:',Skip:6,NumE);
readln
END. { of main program }