i'm trying to update the program by adding the following features: • Two measures of central tendency - geometric mean (GM), and harmonic mean (HM) • One measure of dispersion - root mean square (RMS)
GM = [x(1)⋅x(2)⋅x(3)⋅…⋅x(n)]^(1/n)
HM = n / SR
SR = 1/x(1) + 1/x(2) + … + 1/x(n)
RMS = sqrt(Sx2/n]
Sx2 = x(1)⋅x(1) + x(2)⋅x(2) + … + x(n)⋅x(n)
The issue is it says sqrt is not defined. I guess my compiler just doesnt accept it. Im using cobc (GnuCOBOL) 3.1.2.0 on linux.
this is my code
IDENTIFICATION DIVISION.
PROGRAM-ID. FileProcessingProgram.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT INPUT-FILE ASSIGN TO 'nums.txt'.
SELECT OUTPUT-FILE ASSIGN TO 'output.txt'.
DATA DIVISION.
FILE SECTION.
FD INPUT-FILE.
01 INPUT-VALUE-RECORD.
02 IN-X PIC S9(6)V9(2).
02 FILLER PIC X(72).
FD OUTPUT-FILE.
01 OUTPUT-LINE PIC X(80).
WORKING-STORAGE SECTION.
77 SUM-OF-X-SQR PIC 9(14)V9(2).
77 SUM-OF-X PIC S9(10)V9(2).
77 N PIC S9(4).
77 MEAN PIC S9(6)V9(2).
77 I PIC S9(4).
01 ARRAY-AREA.
02 X PIC S9(6)V9(2) OCCURS 1000 TIMES.
01 OUTPUT-TITLE-LINE.
02 FILLER PIC X(28) VALUE " MEAN AND STANDARD DEVIATION".
01 OUTPUT-UNDERLINE.
02 FILLER PIC X(28) VALUE "----------------------------".
01 OUTPUT-COL-HEADS.
02 FILLER PIC X(10) VALUE SPACES.
02 FILLER PIC X(11) VALUE "DATA VALUES".
01 OUTPUT-DATA-LINE.
02 FILLER PIC X(10) VALUE SPACES.
02 OUT-X PIC -(6)9.9(2).
01 OUTPUT-RESULTS-LINE-1.
02 FILLER PIC X(9) VALUE " MEAN= ".
02 OUT-MEAN PIC -(6)9.9(2).
01 OUTPUT-RESULTS-LINE-2.
02 FILLER PIC X(9) VALUE " STD DEV=".
02 STD-DEVIATION PIC -(6)9.9(2).
01 OUTPUT-RESULTS-LINE-3.
02 FILLER PIC X(9) VALUE " GEOMETRIC MEAN=".
02 GEOMETRIC-MEAN PIC -(6)9.9(2).
01 OUTPUT-RESULTS-LINE-4.
02 FILLER PIC X(9) VALUE " HARMONIC MEAN=".
02 HARMONIC-MEAN PIC -(6)9.9(2).
01 OUTPUT-RESULTS-LINE-5.
02 FILLER PIC X(9) VALUE " ROOT MEAN SQ=".
02 ROOT-MEAN-SQUARE PIC -(6)9.9(2).
PROCEDURE DIVISION.
OPEN INPUT INPUT-FILE, OUTPUT OUTPUT-FILE.
MOVE ZERO TO IN-X.
PERFORM PROC-BODY
UNTIL IN-X IS NOT LESS THAN 999999.99.
PERFORM END-OF-JOB.
PROC-BODY.
WRITE OUTPUT-LINE FROM OUTPUT-TITLE-LINE
AFTER ADVANCING 0 LINES.
WRITE OUTPUT-LINE FROM OUTPUT-UNDERLINE
AFTER ADVANCING 1 LINE.
WRITE OUTPUT-LINE FROM OUTPUT-COL-HEADS
AFTER ADVANCING 1 LINE.
WRITE OUTPUT-LINE FROM OUTPUT-UNDERLINE
AFTER ADVANCING 1 LINE.
MOVE ZERO TO SUM-OF-X.
READ INPUT-FILE INTO INPUT-VALUE-RECORD
AT END PERFORM END-OF-JOB.
PERFORM INPUT-LOOP
VARYING N FROM 1 BY 1
UNTIL N IS GREATER THAN 1000 OR IN-X IS NOT LESS THAN 999999.98.
SUBTRACT 1 FROM N.
DIVIDE N INTO SUM-OF-X GIVING MEAN ROUNDED.
MOVE ZERO TO SUM-OF-X-SQR.
PERFORM SUM-LOOP
VARYING I FROM 1 BY 1
UNTIL I IS GREATER THAN N.
COMPUTE STD-DEVIATION ROUNDED = (SUM-OF-X-SQR / N) ** 0.5.
COMPUTE GEOMETRIC-MEAN ROUNDED = (X(1) * X(2) * X(3) * ... * X(N)) ** (1 / N).
COMPUTE HARMONIC-MEAN ROUNDED = N / (1 / X(1) + 1 / X(2) + ... + 1 / X(N)).
COMPUTE ROOT-MEAN-SQUARE ROUNDED = SQRT(SUM-OF-X-SQR / N).
WRITE OUTPUT-LINE FROM OUTPUT-UNDERLINE
AFTER ADVANCING 1 LINE.
MOVE MEAN TO OUT-MEAN.
WRITE OUTPUT-LINE FROM OUTPUT-RESULTS-LINE-1
AFTER ADVANCING 1 LINE.
WRITE OUTPUT-LINE FROM OUTPUT-RESULTS-LINE-2
AFTER ADVANCING 1 LINE.
WRITE OUTPUT-LINE FROM OUTPUT-RESULTS-LINE-3
AFTER ADVANCING 1 LINE.
WRITE OUTPUT-LINE FROM OUTPUT-RESULTS-LINE-4
AFTER ADVANCING 1 LINE.
WRITE OUTPUT-LINE FROM OUTPUT-RESULTS-LINE-5
AFTER ADVANCING 1 LINE.
INPUT-LOOP.
MOVE IN-X TO X(N), OUT-X.
WRITE OUTPUT-LINE FROM OUTPUT-DATA-LINE
AFTER ADVANCING 1 LINE.
ADD X(N) TO SUM-OF-X.
READ INPUT-FILE INTO INPUT-VALUE-RECORD
AT END PERFORM END-OF-JOB.
SUM-LOOP.
COMPUTE SUM-OF-X-SQR = SUM-OF-X-SQR + (X(I) * X(I)).
END-OF-JOB.
CLOSE INPUT-FILE, OUTPUT-FILE.
STOP RUN.
I've tried adding the features with all types of errors every attempt. Can someone please advise how to even add one or two of these features ?
SQRTis an intrinsic function. Either place the wordFUNCTIONbeforeSQRTor add aREPOSITORYparagraph to identify all intrinsic functions without using theFUNCTIONkeyword.Also, note there are intrinsic functions for some of the calculations you are doing. Please consult the documentation.
I threw together this program to suggest how the calculations may be done using an older COBOL 85 compiler. In a newer version
10 **andLOG10may be replaced byEXPandLOG. And,FUNCTIONmay be removed as mentioned earlier.I used Wikipedia entries to determine what calculations were needed.
Notice the use of free-form input data and the use of floating-point and logarithms for some of the calculations.
Code:
Input:
Output: