【问题标题】:Using arrays in cobol to loop through clients and booking type在 cobol 中使用数组循环访问客户端和预订类型
【发布时间】:2018-04-18 19:43:22
【问题描述】:

尝试使用数组来解决这个问题。

问题来了:

我面临的问题: 必须是一种更简单的方法来遍历预订类型。当我查看输出时,它会多次显示客户编号、客户名称和地址,但输入相同,但不应该如此。

任何帮助将不胜感激。

下面是程序:

 Process Apost.
 Identification Division.
 Program-ID. BOOKINGARR.

*
* Page 554 No 3. ARRAYS.
* Data in sequence by Client No. Print the average cost of 
* trip for each booking type. Use arrays.
* 
 Environment Division.
 Configuration Section.
 Source-Computer.  IBM-AS400.
 Object-Computer.  IBM-AS400.
 Input-Output Section.
 File-Control.
     Select Input-File Assign to Database-Bookingpf.
     Select Output-File Assign to Printer-Qsysprt.
 Data Division.
 File Section.

  FD Input-File.
  01 Input-File-Rec.
      Copy DDS-BookingR of Bookingpf.

  FD Output-File.
   01 Output-File-Rec         Pic x(120).
  Working-Storage Section.

    01 END-OF-FILE          PIC X           VALUE 'N'.

    01 WS-ARRAY.
       05 WS-TABLE-ENTRIES OCCURS 4 TIMES.
          10 WS-TOTAL-COST                 PIC 9(7)V99.
          10 WS-TRIP-COUNT                 PIC 999.
          10 WS-AVG-COST                   PIC 9(7)V99 VALUE ZERO.
          10 WS-BOOKING-TYPE               PIC 9.

     01 ARRAY-INDEX                         PIC 99.
     01 EMPTY-POINTER                       PIC 99.
     01 ARRAY-EMPTY                         PIC XXX.


      01 PROGRAM-HEADER.
         05                        PIC X(2)  VALUE SPACES.
         05                        PIC X(10) VALUE 'CLIENT NO.'.
         05                        PIC X(3)  VALUE SPACES.
         05                        PIC X(11) VALUE 'CLIENT NAME'.
         05                        PIC X(6)  VALUE SPACES.
         05                        PIC X(14) VALUE 'CLIENT ADDRESS'.
         05                        PIC X(4)  VALUE SPACES.
         05                        PIC X(9)  VALUE 'BOOK TYPE'.
         05                        PIC X(4)  VALUE SPACES.
         05                        PIC X(12) VALUE 'AVERAGE COST'.
      01 REPORT-LINE.
         05                        PIC X(2)  VALUE SPACES.
         05  CLIENTNO-OUT          PIC 999.
         05                        PIC X(10) VALUE SPACES.
         05  CLIENTNA-OUT          PIC X(16).
         05                        PIC X(1)  VALUE SPACES.
         05  CLIENTADD-OUT         PIC X(19).
         05                        PIC X(3)  VALUE SPACES.
         05  BOOKTYPE-OUT          PIC Z.
         05                        PIC X(8) VALUE SPACES.
         05  AVGCOST-OUT           PIC $Z,ZZ9.99.
         05                        PIC X(12) VALUE SPACES.

    Procedure Division. 
    000-MAIN.
      OPEN INPUT INPUT-FILE 
          OUTPUT OUTPUT-FILE.
      PERFORM 100-MOVE.
      PERFORM 1000-READ.
      PERFORM 300-UPDATE-BOOKINGS
              UNTIL END-OF-FILE = 'Y'.
      WRITE OUTPUT-FILE-REC FROM PROGRAM-HEADER.
      PERFORM 600-WRITE-TO-SCREEN
              VARYING ARRAY-INDEX FROM 1 BY 1
              UNTIL ARRAY-INDEX > 4.
      CLOSE INPUT-FILE, OUTPUT-FILE.
      STOP RUN.

    100-MOVE.
       MOVE 1      TO EMPTY-POINTER.
       MOVE 'Y'    TO ARRAY-EMPTY.
       MOVE SPACES TO UPDATE-DONE.
       PERFORM 150-ZERO-OUT-ARRAY
               VARYING ARRAY-INDEX FROM 1 BY 1 UNTIL
               ARRAY-INDEX > 4.

    150-ZERO-OUT-ARRAY.
       MOVE ZEROS TO  WS-BOOKING-TYPE    (ARRAY-INDEX).
       MOVE ZEROS TO  WS-TOTAL-COST      (ARRAY-INDEX).
       MOVE ZEROS TO  WS-TRIP-COUNT      (ARRAY-INDEX).
       MOVE ZEROS TO  WS-AVG-COST        (ARRAY-INDEX).

    1000-READ.
       READ INPUT-FILE AT END MOVE 'Y' TO END-OF-FILE.


    300-UPDATE-BOOKINGS.
     IF ARRAY-EMPTY = 'Y'
        PERFORM 400-ADD-1-TO-COUNT
        MOVE 'N' TO ARRAY-EMPTY
     ELSE
        MOVE 'N' TO UPDATE-DONE
        PERFORM 500-GET-BOOKING-AVERAGE
           VARYING ARRAY-INDEX FROM 1 BY 1
           UNTIL ARRAY-INDEX = EMPTY-POINTER
                      OR
           UPDATE-DONE = 'Y'.

     IF UPDATE-DONE = 'N'
        PERFORM 400-ADD-1-TO-COUNT.

     PERFORM 1000-READ.

   400-ADD-1-TO-COUNT.
     MOVE BOOKTYPE   TO WS-BOOKING-TYPE (EMPTY-POINTER).
     ADD 1           TO WS-TRIP-COUNT   (EMPTY-POINTER).
     MOVE COSTOFTRIP TO WS-TOTAL-COST   (EMPTY-POINTER).
     MOVE COSTOFTRIP TO WS-AVG-COST     (EMPTY-POINTER).
     ADD 1 TO EMPTY-POINTER.

   500-GET-BOOKING-AVERAGE.
    IF BOOKTYPE = WS-BOOKING-TYPE      (ARRAY-INDEX)
       ADD 1 TO WS-TRIP-COUNT          (ARRAY-INDEX)
       ADD COSTOFTRIP TO WS-TOTAL-COST (ARRAY-INDEX)
       COMPUTE WS-AVG-COST (ARRAY-INDEX) =
            WS-TOTAL-COST (ARRAY-INDEX) / 
            WS-TRIP-COUNT (ARRAY-INDEX) 
       MOVE 'Y' TO UPDATE-DONE.

   600-WRITE-TO-SCREEN.
      MOVE CLIENTNO TO CLIENTNO-OUT.
      MOVE CLIENTNA TO CLIENTNA-OUT.
      MOVE CLIENTADD TO CLIENTADD-OUT.
      MOVE WS-BOOKING-TYPE (ARRAY-INDEX) TO BOOKTYPE-OUT.
      MOVE WS-AVG-COST (ARRAY-INDEX) TO AVGCOST-OUT.
      WRITE OUTPUT-FILE-REC FROM REPORT-LINE 
            AFTER ADVANCING 1 LINE. 

