第3章常用语句.docx
- 文档编号:18508943
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:26
- 大小:37.94KB
第3章常用语句.docx
《第3章常用语句.docx》由会员分享,可在线阅读,更多相关《第3章常用语句.docx(26页珍藏版)》请在冰点文库上搜索。
第3章常用语句
第3章常用语句
COBOL程序的源代码主要是由各条具有一定功能的COBOL语句所组成的。
在全体COBOL语句中,其中有几条属于常用的COBOL语句。
这几条常用语句将贯穿于COBOL的各部分具体应用之中,因此本章首先对其进行讲解。
3.1MOVE语句
MOVE语句可以说是整个COBOL程序中最常用到的语句。
通过MOVE语句的复制操作,可以实现变量赋值、参数传递等多项类似的功能。
同时,MOVE语句既可对单个数据项进行复制,也可对一组数据进行复制。
下面分别予以讲解。
3.1.1复制单个数据项
复制单个数据项是MOVE语句最基本的操作。
当复制单个数据项时,直接将源数据项名称放在前面,将目标数据项名称放在后面。
两者之间通过“TO”进行连接。
例如,假设某程序中所定义的各项数据如下。
01IN-STATUSPICX(5).
01IN-GRP.
05IN-DATA1PICX(4).
05IN-DATA2PIC9(3).
01OUT-STATUSPICX(5).
01OUT-GRP.
05OUT-DATA1PICX(4).
05OUT-DATA2PIC9(3).
将以上数据作为示例数据,下面为通过MOVE语句对其中部分数据进行赋值的代码。
MOVE‘READY’TOIN-STATUS.
MOVE‘TEST’TOIN-DATA1.
MOVE0TOIN-DATA2.
MOVESPACESTOOUT-STATUS
OUT-DATA1.
MOVEZEROTOOUT-DATA2.
以下代码则通过MOVE语句实现了各变量之间的数据复制操作。
MOVEIN-STATUSTOOUT-STATUS.
MOVEIN-DATA1TOOUT-DATA1.
MOVEIN-DATA2TOOUT-DATA2.
此外需要注意的是,当进行复制操作的两个数据项名称相同时,需要指定各数据项所在的数据组名。
数据组名即各数据项所在的01级数据名。
例如,假设在某程序中定义有以下数据。
01SRC-GRP.
05TEST-DATA1PICXX.
05TEST-DATA2PIC9.
01DES-GRP.
05TEST-DATA1PICXX.
05TEST-DATA2PIC9.
此处需要将SRC-GRP所包含的的两个数据项中的内容分别复制到DES-GRP下的两数据项中。
注意到这两组数据项的名称分别对应相同,因此完成此项操作需要通过如下代码进行。
MOVETEST-DATA1INSRC-GRP
TOTEST-DATA1INDES-GRP.
MOVETEST-DATA2INSRC-GRP
TOTEST-DATA2INDES-GRP.
3.1.2复制不同类型和长度的单个数据项
当复制单个数据项时,源数据项和目标数据项的类型和长度也可不同。
其中关于数据项的类型,在通常情况下,有以下两条规律。
❑任何类型的数据都可复制到字符型数据变量中。
❑数值型数据可复制到任何类型的数据变量中。
此处只需关注MOVE语句的用法,关于数据类型,将在下一章中详细讲解。
以下代码反映了通过MOVE语句复制不同类型数据项的情况。
IDENTIFICATIONDIVISION.
PROGRAM-ID.DIFFER-TYPE.
AUTHER.XXX.
*
ENVIRONMENTDIVISION.
*
DATADIVISION.
WORKING-STORAGESECTION.
01CHAR-DATAPICX(5).
01INT-DATAPIC9(5).
01EDIT-DATAPIC$$$999.
*
PROCEDUREDIVISION.
……
MOVEINT-DATATOCHAR-DATA..
MOVEEDIT-DATATOCHAR-DATA.
MOVEINT-DATATOEDIT-DATA.
STOPRUN.
关于数据项的长度,对于不同的数据类型而言情况是不同的。
当所复制的对象为字符型数据时,将按照从左至右的顺序依次对逐个字符进行复制。
此时,当源数据项和目标数据项的长度不一致时,将分以下两种情况进行处理。
❑如果目标数据项的长度大于源数据项内容的长度,则在目标数据项的右边以空格填充。
❑如果目标数据项的长度小于源数据项内容的长度,则对右边超出的部分进行截断。
以下代码反映了通过MOVE语句复制不同长度字符型数据项的情况。
IDENTIFICATIONDIVISION.
PROGRAM-ID.DIFFER-LEN1.
AUTHER.XXX.
*
ENVIRONMENTDIVISION.
*
DATADIVISION.
WORKING-STORAGESECTION.
01SOURCE-CHARPICX(5).
01SHORT-CHARPICX(3).
01LONG-CHARPICX(7).
*
PROCEDUREDIVISION.
……
MOVE‘ABCDE’TOSOURCE-CHAR.
MOVESOURCE-CHARTOSHORT-CHAR.
MOVESOURCE-CHARTOLONG-DATA.
STOPRUN.
则以上代码执行后,其中的各项数据内容将如下。
SOURCE-CHAR:
‘ABCDE’
SHORT-CHAR:
‘ABC’
LONG-CHAR:
‘ABCDE__’/*此处下划线代表空格*/
当所复制的对象为数值型数据时,将根据其实际所代表的数值进行复制。
此时,当源数据项和目标数据项的长度不一致时,将分以下几种情况进行处理。
❑如果目标数据项的长度大于源数据项内容的长度,则在目标数据项的高位以0填充。
❑如果目标数据项的长度小于源数据项内容的长度,则对高位超出的部分进行截断。
❑如果数值含有小数部分,则需要将其作为浮点数进行相应处理。
以下代码反映了通过MOVE语句复制不同长度数值型数据项的情况。
IDENTIFICATIONDIVISION.
PROGRAM-ID.DIFFER-LEN2.
AUTHER.XXX.
*
ENVIRONMENTDIVISION.
*
DATADIVISION.
WORKING-STORAGESECTION.
01SOURCE-NUMPIC9(5).
01SHORT-NUMPIC9(3).
01LONG-NUMPIC9(7).
01FLOAT-NUMPIC9(3)V99.
01FLOAT-NUM01PIC9(5)V9(3).
01FLOAT-NUM02PIC99V9.
*
PROCEDUREDIVISION.
……
MOVE12345TOSOURCE-NUM.
MOVESOURCE-NUMTOSHORT-NUM.
MOVESOURCE-NUMTOLONG-NUM.
MOVESOURCE-NUMTOFLOAT-NUM.
MOVE123.45TOFLOAT-NUM01.
MOVE123.45TOFLOAT-NUM02.
STOPRUN.
则以上代码执行后,其中的各项数据内容将如下。
SOURCE-NUM:
12345
SHORT-NUM:
345
LONG-NUM:
0012345
FLOAT-NUM:
345^00/*此处“^”符号表示虚拟小数点位置*/
FLOAT-NUM01:
00123^450
FLOAT-NUM02:
23.4
3.1.3复制一组数据
通过MOVE语句也可对一组数据进行复制。
当对一组数据进行复制时,MOVE语句中的两个变量分别为数据组的名称,即01层数据项的名称。
这两个01层数据项下所有同名的组内数据项将实现复制。
对于一组数据的复制,主要有以下几点需要注意。
❑所复制的组内数据项必须同名,不同名的数据项将不被复制。
❑如果数据项在分组中,则分组名称也必须相同。
❑数据项在组内的顺序可以任意。
❑以FILLER命名的数据项将不被复制。
例如,以下为在COBOL数据部中定义的两组数据。
为针对所讨论的问题,此处只给出数据层级和名称,而暂不考虑通过PIC语句定义的数据类型和长度。
这两组数据分别如下。
01IN-RECORD./*以下为定义的第一组数据*/
05COURSE-INFO.
10COR-NO.
10COR-NAME.
10COR-FEE.
05COURSE-LIST.
10C-COBOL.
10C-JCL.
10C-DB2.
10C-CICS.
……
01DETAIL-LINE./*以下为定义的第二组数据*/
05COURSE-LIST.
10C-COBOL.
10C-JCL.
10C-IMS.
05C-CICS.
05COR-INFO.
10COR-NO.
10COR-NAME.
10COR-FEE.
对于以上定义的两组数据,可以使用如下MOVE语句进行复制。
MOVEIN-RECORDTODETAIL-LINE.
需要注意的是,根据前面讲解的组数据复制的基本原则,并非组内所有的数据都会被复制。
在IN-RECORD组中,有以下几个数据项将不被复制。
COURSE-INFO下的3个数据项都不会被复制。
因为IN-RECORD组中的COURSE-INFO与DETAIL-LINE组中的COR-INFO名字并不相同。
当上层分组名称不同时,即使分组内数据项名称相同,该数据项也不被复制。
C-DB2将不被复制。
因为DETAIL-LINE组中的相应位置为C-IMS,同C-DB2名称并不相同,因此不能进行复制。
C-CICS将不被复制。
因为C-CICS在IN-RECORD组中属于分组COURSE-LIST下的数据项。
而在DETAIL-LINE组中,该数据项为一个独立的数据项,不属于任何分组。
3.2PERFORM语句
PERFORM语句用于执行在COBOL中所编写的相应处理过程。
这些处理过程通常在程序最后进行编写,且每一处理过程都有一个惟一的处理过程名。
处理过程相当于COBOL中的函数,而PERFORM语句则用于调用这些函数。
例如,假设以下程序在过程部中存在两段相同的使用MOVE语句进行复制操作的代码。
在程序中并未使用PERFORM语句,相应代码如下。
IDENTIFICATIONDIVISION.
PROGRAM-ID.NO-PERFORM.
AUTHER.XXX.
*
ENVIRONMENTDIVISION.
*
DATADIVISION.
WORKING-STORAGESECTION.
01IN-AREA.
05IN-DATA1PICX.
05IN-DATA2PICXX.
01R-NUMPIC9.
01SAVE-AREA.
05SAVE-REC1PICX.
05SAVE-REC2PICXX.
01S-NUMPIC9.
*
PROCEDUREDIVISION.
……
MOVEIN-DATA1TOSAVE-REC1.
MOVEIN-DATA2TOSAVE-REC2.
MOVER-NUMTOS-NUM.
……
MOVEIN-DATA1TOSAVE-REC1.
MOVEIN-DATA2TOSAVE-REC2.
MOVER-NUMTOS-NUM.
……
STOPRUN.
如果在该程序中将这部分复制代码编写为一个处理过程,放在程序最后。
这样,在程序中便可通过PERFORM语句多次调用该处理过程,以简化编码,并使程序结构清晰。
应用PERFORM语句的相应代码如下。
IDENTIFICATIONDIVISION.
PROGRAM-ID.WITH-PERFORM.
AUTHER.XXX.
*
ENVIRONMENTDIVISION.
*
DATADIVISION.
WORKING-STORAGESECTION.
01IN-AREA.
05IN-DATA1PICX.
05IN-DATA2PICXX.
01R-NUMPIC9.
01SAVE-AREA.
05SAVE-REC1PICX.
05SAVE-REC2PICXX.
01S-NUMPIC9.
*
PROCEDUREDIVISION.
……
PERFORM100-COPY-PROCESS.
……
PERFORM100-COPY-PROCESS.
……
STOPRUN.
100-COPY-PROCESS.
MOVEIN-DATA1TOSAVE-REC1.
MOVEIN-DATA2TOSAVE-REC2.
MOVER-NUMTOS-NUM.
第二段程序与第一段程序实现的功能相同。
但第二段程序通过运用PEROFRM语句,显然要比第一段程序结构要清晰,且代码编写量也较少。
在实际开发中,最好将反复用到的较长代码段都编写为处理过程,以养成良好的编程习惯。
此外,在PERFORM语句中还可通过THRU选项同时对多个处理过程进行执行。
不过通常情况下,为规范编码,此方式下最多只对两个处理过程同时执行。
并且第二个处理过程只含有一条EXIT语句。
相应代码如下。
……
PERFORM100-TEST-PROC
THRU100-END-TEST-PROC.
……
100-TEST-PROC.
dosomething.
100-END-TEST-PROC.
EXIT.
最后,根据结合PERFORM语句中不同的选项及格式,还可发展为其他几种相关语句。
这些语句包括PERFORMUNTIL语句、线上PERFORM语句、以及PERFORMVARYING语句。
其中前两种语句将在流程控制一章的循环结构中讲解。
最后一种语句将在COBOL中的表一章中讲解。
3.3ACCEPT和DISPLAY语句
ACCEPT语句和DISPLAY语句也是在COBOL中常用的两条语句。
尤其是当对程序进行调试时,这两条语句的灵活应用将在很大程度上方便调试的过程。
关于程序的调试,将在后面章节中详细讲解。
此处只重点对这两条语句本身进行讲解。
3.3.1使用ACCEPT语句接受数据
ACCEPT语句主要用于接受数据。
该语句既可接受由用户从终端输入的数据,也可接受由系统产生的相应数据。
所接受的数据将存放在COBOL数据部中所定义的相应变量之中。
例如,以下程序定义了一组变量,并通过ACCEPT语句接受用户输入的数据,存入相应变量中。
相关代码如下。
IDENTIFICATIONDIVISION.
PROGRAM-ID.ACCEPT-ONE.
AUTHER.XXX.
*
ENVIRONMENTDIVISION.
*
DATADIVISION.
WORKING-STORAGESECTION.
01INPUT-AREA.
05IN-FIELD1PICX.
05IN-FIELD2PICXX.
05IN-FIELD3PIC9.
……
*
PROCEDUREDIVISION.
……
ACCEPTIN-FIELD1.
……
ACCEPTIN-FIELD2.
……
ACCEPTIN-FIELD3.
STOPRUN.
当用户从终端(键盘)上输入数据时,这些数据将直接通过ACCEPT语句保存到相应变量中。
由于实际输入数据通常是以文件形式存放的,因此这种方式通常只用于输入少量的控制或调试信息。
使用ACCEPT语句接受系统数据通常主要为接受系统相应的日期或时间数据。
这些数据主要包括如下几种。
❑DATE:
对应按月份计算的日期,数据格式为yymmdd。
其中yy代表年份,mm代表月份,dd代表该月中具体的哪一天。
❑DAY:
对应按一年中绝对天数计算的日期,数据格式为yyddd。
其中yy代表年份,ddd代表该年中的绝对天数。
例如,对于平年而言,12月31日在此便通过365表示。
❑DAY-OF-WEEK:
对应一周之内的星期数。
接受数据的格式应定义为为PIC9,数值范围从1到7。
❑TIME:
对应具体的时间,格式为hhmmsshh。
其中前两个hh代表小时数,mm代表分钟数,ss代表秒数。
最后两个hh则表示hundredthsfrommidnigth。
例如,下面这段程序便首先定义了一组变量,用于保存按月份计算的日期数据。
其后再通过ACCEPT语句接受相应数据并将数据保存到该组变量中。
代码如下。
IDENTIFICATIONDIVISION.
PROGRAM-ID.ACCEPT-TWO.
AUTHER.XXX.
*
ENVIRONMENTDIVISION.
*
DATADIVISION.
WORKING-STORAGESECTION.
01TEST-DATE.
05TEST-YEARPIC99.
05TEST-MONTHPIC99.
05TEST-DAYPIC99.
……
*
PROCEDUREDIVISION.
……
ACCEPTTEST-DATEFROMDATE.
……
STOPRUN.
3.3.2使用DISPLAY语句输出数据
DISPLAY语句用于对数据实现输出操作。
在第一章中所举例的HelloWorld程序主要运用的便是DISPLAY语句。
在该程序中,DISPLAY语句用于直接输出“HelloWorld”字符数据。
同时,DISPLAY语句还可对变量进行输出,此时将输出变量中所包含的数据。
例如,以下程序将分别输出程序中所设置的变量以及从用户处所接受的变量。
IDENTIFICATIONDIVISION.
PROGRAM-ID.DISPLAY-ONE.
AUTHER.XXX.
*
ENVIRONMENTDIVISION.
*
DATADIVISION.
WORKING-STORAGESECTION.
01TEST-AREA.
05TEST-DATA1PICX(5).
05TEST-DATA2PICX(5).
*
PROCEDUREDIVISION.
MOVE‘SYS’TOTEST-DATA1.
ACCEPTTEST-DATA2.
DISPLAYTEST-DATA1.
DISPLAYTEST-DATA2.
STOPRUN.
如果用户所输入的数据为“USER”,则以上代码执行后,将有如下输出结果。
SYS
USER
使用DISPLAY语句还可同时对多项数据进行输出。
这些数据既可为由引号引用的字符(直接数),也可为包含有数据的变量。
各数据之间可以用空格或逗号隔开。
例如,以下程序将通过DISPLAY语句分别对多个数据同时进行输出。
IDENTIFICATIONDIVISION.
PROGRAM-ID.DISPLAY-TWO.
AUTHER.XXX.
*
ENVIRONMENTDIVISION.
*
DATADIVISION.
WORKING-STORAGESECTION.
01TEST-AREA.
05T-LANGPICX(10).
05T-PLATFORMPICX(10).
*
PROCEDUREDIVISION.
MOVE‘COBOL’TOT-LANG.
MOVE‘MAINFRAME’TOT-PLATFORM.
DISPLAY‘THISISABOUT:
’,T-LANG.
DISPLAYT-LANG‘ISRUNNEDON’T-PLATFORM.
STOPRUN.
以上代码执行后,将有如下输出结果。
THISISABOUTCOBOL
COBOLISRUNNEDONMAINFRAME
3.4REDEFINES语句
REDEFINES语句用于对同一块内存区域进行重定义。
也就是说,通过REDEFINES语句,可以定义多个指向同一内存区域的变量。
例如,以下程序便通过REDEFINES语句定义了3个指向同一内存区域的变量,代码如下。
IDENTIFICATIONDIVISION.
PROGRAM-ID.RE-DEF.
AUTHER.XXX.
*
ENVIRONMENTDIVISION.
*
DATADIVISION.
WORKING-STORAGESECTION.
01TEST-AREA.
05TEST-APICX(4).
05TEST-BREDEFINESTEST-A.
05TEST-CREDEFINESTEST-A.
*
PROCEDUREDIVISION.
MOVE‘TEST’TOTEST-A.
DISPLAYTEST-A.
DISPLAYTEST-B.
DISPLAYTEST-C.
STOPRUN.
以上代码执行后,将有如下输出结果。
TEST
TEST
TEST
需要注意的是,REDEFINES语句不能用于对66层,88层数据进行重定义。
同时,该语句也不能对文件节中的01层数据重定义。
不过,对于工作存储节中的01层数据则是可以重定义的。
在后面章节中,将会介绍如何通过该语句初始化COBOL中的表。
3.5文件相关语句
COBOL程序中实际用到的数据通常主要来源于文件。
此处所说的文件主要是指常规文件。
关于另一类常用的具有特殊组织结构的VSAM文件,将在后面章节中详细讲解。
和文件相关的语句,最基本是用作打开、关闭文件,以及对于文件的读写。
下面分别予以讲解。
3.5.1OPEN和CLOSE语句
OPEN语句用来实现对文件的打开操作。
在对文件进行任何处理之前,必须通过OPEN语句将其打开。
同时,OPEN语句还可指定该文件在打开后是用于输入操作还是输出操作。
例如,以下程序通过该语句实现了文件的打开操作。
IDENTIFICATIONDIVISION.
PROGRAM-ID.FILE-OPEN.
AUTHER.XXX.
*
ENVIRONMENTDIVISION.
INPUT-OUTPUTSECTION.
FILE-CONTROL.
SELECTCUSTOMER-FILE
ASSIGNTOS-SYSIN.
SELECTPRINT-FILE
ASSIGNTOS-SYSOUT.
*
DATADIVISION.
FDCUSTOMER-FILE.
……
FDPRINT-FILE.
……
*
PROCEDUREDIVISION.
OPENINPUTCUSTOMER-FILE
OUTPUTPRINT-FILE.
……
STOPRUN.
此外,OPEN语句也可用于同时打开多个用于同一操作的文件。
各文件之间可通过空格隔开。
例如,以下O
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第3章 常用语句 常用 语句