我的COBOL作业需要帮助吗

我的COBOL作业需要帮助吗,cobol,Cobol,很抱歉打扰你们,我正忙着写COBOL的作业呢。我做了两次尝试,都没有达到预期效果 下面显示了两次尝试及其输出,然后是需要得到的最终结果。谢谢大家的帮助 第一次尝试: IDENTIFICATION DIVISION. PROGRAM-ID. MAIL-LABEL. * ****************************************************************** * This program prints duplicate side by side mail

很抱歉打扰你们,我正忙着写COBOL的作业呢。我做了两次尝试,都没有达到预期效果

下面显示了两次尝试及其输出,然后是需要得到的最终结果。谢谢大家的帮助

第一次尝试:

IDENTIFICATION DIVISION.
PROGRAM-ID. MAIL-LABEL.
*
******************************************************************
* This program prints duplicate side by side mailing labels.
******************************************************************
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.

SELECT LABEL-FILE-IN
ASSIGN TO 'MAIL-LABEL.SEQ'
ORGANIZATION IS LINE SEQUENTIAL.

SELECT LABEL-FILE-OUT
ASSIGN TO 'MAIL-LABEL.RPT'
ORGANIZATION IS LINE SEQUENTIAL.

DATA DIVISION.
FILE SECTION.

FD LABEL-FILE-IN.
01 LABEL-RECORD-IN.
05 NAME-IN PIC X(20).
05 ADDRESS-IN PIC X(20).
05 CITY-STATE-ZIP-IN PIC X(20).

FD LABEL-FILE-OUT.
01 LABEL-RECORD-OUT.
05 LEFT-LABEL-OUT PIC X(20).
05 BLANK-OUT PIC X(15).
05 RIGHT-LABEL-OUT PIC X(20).
05 BLANK-A-OUT PIC X(5).

WORKING-STORAGE SECTION.
01 ARE-THERE-MORE-RECORDS PIC X(3) VALUE 'YES'.

PROCEDURE DIVISION.
100-MAIN.
OPEN INPUT LABEL-FILE-IN
OPEN OUTPUT LABEL-FILE-OUT

PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'NO'
READ LABEL-FILE-IN
AT END
MOVE 'NO' TO ARE-THERE-MORE-RECORDS
NOT AT END
PERFORM 200-PROCESS-ONE-RECORD
END-READ
END-PERFORM

CLOSE LABEL-FILE-IN
CLOSE LABEL-FILE-OUT
STOP RUN.

200-PROCESS-ONE-RECORD.
MOVE NAME-IN TO LEFT-LABEL-OUT
MOVE ADDRESS-IN TO BLANK-OUT
MOVE CITY-STATE-ZIP-IN TO RIGHT-LABEL-OUT
MOVE SPACES TO BLANK-A-OUT
WRITE LABEL-RECORD-OUT.
这将产生:

*IAN HENDERSON       1309 SPRINGBANKDETROIT     MI 48024
*JANET LEASA         12700 GRATIOT SWARREN      MI 48077
*COREY HAYES         400 BRUSH ST.  DETROIT     MI 48024
*SCOTT TOKLEY        2003 INDIAN RD.TAYLOR      MI 48075
*JUDY FISHER         2200 WOODWARD ADETROIT     MI 48025
*SHAWN MITCHELL      510 HOLLYWOOD PDETROIT     MI 48025
*MARCUS PILLON       1450 JOY RD    DEARBORN    MI 48077
*BRIAN GUENETTE      456 TRUMBULL STDETROIT     MI 48024
*KIM MIKA            456 LAFAYETTE SDETROIT     MI 48024
*KYLE THOMPSON       1617 MAPLE RD. WARREN      MI 48056
*SUE DONALDSON       11 CASS AVE.   DETROIT     MI 48024
我的第二次尝试:

IDENTIFICATION DIVISION.
PROGRAM-ID. MAIL-LABEL.
*
******************************************************************
* This program prints duplicate side by side mailing labels.
******************************************************************
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.

SELECT LABEL-FILE-IN
ASSIGN TO 'MAIL-LABEL.SEQ'
ORGANIZATION IS LINE SEQUENTIAL.

SELECT LABEL-FILE-OUT
ASSIGN TO 'MAIL-LABEL.RPT'
ORGANIZATION IS LINE SEQUENTIAL.

DATA DIVISION.
FILE SECTION.

FD LABEL-FILE-IN.
01 LABEL-RECORD-IN.
05 NAME-IN PIC X(20).
05 ADDRESS-IN PIC X(20).
05 CITY-STATE-ZIP-IN PIC X(20).

FD LABEL-FILE-OUT.
01 LABEL-RECORD-OUT.
05 LEFT-LABEL-OUT PIC X(20).
05 BLANK-OUT PIC X(15).
05 RIGHT-LABEL-OUT PIC X(20).
05 BLANK-A-OUT PIC X(5).

WORKING-STORAGE SECTION.
01 ARE-THERE-MORE-RECORDS PIC X(3) VALUE 'YES'.

PROCEDURE DIVISION.
100-MAIN.
OPEN INPUT LABEL-FILE-IN
OPEN OUTPUT LABEL-FILE-OUT

PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'NO'
READ LABEL-FILE-IN
AT END
MOVE 'NO' TO ARE-THERE-MORE-RECORDS
NOT AT END
PERFORM 200-PROCESS-ONE-RECORD
END-READ
END-PERFORM

CLOSE LABEL-FILE-IN
CLOSE LABEL-FILE-OUT
STOP RUN.

200-PROCESS-ONE-RECORD.
MOVE NAME-IN TO LEFT-LABEL-OUT
MOVE ADDRESS-IN TO LEFT-LABEL-OUT
MOVE CITY-STATE-ZIP-IN TO LEFT-LABEL-OUT
MOVE SPACES TO BLANK-OUT
MOVE NAME-IN TO RIGHT-LABEL-OUT
MOVE ADDRESS-IN TO RIGHT-LABEL-OUT
MOVE CITY-STATE-ZIP-IN TO RIGHT-LABEL-OUT
MOVE SPACES TO BLANK-A-OUT
WRITE LABEL-RECORD-OUT
制作:

*DETROIT     MI 48024               DETROIT     MI 48024
*WARREN      MI 48077               WARREN      MI 48077
*DETROIT     MI 48024               DETROIT     MI 48024
*TAYLOR      MI 48075               TAYLOR      MI 48075
*DETROIT     MI 48025               DETROIT     MI 48025
*DETROIT     MI 48025               DETROIT     MI 48025
*DEARBORN    MI 48077               DEARBORN    MI 48077
*DETROIT     MI 48024               DETROIT     MI 48024
*DETROIT     MI 48024               DETROIT     MI 48024
*WARREN      MI 48056               WARREN      MI 48056
*DETROIT     MI 48024               DETROIT     MI 48024
我需要的结果是:

*IAN HENDERSON                      IAN HENDERSON 
*1309 SPRINGBANK ST.                1309 SPRINGBANK ST.
*DETROIT     MI 48024               DETROIT     MI 48024

*JANET LEASA                        JANET LEASA 
*12700 GRATIOT ST.                  12700 GRATIOT ST. 
*WARREN      MI 48077               WARREN      MI 48077

*COREY HAYES                        COREY HAYES
*400 BRUSH ST.                      400 BRUSH ST.
*DETROIT     MI 48024               DETROIT     MI 48024

*SCOTT TOKLEY                       SCOTT TOKLEY 
*2003 INDIAN RD.                    2003 INDIAN RD.
*TAYLOR      MI 48075               TAYLOR      MI 48075
WORKING-STORAGE SECTION.
    01 ARE-THERE-MORE-RECORDS     PIC X(3) VALUE 'YES'.
    01 DOING-LEFT                 PIC X(3) VALUE 'YES'.
    01 LEFT-NAME-IN               PIC X(20).
    01 LEFT-ADDRESS-IN            PIC X(20).
    01 LEFT-CITY-STATE-ZIP-IN     PIC X(20).

我的代码怎么了?

