Arrays 在cobol中使用数组循环访问客户机和预订类型

Arrays 在cobol中使用数组循环访问客户机和预订类型,arrays,cobol,Arrays,Cobol,尝试使用数组解决此问题。 问题是: 我面临的问题是:必须以一种更简单的方式循环浏览预订类型。当我查看输出时,它会多次显示客户编号、客户名称和地址,并使用不应显示的相同输入 任何帮助都将不胜感激 以下是程序: Process Apost. Identification Division. Program-ID. BOOKINGARR. * * Page 554 No 3. ARRAYS. * Data in sequence by Client No. Print the average

尝试使用数组解决此问题。

问题是:

我面临的问题是:必须以一种更简单的方式循环浏览预订类型。当我查看输出时,它会多次显示客户编号、客户名称和地址,并使用不应显示的相同输入

任何帮助都将不胜感激

以下是程序:

 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. 

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

现代COBOL程序通常在段落或章节名称的末尾以及段落或章节的末尾有句号。有些人在段落或章节的最后一行用句号而不是句号来表示“继续”或“退出”语句

现代COBOL程序使用显式作用域终止符,特别是在
IF
语句上,而不是在句号上

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

关于堆栈溢出,我建议您熟悉“代码示例”按钮“{}”,而不是用粗体标记段落

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


对于额外的积分,在将其用作下标之前,请验证
BOOKTYPE
是否为数字,并使用一个内嵌的
PERFORM
来计算平均值。

我知道您使用的是Stern&Stern

目标是:

打印每种预订类型的平均旅行成本。使用数组

意味着输出应该只包含两列和四行,以及任何标题。比如说,

Booking Type      Average Cost
------------      ------------
Cruise                ZZZZ9.99
Air-Independent       ZZZZ9.99
Air-Tour              ZZZZ9.99
Other                 ZZZZ9.99
要实现这一点,您需要将这四个描述放在一个数组中,并将每种预订类型的总成本和计数累加到一个数组中。处理完所有记录后,计算平均值并打印结果,同时在数组中循环


你试图做的比要求的多得多

你能帮我通过程序科吗?我对此感到很困惑。cschneid@GreenSaucer42这并不是一个让别人告诉你程序正在做什么的好地方。如果你将之前的问题完全编辑在同一个问题上,情况会好得多: