Example 6.6


C Version

/*
  Array averaging procedure.
*/

#include <stdio.h>

typedef char char_array[12][4];   /* Variable Type Declaration */
typedef double real_array[12];
typedef short int_array[12];

char_array month;    /*  Declaration Statements  */
real_array sales;
int_array units;
short k, meanu;
double save;

void average(n, units, sales, iave, ave)
short n;
short *units;                 /* Procedure Declaration  */
double *sales;
short *iave;
double *ave;
{
  short cars, k;
  double dolls;

  cars = 0;
  dolls = 0.0;
  for (k = 0; k < n; k++)
  {
    cars += units[k];
    dolls += sales[k];
  }
  *iave = cars / n;   /*  To compute the average. */
  *ave = dolls / n;        /*  You don't have to return any value   */
} /* End of procedure */   /*  since iave and ave variables are     */
			   /*  pointers.                            */

main()
{
  /*  Declaration Statement  */
  char *TEMP;

  printf("C66.C -> Average Program 1 (using averaging function)\n\n");

  /*  Assignment Statements  */
  for (k = 1; k <= 12; k++)
  {
    printf("Enter the month (Jan,Feb,...) : ");
    scanf("%s",month[k-1]);            /* Read from keyboard entry */
    printf("\nEnter number of units sold    : ");
    scanf("%hd", &units[k - 1]);
    printf("\nSales (in million $): ");
    scanf("%lg", &sales[k - 1]);
    clrscr();   /*  Clear screen after each loop  */
  }

  for (k=1;k<=12; k++)
    printf(" %s%7d%6.1f\n", month[k - 1], units[k - 1], sales[k - 1]);
  /*
       Data has been read, stored and printed.
       Now use procedure.
  */
  average(12, units, sales, &meanu, &save);   /* Call of procedure */
  printf("\nMean=%7d%6.1f\n", meanu, save);

  return(0);
}
/*  End of main Program C66  */
/*
Input :

Jan
5
12
Feb
4
78
Mar
1
3
Apr
5
32
May
6
12
June
5
32
July
1
12
Aug
34
12
Sep
4
10
Oct
5
23
Nov
1
23
Dec
0
0

Output :

C66.C -> Average Program 1 (using averaging function)

Month (Jan,Feb,...) : Jan
Units Sold          : 5
Sales (in million $): 12
Month (Jan,Feb,...) : Feb
Units Sold          : 4
Sales (in million $): 78
Month (Jan,Feb,...) : Mar
Units Sold          : 1
Sales (in million $): 3
Month (Jan,Feb,...) : Apr
Units Sold          : 5
Sales (in million $): 32
Month (Jan,Feb,...) : May
Units Sold          : 6
Sales (in million $): 12
Month (Jan,Feb,...) : June
Units Sold          : 5
Sales (in million $): 32
Month (Jan,Feb,...) : July
Units Sold          : 1
Sales (in million $): 12
Month (Jan,Feb,...) : Aug
Units Sold          : 34
Sales (in million $): 12
Month (Jan,Feb,...) : Sep
Units Sold          : 4
Sales (in million $): 10
Month (Jan,Feb,...) : Oct
Units Sold          : 5
Sales (in million $): 23
Month (Jan,Feb,...) : Nov
Units Sold          : 1
Sales (in million $): 23
Month (Jan,Feb,...) : Dec
Units Sold          : 0
Sales (in million $): 0

 Jan      5  12.0
 Feb      4  78.0
 Mar      1   3.0
 Apr      5  32.0
 May      6  12.0
 June     5  32.0
 July     1  12.0
 Aug     34  12.0
 Sep      4  10.0
 Oct      5  23.0
 Nov      1  23.0
 Dec      0   0.0

Mean=     5  20.8

*/

Pascal Version

{$G256}
{$P512}
{$D+}
PROGRAM p6677 (input, output);
TYPE
  char_array = ARRAY[1..12] OF string[3];
  real_array = ARRAY[1..12] OF REAL;
  int_array = ARRAY[1..12] OF INTEGER;

VAR
  month : char_array;
  sales : real_array;
  units : int_array;
  k, meanu : INTEGER;
  save : REAL;

PROCEDURE average ( n : INTEGER;
                    units : int_array;
                    sales : real_array;
                    VAR iave : INTEGER;
                    VAR ave : REAL );
VAR
  cars, k : INTEGER;
  dolls : REAL;
BEGIN
  cars := 0;
  dolls := 0.0;
  FOR k := 1 TO n DO
    BEGIN
      cars := cars + units[k];
      dolls := dolls + sales[k]
    END;
  iave := cars DIV n;
  ave := dolls/n
END;

BEGIN
  writeln ( ^l );
  writeln ( 'Average Program 1' );
  writeln;
  FOR k := 1 TO 12 DO
    BEGIN
      readln ( month[k], units[k], sales[k] );
      writeln ( ' ', month[k], units[k]:7, sales[k]:6:1 )
    END;
{
     Data has been read, stored and printed
     Now use procedure
}
  average ( 12, units, sales, meanu, save );
  writeln;
  writeln ( 'mean', meanu:7, save:6:1 )
END.
DATA:
jan    672 3.4
feb    609 3.2
mar    715 3.7
apr    803 4.2
may    810 4.8
jun    831 5.1
jul    829 5.1
aug    727 5.1
sep    780 4.3
oct    703 3.9
nov    791 4.2
dec    783 3.6

Last modified: 28/05/96