Cobol 两栏印刷

Cobol 两栏印刷,cobol,Cobol,我们应该形成一个出现108次的名称数组。我们应该在左栏有名字1-54,在右栏有名字55-108。在一个页面有108个名称之后,我们初始化数组并重新开始。我的代码的输出显示打印的名称1-54,而不是在同一页上和名称1-54旁边,名称55-108在右侧列中,但在名称1-54之后。任何想法都将不胜感激 以下是我的一些代码: PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'NO ' READ NAMELIST-FILE-IN

我们应该形成一个出现108次的名称数组。我们应该在左栏有名字1-54,在右栏有名字55-108。在一个页面有108个名称之后,我们初始化数组并重新开始。我的代码的输出显示打印的名称1-54,而不是在同一页上和名称1-54旁边,名称55-108在右侧列中,但在名称1-54之后。任何想法都将不胜感激

以下是我的一些代码:

       PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'NO '
           READ NAMELIST-FILE-IN
               AT END
                   MOVE 'NO ' TO ARE-THERE-MORE-RECORDS
               NOT AT END
                   PERFORM 200-PROCESS-ONE-RECORD
           END-READ
       END-PERFORM
       CLOSE NAMELIST-FILE-IN
       CLOSE NAMELIST-FILE-OUT
       STOP RUN.

   200-PROCESS-ONE-RECORD.
       ADD 1 TO NAME-SUB
       MOVE NAME-IN TO NAME-1 (NAME-SUB)
       PERFORM 220-MOVE-RECORDS.


   220-MOVE-RECORDS.
       IF NAME-SUB <= 54
           MOVE NAME-1 (NAME-SUB) TO LEFT-LABEL
           MOVE SPACES TO RIGHT-LABEL
       END-IF
       IF NAME-SUB >= 55
           MOVE NAME-1 (NAME-SUB) TO RIGHT-LABEL
           MOVE SPACES TO LEFT-LABEL
       END-IF
       MOVE DETAIL-LINE TO NAMELIST-RECORD-OUT
       WRITE NAMELIST-RECORD-OUT
           AFTER ADVANCING 1 LINE
       IF NAME-SUB >= 108
           MOVE SPACES TO DETAIL-LINE
           MOVE ZERO TO NAME-SUB
           PERFORM 300-WRITE-HEADING
       END-IF.
执行直到有更多记录='NO'
读取名称列表文件
最后
将“否”移动到有更多记录
不在最后
执行200个过程一个记录
端读
末端执行
关闭NAMELIST-FILE-IN
关闭名称列表文件
停,跑。
200-过程-一个记录。
将1添加到NAME-SUB
将NAME-IN移动到NAME-1(NAME-SUB)
执行220-MOVE-RECORDS。
220-MOVE-RECORDS。
如果NAME-SUB=55
将NAME-1(NAME-SUB)移动到右标签
将空间移到左标签
端到端IF
将明细行移动到名称列表-记录输出
填写姓名表-记录
前进1行后
如果NAME-SUB>=108
将空间移动到详图线
将零移到NAME-SUB
执行300-WRITE-HEADING
结束-如果。

我已经对所有正确的工作存储条目进行了编码,以容纳信息。你知道我写细节线的方式是否有问题,还是我处理数据的方式有问题

你的逻辑是错误的。让我们假设(为了简单起见)您有216个名称,您需要读入其中108个名称,并将它们存储在您的NAME-1数组中


然后您可以在54行上循环,将NAME-1[n]放入左标签,将NAME-1[n+54]放入右标签,然后移动详细信息行并写入输出;重复n=1行如果我理解正确,这应该接近您想要的

  220-MOVE-RECORDS.

       IF NAME-SUB >= 108
           perform varing i from 1 to 54
               MOVE NAME-1 (NAME-SUB) TO LEFT-LABEL
               compute ip54 = i + 54
               MOVE NAME-1 (ip54) TO RIGHT-LABEL

               WRITE NAMELIST-RECORD-OUT 
                from DETAIL-LINE
               AFTER ADVANCING 1 LINE
           end-perform

           MOVE SPACES TO DETAIL-LINE
           MOVE ZERO TO NAME-SUB
           PERFORM 300-WRITE-HEADING

    END-IF.

注意:许多Cobol编译器允许小写

您应该始终对所有IO进行错误检查

“一个文件中的一个文件输出”通常如下所示:

open input
check status
open output
check status
process file until end
close input
check status
close output
check status

process file
read input
check staus
do what is needed
write output
check status
open input
check status
open output
check status
*priming read*
process file until end
close input
check status
close output
check status

process file
do what is needed
write output
check status
read input
check staus
最好是这样:

open input
check status
open output
check status
process file until end
close input
check status
close output
check status

process file
read input
check staus
do what is needed
write output
check status
open input
check status
open output
check status
*priming read*
process file until end
close input
check status
close output
check status

