gpt4 book ai didi

cobol - 为小于指定长度的 PIC 子句赋值

转载 作者:行者123 更新时间:2023-12-05 03:15:18 24 4
gpt4 key购买 nike

我是 COBOL 的初学者,我想知道如果我执行以下操作会发生什么:
(我知道下面的代码不是可运行的 Cobol,例如它就在那里)

foo pic x(5)
accept foo

然后用户输入一个只有 3 个字符长的字符串(例如 yes)foo 的值(value)会只是"is"吗?或者它会填充创建时指定的所有 5 个字符(例如:“(space)(space)yes”或“yes(space)(space)”,还是其他内容?

谢谢!

这是我的代码

000100        IDENTIFICATION DIVISION.                           
000200 *--------------------
000300 PROGRAM-ID. ZIPCODES.
000400 *--------------------
000500 ENVIRONMENT DIVISION.
000600 *--------------------
000700 CONFIGURATION SECTION.
000800 INPUT-OUTPUT SECTION.
000900 FILE-CONTROL.
001000 SELECT PRT ASSIGN TO UT-S-PRTAREA.
001100
001200 DATA DIVISION.
001300 *-------------
001400 FILE SECTION.
001500 FD PRT
001600 RECORD CONTAINS 80 CHARACTERS
001700 DATA RECORD IS LINE-PRT.
001800 01 LINE-PRT PIC X(80).
001900
002000 WORKING-STORAGE SECTION.
002100 *-----------------------
002200 EXEC SQL INCLUDE SQLCA END-EXEC.
002300
002310 01 done.
002320 02 donevar PIC x(5) VALUE 'done '.
002400 01 ZIP-RECORD.
002500 02 ZIP PIC X(5).
002600 02 ZCITY PIC X(20).
002700 02 ZSTATE PIC X(2).
002800 02 ZLOCATION PIC X(35).
002900
003000 01 H1.
003100 02 COLUMN-1 PIC X(8) VALUE 'Zip-Code'.
003200 02 FILLER PIC X(2).
003300 02 COLUMN-2 PIC X(5) VALUE 'State'.
003400 02 FILLER PIC X(2).
003500 02 COLUMN-3 PIC X(4) VALUE 'City'.
003600 02 FILLER PIC X(16).
003700 02 COLUMN-4 PIC X(14) VALUE 'Location Text'.
003800 02 FILLER PIC X(29).
003900
004000 01 L1.
004100 02 ZIP-L1 PIC X(5).
004200 02 FILLER PIC X(5).
004300 02 STATE-L1 PIC X(2).
004400 02 FILLER PIC X(5).
004500 02 CITY-L1 PIC X(20).
004600 02 LOCTXT-L1 PIC X(35).
004700 02 FILLER PIC X(28).
004800
004900 PROCEDURE DIVISION.
005000 *------------------
005100 BEGIN.
005200 OPEN OUTPUT PRT.
005220 PERFORM ZIP-LOOKUP UNTIL ZIP = done.
005600 PROG-END.
005700 CLOSE PRT.
005800 GOBACK.
005900 *****************************************************
006000 * zip code lookup *
006100 *****************************************************
006200 ZIP-LOOKUP.
006300 DISPLAY 'enter 5 digit zip code'
006400 ACCEPT ZIP
006500 EXEC SQL
006600 SELECT * INTO :ZIP-RECORD FROM ZBANK.ZIPCODE
006700 WHERE ZIP = :ZIP
006800 END-EXEC.
006801 PERFORM PRINT-H1.
006802 PERFORM PRINT-L1.
006900 PRINT-H1.
007000 MOVE H1 TO LINE-PRT
007100 WRITE LINE-PRT.
007200 PRINT-L1.
007300 MOVE ZIP TO ZIP-L1
007400 MOVE ZSTATE TO STATE-L1
007500 MOVE ZCITY TO CITY-L1
007510 STRING ZSTATE DELIMITED BY " ",", ",
007520 ZCITY DELIMITED BY SIZE INTO LOCTXT-L1
007700 MOVE L1 TO LINE-PRT
007800 WRITE LINE-PRT.

我试图在 zcity 之前写 zstate,只要输入没有“完成”,它就会一直询问邮政编码

最佳答案

输入的前 5 个字符将移至 FOO。如果输入的字符少于 5 个,则将它们放在 FOO 的左侧位置,其余字符(右侧)将用空格填充。如果用户输入的字符超过 5 个,则仅移动前 5 个字符。

因此,如果用户键入“yes”,则使用您的示例,那么 FOO 将包含“yes bb

最好的办法就是尝试一下!

编辑以回应更新的问题...我认为你的问题是终止循环所需的条件是在循环体的开头设置的,并且不在最后。以下是解决此问题的一些常用技术:

预循环读取

          DISPLAY 'Enter a 5 digit zip code'          ACCEPT ZIP          PERFORM ZIP-LOOKUP UNTIL ZIP = done.          ...          ...      ZIP-LOOKUP.          EXEC SQL                                                    SELECT * INTO :ZIP-RECORD FROM ZBANK.ZIPCODE               WHERE ZIP = :ZIP                                         END-EXEC.                                                 PERFORM PRINT-H1.                                         PERFORM PRINT-L1.     *    Now get next zip code or 'done'                              DISPLAY 'Enter a 5 digit zip code'          ACCEPT ZIP          .

防止在循环内设置终止条件

          PERFORM ZIP-LOOKUP UNTIL ZIP = done.          ...          ...      ZIP-LOOKUP.          DISPLAY 'Enter a 5 digit zip code'          ACCEPT ZIP          IF ZIP NOT = DONE             EXEC SQL                                                       SELECT * INTO :ZIP-RECORD FROM ZBANK.ZIPCODE                  WHERE ZIP = :ZIP                                            END-EXEC                                                  PERFORM PRINT-H1                                           PERFORM PRINT-L1          END-IF          .

以上任一方法都可以解决您的问题。但是,我建议尝试更新您的编码风格以包括COBOL-85 构造。上面的第一个例子可以编码如下:

          DISPLAY 'Enter a 5 digit zip code'          ACCEPT ZIP          PERFORM UNTIL ZIP = done             EXEC SQL                                                          SELECT * INTO :ZIP-RECORD FROM ZBANK.ZIPCODE                WHERE ZIP = :ZIP                                            END-EXEC                                                    PERFORM PRINT-H1                                           PERFORM PRINT-L1             DISPLAY 'Enter a 5 digit zip code'             ACCEPT ZIP          END-PERFORM          .

ZIP-LOOKUP 段落已内嵌到 PERFORM 语句中。对于一小段代码,我发现这种风格更多可读。还要注意单句段落(段落末尾只有一个句点)。使用 COBOL-85 范围终止符时(例如 END-xxx)每段使用多个句子的必要性消失了 - 事实上 - 应该避免。

您可以在此处使用的另一个 COBOL 结构是 88 LEVEL。您可以按如下方式使用它:

        01 ZIP-RECORD.                                                 02 ZIP                PIC X(5).               88 DONE            VALUE 'done  '.        ...        ...

您不再需要 donevar 了。替换您的原始测试:

                         IF ZIP = DONE

与:

                         IF DONE

只要变量 ZIP 包含值“done bb ”,上述内容就会成立。的一个优势这样做(除了保存一个变量声明)是可以分配单个 88 LEVEL 名称几个值,如:

        01 ZIP-RECORD.                                                 02 ZIP                PIC X(5).               88 DONE            VALUE 'done  ',                                       'quit  ',                                       'stop  '.

当用户输入 donequitstop 中的任何一项时,88 级名称 DONE 的计算结果为是的。

最后,我认为这只是程序的框架,完成的版本将检查 I/O 错误、错误的 SQL 代码并进行基本的邮政编码验证。否则,您可能会遇到很多麻烦。

COBOL 引用资料

不幸的是,用于学习 COBOL 的最新资源非常少。然而,其中之一我推荐的书是Advanced Cobol 3rd Edition by DeWard Brown .本书提供了许多有关 COBOL 程序开发的示例和解释。它还确定是否construct 很少使用、过时或必不可少。知道这一点很好,因为您应该使用现代 COBOL 开发新代码编程技术(我继续看到许多使用 COBOL 85 之前的编码实践开发的新 COBOL - 这太可怕了)。

开源向导是OpenCOBOL Programmers Guide .这针对 OpenCOBOL 但其中大部分适用于任何风格的 COBOL。

最后,还有一些供应商指南和手册,其中许多都可以在 Internet 上找到。为了示例 Enterprise COBOL for z/OS Language ReferenceEnterprise COBOL for z/OS Programming guide是免费提供。微焦点 COBOL还提供指南。搜索任何你会发现的...

关于cobol - 为小于指定长度的 PIC 子句赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19536785/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com