【问题讨论】:

标签: arrays cobol


【解决方案1】:

我看到你正在使用 Stern & Stern。

目标:

打印每种预订类型的平均行程费用。使用数组。

表示输出应仅包含两列和四行,以及任何标题。例如,

Booking Type      Average Cost
------------      ------------
Cruise                ZZZZ9.99
Air-Independent       ZZZZ9.99
Air-Tour              ZZZZ9.99
Other                 ZZZZ9.99

要实现这一点,您需要将四个描述放在一个数组中,并将每种预订类型的总成本和计数累积在一个数组中。处理完所有记录后,计算平均值并在遍历数组时打印结果。

你试图做的比要求的多!

【讨论】:

    【解决方案2】:

    对 COBOL 段落进行编号的原因是为了更容易找到它们。在一个几千行长的程序中,它为维护者节省了大量的精力。您在第 150 和 300 段之间找到了第 1000 段。

    现代 COBOL 程序通常在段落或部分名称的末尾以及段落或部分的末尾有句号。有些人将段落或部分的最后一行设置为 CONTINUEEXIT 语句,并带有句号,而不是单独的句号。

    现代 COBOL 程序使用显式范围终止符,尤其是在 IF 语句上,而不是句号。

    COBOL 因冗长而受到批评;许多 COBOL 程序员通过命名他们的段落来表明其中包含的代码正在做什么,从而将其变成一种美德。例如,100-MOVE 可能更适合命名为 100-INITIALIZE

    在 Stack Overflow 上,我建议您熟悉“代码示例”按钮,即“{}”,而不是用粗体标记您的段落。

    如果练习的目的是计算每种预订类型的平均成本,我建议使用预订类型作为数组的下标。对于您阅读的每条记录,将COSTOFTRIP 添加到WS-TOTAL-COST(BOOKTYPE) 并增加WS-TRIP-COUNT(BOOKTYPE)。在文件末尾,通过对 PERFORM VARYING 循环内的数组的每个元素使用 COMPUTE,计算每个 BOOKTYPE 的平均行程成本。

    要获得额外积分,请在将 BOOKTYPE 用作下标之前验证其是否为数字,并使用内联的 PERFORM 来计算平均值。

    【讨论】:

    • 有没有办法让我通过程序部?我很困惑。 cschneid
    • @GreenSaucer42 这不是让别人告诉你程序在做什么的正确地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    相关资源
    最近更新 更多