3

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

foo pic x(5)
accept foo

并且用户键入一个只有 3 个字符长的字符串(例如,是) foo 的值是否只是“是”?或者它会填充创建时指定的所有 5 个字符(例如:“(空格)(空格)是”或“是(空格)(空格)”,还是别的什么?

谢谢!

这是我的代码

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,并且只要输入未“完成”,它就会一直询问邮政编码

4

1 回答 1

4

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

因此,如果用户输入“yes”,则使用您的示例,然后 FOO 将包含“yes bb

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

编辑以响应更新的问题... 我认为您的问题是终止循环所需的条件设置在循环体的开头而不是结尾。以下是解决此问题的几种常用技术:

预循环读取

          DISPLAY '输入一个 5 位数的邮政编码'
          接受邮编
          执行 ZIP-LOOKUP 直到 ZIP = 完成。
          ...
          ...
      邮编查找。
          执行 SQL                                        
            从 ZBANK.ZIPCODE 中选择 * INTO :ZIP-RECORD   
            邮编 = :邮编                               
          结束执行。                                       
          执行打印-H1。                               
          执行打印-L1。
     * 现在获取下一个邮政编码或“完成”                    
          DISPLAY '输入一个 5 位数的邮政编码'
          接受邮编
          .

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

          执行 ZIP-LOOKUP 直到 ZIP = 完成。
          ...
          ...
      邮编查找。
          DISPLAY '输入一个 5 位数的邮政编码'
          接受邮编
          如果 ZIP NOT = 完成
             执行 SQL                                        
               从 ZBANK.ZIPCODE 中选择 * INTO :ZIP-RECORD   
               邮编 = :邮编                               
             结束执行                                      
            执行打印-H1                               
            执行打印-L1
          万一
          .

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

          DISPLAY '输入一个 5 位数的邮政编码'
          接受邮编
          执行直到 ZIP = 完成
             执行 SQL                                        
                  从 ZBANK.ZIPCODE 中选择 * INTO :ZIP-RECORD   
             邮编 = :邮编                               
             结束执行                                       
             执行打印-H1                              
             执行打印-L1
             DISPLAY '输入一个 5 位数的邮政编码'
             接受邮编
          最终执行
          .

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

您可以在这里使用的另一个 COBOL 构造是88 LEVEL. 您可以按如下方式使用它:

        01 邮编记录。                                      
           02 邮编图片 X(5)。
              88 完成值“完成”。
        ...
        ...

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

                 
        如果邮编 = 完成

和:

                 
        如果完成

ZIP只要变量包含值“done bb ” ,上述情况就会成立。这样做的一个好处(除了保存一个变量声明)是可以为一个88 LEVEL名称分配多个值,如下所示:

        01 邮编记录。                                      
           02 邮编图片 X(5)。
              88 完成值'完成',
                                       '退出 ',
                                       '停止 '。

当用户输入任何一个donequitstop88 级名称DONE评估为真。

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

COBOL 参考资料

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

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

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

于 2013-10-23T13:55:50.037 回答