通常情况下,我不会在家庭作业上给你这么多帮助,但是,既然你已经投入了相当多的精力,而且你不太可能在这里找到我们很多恐龙,我会帮你解决

您的问题就在这里(忽略右边括号中的内容,它们只是帮助您解决问题的注释):

这是处理一条记录的段落。您在这里要做的是将三件事同时放入左输出部分和右输出部分(以便覆盖前两部分)

您需要的是一个切换变量来选择是处理左值还是右值,以及存储左数据的能力,以便在处理右数据时可以同时输出它们,例如:

*IAN HENDERSON                      IAN HENDERSON 
*1309 SPRINGBANK ST.                1309 SPRINGBANK ST.
*DETROIT     MI 48024               DETROIT     MI 48024

*JANET LEASA                        JANET LEASA 
*12700 GRATIOT ST.                  12700 GRATIOT ST. 
*WARREN      MI 48077               WARREN      MI 48077

*COREY HAYES                        COREY HAYES
*400 BRUSH ST.                      400 BRUSH ST.
*DETROIT     MI 48024               DETROIT     MI 48024

*SCOTT TOKLEY                       SCOTT TOKLEY 
*2003 INDIAN RD.                    2003 INDIAN RD.
*TAYLOR      MI 48075               TAYLOR      MI 48075
WORKING-STORAGE SECTION.
    01 ARE-THERE-MORE-RECORDS     PIC X(3) VALUE 'YES'.
    01 DOING-LEFT                 PIC X(3) VALUE 'YES'.
    01 LEFT-NAME-IN               PIC X(20).
    01 LEFT-ADDRESS-IN            PIC X(20).
    01 LEFT-CITY-STATE-ZIP-IN     PIC X(20).
然后修改您的记录处理代码(检查
IF
语法,我已经有一段时间没有剪切任何COBOL代码了):

然后,在文件被完全读取之后,您需要检测是否填充了左边的数据(即,有奇数个输入行)。如果
do-LEFT
设置为
'NO'
,则会出现这种情况

我将把这留给您,但它涉及移动左侧数据并用空格填充右侧数据,方式非常类似于上面的
202-PROCESS-right-RECORD
(轻推、轻推、眨眼、眨眼)


现在,我已经很好地查看了所需的输出,看起来您实际上需要在左侧和右侧各有两个地址副本。您确定这是您想要的方式吗?因为这是邮件标签程序非常不寻常的要求

在任何情况下,我都会把所有的代码留在上面,因为这是一个很好的方法来完成每个邮寄标签的方法,但您似乎需要的代码要简单得多,是对
202-PROCESS-RIGHT-RECORD
段落的一个非常微小的变化

忘记我提到的所有额外工作存储,只需将
200-PROCESS-ONE-RECORD
更改为:

200-PROCESS-ONE-RECORD.
    MOVE NAME-IN TO LEFT-LABEL-OUT.
    MOVE SPACES TO BLANK-OUT.
    MOVE NAME-IN TO RIGHT-LABEL-OUT.
    MOVE SPACES TO BLANK-A-OUT.
    WRITE LABEL-RECORD-OUT.

    MOVE ADDRESS-IN TO LEFT-LABEL-OUT.
    MOVE SPACES TO BLANK-OUT.
    MOVE ADDRESS-IN TO RIGHT-LABEL-OUT.
    MOVE SPACES TO BLANK-A-OUT.
    WRITE LABEL-RECORD-OUT.

    MOVE CITY-STATE-ZIP-IN TO LEFT-LABEL-OUT.
    MOVE SPACES TO BLANK-OUT.
    MOVE CITY-STATE-ZIP-IN TO RIGHT-LABEL-OUT.
    MOVE SPACES TO BLANK-A-OUT.
    WRITE LABEL-RECORD-OUT.

我认为你的第二次尝试几乎是正确的。正如帕斯迪亚布洛在报告中指出的那样 他的回答是,你的问题是覆盖数据

如果我没弄错你的问题,你只看了一条记录 包含完整的地址(姓名、地址、市/州邮政编码)并且必须 并排打印两份

