Cobol 为小于指定长度的PIC子句赋值
我是COBOL的初学者,我想知道如果我做了以下事情会发生什么:Cobol 为小于指定长度的PIC子句赋值,cobol,mainframe,Cobol,Mainframe,我是COBOL的初学者,我想知道如果我做了以下事情会发生什么: (我知道下面的代码不是可运行的cobol,例如它就在那里) 01 ZIP-RECORD. 02 ZIP PIC X(5). 88 DONE VALUE 'done ', 'qu
(我知道下面的代码不是可运行的cobol,例如它就在那里)
01 ZIP-RECORD. 02 ZIP PIC X(5). 88 DONE VALUE 'done ', 'quit ', 'stop '. 用户输入的字符串长度仅为3个字符(例如yes) foo的价值仅仅是“是”吗?或者它会按照创建时指定的方式填充所有5个字符(例如:“(空格)(空格)yes)”或“yes(空格)(空格)”,还是其他字符 01 ZIP-RECORD. 02 ZIP PIC X(5). 88 DONE VALUE 'done ', 'quit ', 'stop '. 谢谢 01 ZIP-RECORD. 02 ZIP PIC X(5). 88 DONE VALUE 'done ', 'quit ', 'stop '. 这是我的密码
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.
01 ZIP-RECORD.
02 ZIP PIC X(5).
88 DONE VALUE 'done ',
'quit ',
'stop '.
我试图在zcity之前编写zstate,只要输入未“完成”,它就会不断询问邮政编码。输入的前5个字符将移动到FOO。如果输入的字符少于5个,则它们将被放置在FOO的左侧位置,其余字符(右侧)将被放置将用空格填充。如果用户输入的字符超过5个,则仅移动前5个字符 01 ZIP-RECORD. 02 ZIP PIC X(5). 88 DONE VALUE 'done ', 'quit ', 'stop '. 因此,以您的示例为例,如果用户键入“yes”,那么FOO将包含“yesbb” 01 ZIP-RECORD. 02 ZIP PIC X(5). 88 DONE VALUE 'done ', 'quit ', 'stop '. 最好的办法就是试试看 01 ZIP-RECORD. 02 ZIP PIC X(5). 88 DONE VALUE 'done ', 'quit ', 'stop '. 根据更新的问题进行编辑… 我认为您的问题是终止循环所需的条件设置在循环体的开头,并且 不是最后。以下是解决此问题的几种常用技术: 01 ZIP-RECORD. 02 ZIP PIC X(5). 88 DONE VALUE 'done ', 'quit ', 'stop '. 预循环读取 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 . 01 ZIP-RECORD. 02 ZIP PIC X(5). 88 DONE VALUE 'done ', 'quit ', 'stop '. 您不再需要
donevar
。请替换原始测试:
IF ZIP = DONE
01 ZIP-RECORD.
02 ZIP PIC X(5).
88 DONE VALUE 'done ',
'quit ',
'stop '.
当用户输入done
、quit
或stop
中的任何一项时,88级名称done
的计算结果为true
01 ZIP-RECORD.
02 ZIP PIC X(5).
88 DONE VALUE 'done ',
'quit ',
'stop '.
最后,我假设这只是程序的一个框架,完成的版本将检查I/O错误和错误的SQL代码
并进行基本的邮政编码验证。如果没有,你可能会遇到很多麻烦
01 ZIP-RECORD.
02 ZIP PIC X(5).
88 DONE VALUE 'done ',
'quit ',
'stop '.
COBOL标准物质
01 ZIP-RECORD.
02 ZIP PIC X(5).
88 DONE VALUE 'done ',
'quit ',
'stop '.
不幸的是,学习COBOL的最新资源很少
我想推荐的书是。
这本书提供了许多关于COBOL程序开发的例子和解释
构造很少被使用,过时或者是必需的。这是一个好消息,因为您应该使用现代COBOL开发新代码
编程技术(我继续看到许多使用前COBOL85编码实践开发的新COBOL,这很可怕)
01 ZIP-RECORD.
02 ZIP PIC X(5).
88 DONE VALUE 'done ',
'quit ',
'stop '.
开源软件
指南是。它的目标是OpenCOBOL,但是
大部分适用于任何口味的COBOL
01 ZIP-RECORD.
02 ZIP PIC X(5).
88 DONE VALUE 'done ',
'quit ',
'stop '.
最后,还有一些供应商指南和手册,其中许多可以在互联网上找到
示例和
是
免费提供。微焦点COBOL
也可以使用指南。搜索您将找到的任何内容…,作为奖励,rawrnerozero;COBOL在移动
PIC X
字符数据时具有从右到左的空格填充规则,不太常见,但在标准中定义得很好,具有高阶截断和数字零填充规则,alaPIC 9
。MOVE-123到PIC S99给出-23。我试图创建一个循环,该循环在收到输入“完成”时结束,但它通常会收到一个邮政编码。我使用执行直到循环执行zipcodelookup直到zip=donevar,其中zip是收到的输入,donevar被定义为PIC x(5)值“完成”(空格字符)“。循环不会在我键入done时结束。我的问题不在pic子句中吗?@rawrnerozero向我们展示您的代码……问题可能更多地与执行循环的编码有关。此外,请注意,出于比较目的,“done”与“done”不同。我需要将ZIP-LOOKUP中的内容插入执行循环吗?另外:您知道吗有什么好的资源可以学习更多关于cobol的知识吗?谢谢!谢谢neal,是的,这只是程序的一个框架。你对我在哪里可以阅读更多关于cobol的知识有什么建议吗?我对java和lisp有相当的了解,但我似乎还找不到一本好的cobol书籍/资源。
01 ZIP-RECORD.
02 ZIP PIC X(5).
88 DONE VALUE 'done ',
'quit ',
'stop '.