Chapter 10 Overheads


PROBLEM : PRINT OUT THE MINIMUM, MAXIMUM, MODE, AND AVERAGE TEMPERATURE FOR THE YEAR.

LOOK FAMILIAR?
MINIMUM? yes
MAXIMUM? yes
AVERAGE? yes
MODE? no (what is it?)
The most frequently occurring number in a set of numbers




[-50]
[-49]
[-48]
.
.
.
[0]
[1]
.
.
[120]
DEGREES
 
 
 
.
.
.
 
.
.
 
CONTENTS OF DEGREES[15] REPRESENTS THE NUMBER OF DAYS WHEN THE AVERAGE TEMPERATURE WAS 15.

NOTE : FIRST NONZERO ENTRY FROM THE TOP IS THE MINIMUM
FIRST NONZERO ENTRY FROM THE BOTTOM INS THE MAXIMUM
INDEX WHERE THE MAXIMUM VALUE OCCURS IS THE MODE



TOP DOWN DESIGN
INPUT : DAILY AVERAGE TEMPERATURES
OUTPUT : MINIMUM TEMPERATURE
MAXIMUM TEMPERATURE
MODE
AVERAGE TEMPERATURE
DATA STRUCTURES :
ONE DIMENSIONAL ARRAY (degrees)
DEGREES WILL CONTAIN A RUNNING SUM OF THE NUMBER OF TIMES WE HAVE SEEN THAT DEGREE. THE INDEX INTO DEGREES WILL CORRESPOND TO THE DEGREE.



LEVEL 0:
RECORD DATA
PRINT MINIMUM
PRINT MAXIMUM
PRINT MODE
PRINT AVERAGE
LEVEL 1:
RECORD DATA
WHILE MORE TEMPERATURES
GET TEMP
UPDATE DEGREES
PRINT MINIMUM
FIND THE FIRST NONZERO SLOT IN DEGREES BEGINNING WITH INDEX = -50
PRINT INDEX



PRINT MAXIMUM
FIND THE FIRST NONZERO SLOT IN DEGREES BEGINNING WITH INDEX = 120
PRINT INDEX
PRINT MODE
FIND MAXIMUM IN ARRAY DEGREES
PRINT MAXIMUM
PRINT AVERAGE
FOR LCV = -50 to 120
SUM = SUM + DEGREEES[LCV] * LCV
AVERAGE = SUM / 365
PRINT AVERAGE



PROGRAM TEMP(INPUT, OUTPUT);

CONST DAYSINYEAR = 365

TYPE ARY = ARRAY[-50..120] OF INTEGER;

VAR DEGREES : ARY;

(* procedures go here *)

BEGIN
ZERO(DEGREES);
RECORD(DEGREES);
PRINTMIN(DEGREES);
PRINTMAX(DEGREES);
PRINTMODE(DEGREES);
PRINTAVG(DEGREES);
END.



PROCEDURE ZERO( VAR DEGREES : ARY );
VAR LCV : INTEGER;
BEGIN    FOR LCV := -50 TO 120 DO
      DEGREES[LCV] := 0;
END;

(*******************************************************)

PROCEDURE RECORD( VAR DEGREES : ARY );
VAR TEMP : -50..120;
    LCV : INTEGER;
BEGIN
   FOR LCV := 1 TO DAYSINYEAR DO
      BEGIN
         READ(TEMP);
         DEGREES[TEMP] := DEGREES[TEMP] + 1;
      END;
END;



PROCEDURE PRINTMIN( VAR DEGREES : ARY );
VAR LCV : INTEGER;
BEGIN
   LCV := -50;
   WHILE DEGREES[LCV] = 0 DO
      LCV := LCV + 1;
   WRITELN( 'MINIMUM TEMPERATURE ', LCV );
END;

(*******************************************************)

PROCEDURE PRINTMAX( VAR DEGREES : ARY );
VAR LCV : INTEGER;
BEGIN
   LCV := 120;
   WHILE DEGREES[LCV] = 0 DO
      LCV := LCV - 1;
   WRITELN( 'MAXIMUM TEMPERATURE ', LCV );
END;



PROCEDURE PRINTMODE( VAR DEGREES : ARY );
VAR MAX, LCV : INTEGER;
BEGIN
   MAX := DEGREES[-50];
   FOR LCV := -49 TO 120 DO
      IF DEGREES[LCV] > MAX
         THEN MAX := DEGREES[LCV];
   WRITELN( 'MODE IS (ARE)' );
   FOR LCV := -50 TP 120 DO
      IF DEGREES[LCV] = MAX
         THEN WRITELN( DEGREES[LCV] );
END;

(*******************************************************)

PROCEDURE PRINTAVG( VAR DEGREES : ARY );
VAR SUM, AVG, LCV : INTEGER;
BEGIN
   SUM := 0;
   FOR LCV := -50 TO 120 DO
      SUM := SUM + DEGREES[LCV] * LCV;
   AVG := SUM DIV DAYSINYEAR;
   WRITELN( 'AVERAGE TEMPERATURE', AVG );
END;



SUMMARIZE

DATA STRUCTURES
ONE-DIMENSIONAL ARRAY WHERE INDEX HAD SEMANTIC CONTENT

OLD ALGORITHMS
MINIMUM
MAXIMUM
AVERAGE
CALCULATED DIFFERENTLY

QUESTIONS
COULD DEGREES HAVE BEEN REFERENCED GLOBALLY?
SHOULD DEGREES HAVE BEEN REFERANCED GLOBALLY?
DEGREES WAS A VAR PARAMETER IN EACH PROCEDURE - WHY?