请注意,对于您阅读的每一行,您都需要打印3。还请注意,您 只有一个输出记录缓冲区。这意味着您一次只能处理一个输出行 时间解决方案是将每个地址组件移动到左侧和右侧 对于输出行,输出该行,然后转到下一个地址组件。自从 有3个地址组件,每读取一次,就打印3行

尝试修改第200段-过程-记录,如下所示

200-PROCESS-ONE-RECORD. 
MOVE NAME-IN TO LEFT-LABEL-OUT
MOVE SPACES TO BLANK-OUT
MOVE NAME-IN TO RIGHT-LABEL-OUT
MOVE SPACES TO BLANK-A-OUT 
WRITE LABEL-RECORD-OUT

MOVE ADDRESS-IN TO LEFT-LABEL-OUT
MOVE SPACES TO BLANK-OUT
MOVE ADDRESS-IN TO RIGHT-LABEL-OUT
MOVE SPACES TO BLANK-A-OUT 
WRITE LABEL-RECORD-OUT 

MOVE CITY-STATE-ZIP-IN TO LEFT-LABEL-OUT
MOVE SPACES TO BLANK-OUT 
MOVE CITY-STATE-ZIP-IN TO RIGHT-LABEL-OUT 
MOVE SPACES TO BLANK-A-OUT 
WRITE LABEL-RECORD-OUT 
这需要一条输入线,产生3条输出线。您可能想要输出 第四个空白行用于分隔地址(如示例输出中所示,我将 让你想想如何做到这一点)

我认为Paxdiablo的解决方案解决了一个稍微不同的问题 您将打印每个地址的一个副本,但打印两个地址

顺便说一句。。。尽管你的问题得到了很多贬损“开车经过”的评论,COBOL
仍在该行业的某些领域积极使用。

关于覆盖的问题已经得到了很好的回答,但我想补充两件事,这将极大地提高Cobol代码的可读性和可维护性

您在这里使用了一个带有are-THERE-MORE-RECORDS变量的Cobol'74 meme,并将“YES”和“NO”文本移动到它。这是非常脆弱的,容易破碎。一种更好、更不脆弱、更可读的方法是使用Cobol提供的条件,也称为88:

  05 Filler          Pic x(1) Value 'Y'.
    88 More-Records           Value 'Y'.
    88 No-More-Records        Value 'N'.
您可以使用以下工具进行测试:

 Perform until No-More-Records
并通过以下方式触发:

 Set No-More-Records to true
这可以为您做几件事

  • 没有人会意外地将您的一个文本维护为“no”而不是“no”,或者以其他方式吞食您的源代码。这在旧系统上可能是一个真正的问题,旧系统假设用户及其连接的终端使用大写/小写

  • 没有人能把“鲍勃”移到你的旗帜上,因为你没有给它起名字,而是让它成为填充物。他们必须不厌其烦地分配给该变量,而不是使用条件名称。如果他们有能力走那么远的路,他们就有能力知道为什么他们不应该这样做

  • 它为循环控制和文件控制检查提供有意义的名称。诚然,ARE-THERE-MORE-RECORDS‘YES’/‘NO’是非常有意义的,但在真正的生产代码中,您会遇到许多不同的情况,它们背后往往有不寻常的名称和扭曲的逻辑,有时‘YES’/‘NO’并不是很清楚。对于跟随您进行维护的程序员来说,给出一个30个字符长的好条件名称要容易得多

您要做的另一件事是使用段落编号系统。这是一个很糟糕的想法,当你拥有的所有文档都是图表流程图,而源代码管理在任何人眼里都不是一个闪光点的时候

100-MAIN.
200-PROCESS-ONE-RECORD.
它实际上并没有给你买任何东西,它也有一些缺点

使用现代的源代码管理,对所有其他段落编号的更改与您正在进行的特定更改不相关,这些更改将非常突出。(假设有人在逻辑发生变化时对段落重新编号,但他们从未这样做)

它鼓励
  100-Read-File
  200-Read-File
  300-Read-File
  110-Write-File
  210-Write-File
  310-Write-File
  Read-Master-File
  Read-Transaction-File
  Write-Master-File
  Write-Transaction-File
  Write-Log-File