尝试将 gm 和 hm 计算添加到 cobol 程序中

问题描述 投票:0回答:1

我正在尝试通过添加以下功能来更新程序: • 集中趋势的两种度量 - 几何平均值 (GM) 和调和平均值 (HM) • 分散度的一种测量方法 - 均方根 (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)

问题是它说 sqrt 未定义。我想我的编译器只是不接受它。我在 Linux 上使用 cobc (GnuCOBOL) 3.1.2.0。

这是我的代码

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.

我尝试添加功能,每次尝试都会出现各种类型的错误。有人可以建议如何添加其中一两个功能吗?

cobol
1个回答
0
投票

SQRT
是一个内在函数。将单词
FUNCTION
放在
SQRT
之前,或者添加
REPOSITORY
段落来标识所有内在函数,而不使用
FUNCTION
关键字。

   ENVIRONMENT DIVISION.
   CONFIGURATION SECTION.
   REPOSITORY.
       FUNCTION ALL INTRINSIC.
   INPUT-OUTPUT SECTION.
       ...

另请注意,您正在进行的某些计算有内在函数。请查阅文档。

© www.soinside.com 2019 - 2024. All rights reserved.