一
******************************************************************
* Description: 小练习 4/22
******************************************************************
IDENTIFICATION DIVISION.
PROGRAM-ID. DEMO.
AUTHOR. JUNER
SECURITY. HIGH
DATE-WRITTEN. 2022
DATE-COMPILED. 2022
INSTALLATION. PC
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. PC28.
OBJECT-COMPUTER. PC28.
SPECIAL-NAMES.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
DATA DIVISION.
FILE SECTION.
WORKING-STORAGE SECTION.
01 CONST.
03 ONE PIC 9 VALUE 1.
03 MAX-NUMBER PIC 9(9).9(9) VALUE 999999999.999999999.
01 CONFIG.
03 MAX-DATA-LENGTH PIC 9(6) VALUE 5.
01 THIS.
03 THIS-DATA OCCURS 5 TIMES INDEXED BY THIS-I.
05 THIS-NAME PIC X(3).
05 THIS-SALARY PIC 9(6)V9(3).
01 RANK-LIST.
03 LIST-TAG PIC X(9).
03 LIST-TOTAL-NUM PIC 9(9)V9(9).
03 LIST-TOTAL PIC Z(3),Z(2)9.
03 LIST-MIN-NUM PIC 9(9)V9(9).
03 LIST-MIN PIC Z(3),Z(2)9.
03 LIST-MAX-NUM PIC 9(9)V9(9).
03 LIST-MAX PIC Z(3),Z(2)9.
03 LIST-TIMES-NUM PIC 9(9).
03 LIST-TIMES PIC Z(3),Z(2)9.
03 LIST-AVERAGE-NUM PIC 9(9)V9(9).
03 LIST-AVERAGE PIC Z(3),Z(2)9.
01 GROUP-A.
03 A-People OCCURS 5 TIMES INDEXED BY A-I.
05 A-NAME PIC X(3).
05 A-SALARY PIC 9(6)V9(3).
01 GROUP-B.
03 B-People OCCURS 5 TIMES INDEXED BY B-I.
05 B-NAME PIC X(3).
05 B-SALARY PIC 9(6)V9(3).
01 GROUP-C.
03 C-People OCCURS 5 TIMES INDEXED BY C-I.
05 C-NAME PIC X(3).
05 C-SALARY PIC 9(6)V9(3).
PROCEDURE DIVISION.
MAIN-PROCEDURE.
PERFORM 0000-INIT.
PERFORM 0500-GET-DATA.
INITIALIZE THIS RANK-LIST.
MOVE GROUP-A TO THIS.
MOVE "GROUP-A" TO LIST-TAG.
PERFORM 1300-GET-AVERAGE-WAGES.
PERFORM 2000-STATISTICS.
INITIALIZE THIS RANK-LIST.
MOVE GROUP-B TO THIS.
MOVE "GROUP-B" TO LIST-TAG.
PERFORM 1300-GET-AVERAGE-WAGES.
PERFORM 2000-STATISTICS.
INITIALIZE THIS RANK-LIST.
MOVE GROUP-C TO THIS.
MOVE "GROUP-C" TO LIST-TAG.
PERFORM 1300-GET-AVERAGE-WAGES.
PERFORM 2000-STATISTICS.
STOP RUN.
OVER.
EXIT.
*
******************************************************************
* initialize data
******************************************************************
*
0000-INIT SECTION.
INITIALIZE GROUP-A GROUP-B GROUP-C.
INITIALIZE THIS RANK-LIST.
MOVE 1 TO ONE.
0000-INIT-EXIT.
EXIT.
*
******************************************************************
* assume data acquisition
******************************************************************
*
0500-GET-DATA SECTION.
STRING
'a01007050000' DELIMITED BY SIZE
'a02008000000' DELIMITED BY SIZE
'a03018500000' DELIMITED BY SIZE
'a04009000000' DELIMITED BY SIZE
'a05012000000' DELIMITED BY SIZE
INTO GROUP-A.
STRING
'b01008000000' DELIMITED BY SIZE
'b02008100000' DELIMITED BY SIZE
'b03019000000' DELIMITED BY SIZE
'b04009100000' DELIMITED BY SIZE
INTO GROUP-B.
STRING
'c01006000000' DELIMITED BY SIZE
'c02009000000' DELIMITED BY SIZE
'c03004000000' DELIMITED BY SIZE
'c04015000000' DELIMITED BY SIZE
INTO GROUP-C.
0500-GET-DATA-EXIT.
EXIT.
*
******************************************************************
* get the max-wage
******************************************************************
*
1000-GET-MAX-WAGES SECTION.
IF THIS-I < MAX-DATA-LENGTH THEN
EVALUATE TRUE
WHEN THIS-SALARY(THIS-I) = THIS-SALARY(THIS-I + ONE)
IF THIS-SALARY(THIS-I) > LIST-MAX-NUM
MOVE THIS-SALARY(THIS-I) TO LIST-MAX-NUM
END-IF
WHEN THIS-SALARY(THIS-I) > THIS-SALARY(THIS-I + ONE)
IF THIS-SALARY(THIS-I) > LIST-MAX-NUM
MOVE THIS-SALARY(THIS-I) TO LIST-MAX-NUM
END-IF
WHEN THIS-SALARY(THIS-I + ONE) > THIS-SALARY(THIS-I)
IF THIS-SALARY(THIS-I + ONE) > LIST-MAX-NUM
MOVE THIS-SALARY(THIS-I + ONE) TO LIST-MAX-NUM
END-IF
END-EVALUATE
END-IF.
1000-GET-MAX-WAGES-EXIT.
MOVE LIST-MAX-NUM TO LIST-MAX.
EXIT.
*
******************************************************************
* get the min-wage
*-----------------------------------------------------------------
* call before
* MOVE MAX-NUMBER TO LIST-MIN-NUM.
******************************************************************
*
1100-GET-MIN-WAGES SECTION.
IF THIS-I < MAX-DATA-LENGTH THEN
EVALUATE TRUE
WHEN THIS-SALARY(THIS-I) = THIS-SALARY(THIS-I + ONE)
IF THIS-SALARY(THIS-I) < LIST-MIN-NUM
AND THIS-SALARY(THIS-I) IS NOT ZERO
MOVE THIS-SALARY(THIS-I) TO LIST-MIN-NUM
END-IF
WHEN THIS-SALARY(THIS-I + ONE) < THIS-SALARY(THIS-I)
IF THIS-SALARY(THIS-I + ONE) < LIST-MIN-NUM
AND THIS-SALARY(THIS-I + ONE) IS NOT ZERO
MOVE THIS-SALARY(THIS-I + ONE) TO LIST-MIN-NUM
END-IF
WHEN THIS-SALARY(THIS-I) < THIS-SALARY(THIS-I + ONE)
IF THIS-SALARY(THIS-I) < LIST-MIN-NUM
AND THIS-SALARY(THIS-I) IS NOT ZERO
MOVE THIS-SALARY(THIS-I) TO LIST-MIN-NUM
END-IF
END-EVALUATE
END-IF.
1100-GET-MIN-WAGES-EXIT.
MOVE LIST-MIN-NUM TO LIST-MIN.
EXIT.
*
******************************************************************
* times of valid data
******************************************************************
*
1200-VALID-DATA SECTION.
1200-VALID-DATA-EXIT.
EVALUATE TRUE
WHEN THIS-SALARY(THIS-I) > ZERO
ADD 1 TO LIST-TIMES-NUM
END-EVALUATE.
EXIT.
*
******************************************************************
* get the avg-wage (exclude extreme values at both ends)
*-----------------------------------------------------------------
* include
* 1. 1200-VALID-DATA
* 2. 1000-GET-MAX-WAGES
* 3. 1100-GET-MIN-WAGES
* 4. 1400-GET-TOTAL
******************************************************************
*
1300-GET-AVERAGE-WAGES SECTION.
PERFORM 1200-VALID-DATA
VARYING THIS-I FROM 1 BY 1
UNTIL THIS-I > MAX-DATA-LENGTH.
IF LIST-TIMES-NUM < 2 AND LIST-TIMES-NUM = 2
GO TO 1300-GET-AVERAGE-WAGES-EXIT
END-IF
PERFORM 1000-GET-MAX-WAGES
VARYING THIS-I FROM 1 BY 1
UNTIL THIS-I > MAX-DATA-LENGTH.
MOVE MAX-NUMBER TO LIST-MIN-NUM.
PERFORM 1100-GET-MIN-WAGES
VARYING THIS-I FROM 1 BY 1
UNTIL THIS-I > MAX-DATA-LENGTH.
PERFORM 1400-GET-TOTAL
VARYING THIS-I FROM 1 BY 1
UNTIL THIS-I > MAX-DATA-LENGTH.
IF LIST-TIMES-NUM IS NOT ZERO
COMPUTE LIST-AVERAGE-NUM =
(
LIST-TOTAL-NUM
- LIST-MAX-NUM
- LIST-MIN-NUM
) / (LIST-TIMES-NUM - 2)
ELSE
DISPLAY ' without times of number.'
END-IF.
1300-GET-AVERAGE-WAGES-EXIT.
MOVE LIST-AVERAGE-NUM TO LIST-AVERAGE.
EXIT.
*
******************************************************************
* get the total
******************************************************************
*
1400-GET-TOTAL SECTION.
ADD THIS-SALARY(THIS-I) TO LIST-TOTAL-NUM.
INITIALIZE LIST-TOTAL.
MOVE LIST-TOTAL-NUM TO LIST-TOTAL.
1400-GET-TOTAL-EXIT.
EXIT.
*
******************************************************************
* show message of statistics
******************************************************************
*
2000-STATISTICS SECTION.
DISPLAY ''.
DISPLAY '> --------------------- ' LIST-TAG
DISPLAY ' - MAX: ' LIST-MAX
DISPLAY ' - MIN: ' LIST-MIN
DISPLAY ' - AVERAGE: ' LIST-AVERAGE
DISPLAY ' - TOTAL: ' LIST-TOTAL
DISPLAY ''.
2000-STATISTICS-EXIT.
EXIT.
END PROGRAM DEMO.