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