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  }