PROBLEM : | PRINT OUT THE MINIMUM, MAXIMUM, MODE, AND AVERAGE TEMPERATURE FOR THE YEAR. |
MINIMUM? yes | ||
MAXIMUM? yes | ||
AVERAGE? yes | ||
MODE? no (what is it?) | ||
The most frequently occurring number in a set of numbers |
|
|
CONTENTS OF DEGREES[15] REPRESENTS THE NUMBER OF DAYS WHEN THE AVERAGE TEMPERATURE WAS 15.
|
INPUT : | DAILY AVERAGE TEMPERATURES | |
OUTPUT : | MINIMUM TEMPERATURE MAXIMUM TEMPERATURE MODE AVERAGE TEMPERATURE |
|
DATA STRUCTURES : | ||
ONE DIMENSIONAL ARRAY (degrees) |
RECORD DATA PRINT MINIMUM PRINT MAXIMUM PRINT MODE PRINT AVERAGE |
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;
ONE-DIMENSIONAL ARRAY WHERE INDEX HAD SEMANTIC CONTENT |
MINIMUM MAXIMUM AVERAGE |
CALCULATED DIFFERENTLY |
COULD DEGREES HAVE BEEN REFERENCED GLOBALLY? SHOULD DEGREES HAVE BEEN REFERANCED GLOBALLY? DEGREES WAS A VAR PARAMETER IN EACH PROCEDURE - WHY? |