process file
do what is needed
write output
check status
read input
check staus
“启动读取”处理文件上的第一条记录(如果有)。您可以灵活地处理“空文件”,而不必“混淆”主逻辑,也不必在其他地方区分两种不同类型的“文件结尾”。“进程文件”末尾的“立即读取”删除了有点曲折的“结束/不结束”

例如,表中只需要54个元素。在处理页面“右侧”的记录时,可以从“左侧”取第一条记录,并立即执行该行

在测试中使用88而不是文字

不要在页面末尾添加“标题”,因为如果没有更多的记录要处理,那么标题后面会有一个“空白页”

如果打印行写在段落中,可以使用该段落检查是否需要标题,初始值为54的“行计数”

使用108元素的方法,一次打印一页,在顶部打印标题

如果数据在设置为其他值之前从未使用过,则无需将其设置为初始值

您已经对过程代码采用了“最小句号/句号”方法,这很好-将必要的最后一个句号放在自己的行上如何

   PERFORM 220-MOVE-RECORDS.
变成

   PERFORM 220-MOVE-RECORDS
   .

仅使用>=或用于超过诊断消息,然后使用诊断消息失败,这样就可以了。有些编译器允许对表访问进行“边界检查”,如果您正在使用它,您甚至不需要额外的检查。

查看您的工作存储定义以及代码会很有帮助。很难理解 理解一个而不理解另一个

无论如何,你所描述的是一个相当“标准”的问题 有几种可能的解决办法。下面是一个例子 概述一种可能的方法

从数据结构开始。。。工作存储:

  01 WS-PAGE-BUFFER.
     02 WS-LINE OCCURS 54 TIMES.
        03 WS-NAME PIC X(40) OCCURS 2 TIMES.
上述工作存储器描述了一页输出。这一页有54行。每行包含 两个名字。接下来你需要一些计数器

  01.
    02 WS-LINE-CNTR      PIC S9(4) COMP.
    02 WS-NAME-CNTR      PIC S9(4) COMP.
需要解决两个问题:

  • 按正确的顺序填写页面
  • 打印带有适当标题/拖尾的页面
在解决这些问题时,需要记住的另一点是,您需要覆盖 关于输入的几个场景:没有输入,输入正好符合某个数字 输出页面和输入的数量部分填充输出页面。所以不管你做什么,所有人 这些情况需要以“自然”的方式自行解决。 此外,通常有一些前/后慢行的东西 解决(如初始化、打开文件、关闭文件等)

还有一件事始终声明输入/输出文件的文件状态 捕获错误和文件结束条件。下面的算法假设您 完成此操作(文件结束状态通常为“10”)

骨架算法

 MAINLINE
    PERFORM INITIALIZE-PAGE
    Open input file (check status etc...)
    Open output file (check status etc...)
    Read first line from file (check for errors/end of file etc...)
    PERFORM UNTIL INPUT-FILE-STATUS NOT = ZERO /* read until eof/error
       IF WS-LINE-CNTR = 54 AND WS-NAME-CNT = 2 /* check for full page.
          PERFORM OUTPUT-PAGE
       END-IF
       ADD +1 TO WS-LINE-CNTR
       IF WS-LINE-CNTR > 54
          MOVE +1 TO WS-LINE-CNTR /* Start next column...
          ADD +1 TO WS-NAME-CNTR  /* Increment column
       END-IF
       MOVE input-record TO WS-NAME (WS-LINE-CNTR, WS-NAME-CNTR)
       Read next line from input file
    END-PERFORM

    IF INPUT-FILE-STATUS = '10' AND WS-LINE-CNTR > ZERO
       PERFORM OUTPUT-PAGE /* force the last page to print
    END-IF

    close input file
    close output file

    GOBACK /* done 
    .

 INITIALIZE-PAGE.
     MOVE SPACE TO WS-PAGE-BUFFER  /* Blank page (ie. SPACES)
     MOVE ZERO TO WS-LINE-CNTR     /* Top of page 
     MOVE +1   TO WS-NAME-CNTR     /* First column of page
     .

 OUTPUT-PAGE.
     Ouput page headers...
     PERFORM VARYING WS-LINE-CNTR FROM 1 BY 1
               UNTIL WS-LINE-CNTR > 54
        write WS-LINE (WS-LINE-CNTR) to output file (check status etc...)
     END-PERORM
     Output page trailers...
     PERFORM INITIALIZE-PAGE /* Start a fresh page...
     .
我留下了很多“空白点”需要填补,我承认还有更多的空白点 完成你想做的事情的优雅方式,但是
这应该可以让您开始了。

COBOL。哇:)你在什么平台上开发这个?个人电脑?您将在哪个目标平台上部署实际应用程序?这是上学用的吗?为了工作?PS:你们有没有可能发布预期输出和实际输出的示例?我不是cobol的人,但我希望如果NAME-SUB>=55,会有一个
,进入顶部的某个地方。
把空格移到左标签上
会不会覆盖已经存在的内容?是的,我在电脑上,这是给学校的。我没有一个关于它应该是什么样子的例子(只是在纸上),但我有一些关于我的例子是如何发展的。哟