Chapter 11 Overheads


PROBLEM : THE COOKIE CONTEST WAS SO POPULAR LAST YEAR THAT IT HAS BEEN EXPANDED THIS YEAR. IT WILL RUN FOR SIX WEEKS WITH WEEKLY WINNERS PRINTED IN ADDITION TO THE GRAND PRIZE WINNER.

THERE HAS BEEN A SIGHT CHANGE IN THE RULES THIS YEAR. DOLLAR VOLUME IS THE GOAL THIS YEAR AND EACH SALES SLIP WILL HAVE BOTH WEEK NUMBER AND THE PRICE PER BOX OF THE COOKIES SOLD.

TOP DOWN DESIGN

INPUT : SALESPERSON'S NUMBER (saleno)
NUMBER OF BOXES SOLD (boxes)
PRICE PER BOX (price dollars and cents)
WEEK NUMBER (week)



OUTPUT : SIX WEEKLY WINNER WITH DOLLAR VOLUME
GRAND PRIZE WINNER WITH DOLLAR VOLUME

DATA STRUCTURES :
TWO DIMENSIONAL ARRAY (totals)
i.e a TABLE WITH ROWS AND COLUMNS

TABLES : 1 2 3 4 5 6
1
2 X total for salesperson 2 week 2
.
.
25



LEVEL 0:
CALCULATE TOTALS

WHILE MORE WEEKS
LOCATE WINNER
PRINT WINNER
LOCATE GRAND PRIZE WINNER
PRINT GRAND PRIZE WINNER

LEVEL 1:
CALCULATE TOTALS
WHILE MORE SALES SLIPS
GET SALES
UPDATE TOTALS

LEVEL 2:
GET SALES
READ( SALENO, BOXES, PRICE, WEEK )



UPDATE TOTALS
TOTALS[SALENO,WEEK] IS WHAT IT WAS + PRICE * BOXES

CONTROL STRUCTURE
WHILE NOT EOF DO

LEVEL 1:
LOCATE WINNER (CHECK FOR TIES)
FIND MAXIMUN IN COLUMN
PRINT WINNER
WHILE MORE SALESPEOPLE
IF TOTALS[SALENO,WEEK] EQUAL MAXIMUM, PRINT SALENO, MAXIMUM



LOCATE GRAND PRIZE WINNER
WHILE MORE SALESPEOPLE
TOATL SALES FOR SIX WEEKS
LOCATE WINNER

CONTROL STRUCTURES
WHILE MORE SALESPEOPLE
FOR SALENO := 1 TO NOPEOPLE DO
WHILE MORE WEEKS
FOR WEEK := 1 TO NOWEEKS DO

NEED ADDITIONAL DATA STRUCTURES
ONE DIMENSIONAL ARRAY TO HOLD A SALESPERSON'S SIX-WEEK TOTAL.

MAKE IT TOTALS[SALENO,NOWEEKS+1]



PROGRAM CONTEST2( INPUT, OUTPUT );

CONST NOWEEKS = 5;
      GRANDCNT = 7;
      NOPEOPLE = 25

TYPE
   ARY2 = ARRAY[1..NOPEOPLE,1..GRANDCNT] OF REAL;

VAR
   MAXSALE : REAL;
   WEEK : INTEGER;
   TOTALS : ARY2;



BEGIN
   ZERO(TOTALS);
   CALCULATE(TOTALS);

   FOR WEEK := 1 TO NOWEEKS DO
      BEGIN
         LOCATE( MAXSALE, WEEK, TOTALS );
         PRINT( MAXSALE, WEEK, TOTALS );
      END;

   GRAND( MAXSALE, TOTALS );
   PRINT MAXSALES, NOWEEKS+1, TOTALS );
END.



PROCEDURE ZERO( VAR TOTALS : ARY2 );
VAR
   ROW, COL : INTEGER;
BEGIN
   FOR ROW := 1 TO NOPEOPLE DO
      FOR COL := 1 TO NOWEEKS DO
         TOTALS[ROW,COL] := 0.0;
END;



PROCEDURE CALCULATE( VAR TOTALS : ARY2 );
VAR
   SALENO, BOXES, WEEK : INTEGER;
   PRICE : REAL;

BEGIN
   READ(SALENO);

   WHILE NOT EOF DO
      BEGIN
         READ( BOXES, PRICE, WEEK );
         TOTALS[SALENO,WEEK] := PRICE * BOXES + TOTALS[SALENO,WEEK];
         READ(SALENO);
      END;
END;



PROCEDURE LOCATE( VAR MAXSALE : REAL; WEEK : INTEGER; VAR TOTALS : ARY2 );

VAR SALENO : INTEGER;

BEGIN
   MAXSALE := TOTALS[1,WEEK];

   FOR SALENO := 2 TO NOPEOPLE DO
      IF MAXSALE > TOTALS[SALENO,WEEK]
         THEN MAXSALE := TOTALS[SALENO,WEEK];
END;



PROCEDURE PRINT( MAXSALE : REAL; WEEK : INTEGER; VAR TOTALS : ARY2 );

VAR SALENO : INTEGER;
BEGIN
   FOR SALENO := 1 TO NOPEOPLE DO
      IF TOTALS[SALENO,WEEK] = MAXSALE
         THEN WRITELN( SALENO, MAXSALE );
END;



PROCEDURE GRAND( VAR MAXSALE : REAL; VAR TOTALS : ARY2 );

VAR
   SALENO, WEEK, TOTCOL : INTEGER;

BEGIN
   TOTCOL := NOWEEKS + 1;

   FOR SALENO := 1 TO NO PEOPLE DO
      BEGIN
         TOTALS[SALENO,TOTCOL := 0;
         FOR WEEK := 1 TO NOWEEKS DO
            TOTALS[SALENO,TOTCOL] :=
               TOTALS[SALENO,TOTCOL] + TOTALS[SALENO,WEEK];
      END;
   LOCATE( MAXSALE, TOTCOL, TOTALS );
END;



SUMMARIZE
TWO DIMENSIONAL ARRAYS
(TABLE WITH ROWS AND COLUMNS)

DEFINE:

TYPE ARY2 = ARRAY[1..NROWS,1..NOCOL] OF REAL

VAR TABLES : ARY2

USE:
TABLES[ROW,COL] WHERE ROW <= NROWS AND COL <= NCOL

STANDARD TYPES
INTEGER, REAL, BOOLEAN, CHAR