cobol 小练习 422

      ******************************************************************
      * 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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值