IDENTIFICATION DIVISION.
PROGRAM-ID. TEST.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION
FILE-CONTRAL.
SELECT 内部文件名 ASSIGN TO 外部文件名.
/*三种用法:
SELECT FILE1 ASSIGN TO C:COB.FILE1.DAT.
SELECT FILE1 ASSIGN TO DISK.
VALUE OF FILE-ID "C:COB.FILE1.DAT".
在大型计算机系统,在SELECT子句中用该系统指定的逻辑名作为
外部文件名,然后用作业控制语句将该逻辑名与实际的设备和文
件相联系。
*/
//例子程序:
IDENTIFICATION DIVISION.
PROGRAM-ID. MX.
AUTHOR. MX.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-390.
OBJECT-COMPUTER. IBM-390.
INPUT-OUTPUT SECTION.
FILE CONTROL.
SELECT XYZ ASSIGN TO CRRDIN
FILE STATUS IS MASTER-CHECK-KEY.
DATA DIVISION.
FILE SECTION.
FD XUY
PPT 第二章 JCL 重点
/*数据部作用
数据部的作用是定义数据项属性,描述数据结构。所有在过程部中出现的
数据项都必须在数据部中对它们的属性进行说明。包括数据项的类型,数
据项间的关系,记录与文件的关系,文件的属性。
*/
DATA DIVISION.
FILE SECTION.
//用来描述程序中用到的输入文件和输出文件及其记录中各数据项的属性。
WORKING-STORAGE SECTION.
//用来描述程序中用到的中间数据项。
LINKAGE SECTION.
//用来描述与调用程序间发生数据传递的数据项。
REPORT SECTION.
//为了完成报表编制功能,此节用来规定欲输出的报表的“体裁“,设计各报
//表栏的打印形式和方法等
/*例子程序:
你的公司有一份人员文件,包括公司所有员工的编号和雇佣日期,日期是以
YYYYMMDD的形式存放。客户要求你提供一份员工信息报表给他,需要列出所
有员工的编号和雇佣日期,日期以MM/DD/YYYY的形式显示出来
*/
IDENTIFICATION DIVISION.
PROGRAM-ID. EXAMPLE.
AUTHOR. MX.
SECURITY. NONE.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-390.
OBJECT-COMPUTER. IBM-390.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT FPERSNNL ASSIGN TO PERSNNL.
SELECT FLISTING ASSIGN TO LISTING.
DATA DIVISON.
FILE SECTION.
/*
程序中每一个输入或输出文件都要在文件节中加以描述。描述的内容包括:
1)文件名和文件属性。
2)文件中包括的记录的名字。
3)每个记录中数据的层次关系。
4)记录中各数据项的数据形式和占内存的大小。
*/
FD FPERSNNL
01 FPERSNNL-RECORD PIC X(80).
FD FLISTING
01 LIST-LINE PIC X(80).
WORKING-STORAGE SECTION.
01 PERSNNL-LAYOUT.
05 IN-EMPLOYEE-NO PIC 9(5).
05 IN-HIRE-DATA.
10 IN-HIRE-YR PIC 9(4) VALUE ZERO.
10 IN-HIRE-MO PIC 99 VALUE ZERO.
10 IN-HIRE-DA PIC 99 VALUE ZERO.
05 FILLER PIC X(67).
01 EOF-FLAG PIC X VALUE SPACE.
88 END-OF-FILE PIC X VALUE 'Y'.
88 NOT-END-OF-FILE PIC X VALUE ' '.
01 DETAIL-L.
05 OUT-EMPL-NUM PIC 9(5) VALUE ZERO.
05 FILLER PIC X(5) VALUE SPACES.
05 OUT-HIRE-DATE.
10 OUT-HIRE-MM PIC 99 VALUE ZERO.
10 PIC X VALUE ‘/’.
10 OUT-HIRE-DD PIC 99 VALUE ZERO.
10 PIC X VALUE ‘/’.
10 OUT-HIRE-YYYY PIC 9(4) VALUE ZERO.
05 FILLER PIC X(56) VALUE SPACES.
PROCEDURE DIVISION.
OPEN INPUT FPERSNNL OUTPUT FLISTING.
READ FPERSNNL INTO PERSNNL-LAYOUT AT
END SET END-OF-FILE TO TRUE.
PERFORM UNTIL END-OF-FILE
MOVE IN-EMPLOYEE-NO TO OUT-EMPL-NUM
MOVE IN-HIRE-YY TO OUT-HIRE-YYYY
MOVE IN-HIRE-MO TO OUT-HIRE-MM
MOVE IN-HIRE-DA TO OUT-HIRE-DD
WRITE LIST-LINE FROM DETAIL-L
END-PERFORM
CLOSE PERSNNL LISTING.
/*
文件节例子程序
*/
DATA DIVISION.
FILE SECTION.
FD XYZ
LABEL RECORD IS STANDARD
DATA RECORDS ARE T,Y.
/*
1.数值型数据的描述
‘9’描述符
(1)在数值型数据项中只能放数字不能放空格。
(2)用‘9’描述符只能表示整数,如输入小数部分,则小数部分被舍弃
(3)如送入一个负数,则负号被舍弃。 MOVE –123.4 TO A. A = 123
‘V’描述符
(1)V在描述符的最后,则等于无小数点。
(2)一个数据的描述符中只能出现一个V。
(3)进行数据传送或运算时,按隐含的小数点位置对准进行传送或运算。
(4)V表示的小数点只在传送或运算时起作用,不能被显示或打印出来。
‘S’描述符:符号
(1)S描述符必须是最左边的一个描述符。03 M PIC S9(3)V9(2).
(2)在内存中,S不占位数,在传送或运算时起作用
ppt第22页??问题 B?C?D?
2.字母型数据的描述
‘A’描述符
3.字符型书单的描述:
‘X'描述符: 不能用于计算
4.编辑型描述符 编辑型数据项只是作为输出数据时增加或改变某些所需的符号,起
编辑作用,它不是作计算用的。
(1). 插入小数点‘.’,用‘.’描述符。如:
77 B PIC 99.9
(2). 插入逗号‘,’作分位号,用‘,’描述符。如:
02 B PIC 9,9.9
(3). 插入空格,用‘B’描述符。如:
02 A PIC B9(3)B
(4). 插入正负号,用‘+’或‘-’描述符。如:
02 A1 PIC +9(3)
02 A2 PIC -9(3)
注意:描述符‘+’,一律加符号。描述符‘-’只对负值加负号。
(5). 插入‘$’ 。如:
02 A PIC 9V99
02 B PIC +$9.99
(6).浮动插入正负号和‘$’
02 A1 PIC $$9.99.
02 A2 PIC $$$.$$.
02 B1 PIC ++9.99.
02 B2 PIC +++.++.
(7).取消高位零,用‘Z’和‘*’描述符。在高位零的位置上代以空格或‘*’。如:
02 A PIC 9(4)V9
02 B PIC Z(4).9
02 C PIC *(4).9
(8).插入‘DB’(debit)和‘CR’(credit)字符。DB和CR只能用作固定插入,当数值为负时,
在编辑型数据项中最后两个字节中置DB或CR,数值为正时,此两字节留空格。如:
02 A1 PIC $9.9DB
02 A2 PIC $9.9CR。
*/
/*
工作单元节
作用:程序中用的数据项分为两部分,一部分是属于输入或输出文件的,另一部分是非输入
或输出的数据。如一些中间变量或用作累计的数据项等。非输入输出的数据就应在工作单元
节中描述。
在工作单元节中描述的数据项也有有两种形式:一种是孤立的数据项,它们是初等项。一种
是组合项。COBOL规定,孤立的数据项的描述体以层号77开头,组合项描述体以01到49之间的
一个数作层号。在次序上常先写77层,再写01-49层。
*/
WORKING-STORAGE SECTION
77 A PIC XX.
77 B PIC 99.
01 T.
02 T1.
03 T11 PIC XX.
03 T12 PIC 99.
02 T2 PIC 999.
/*
1.VALUE字句:用于给变量赋初值
02 A PIC 9(3) VALUE 123.
注意:
(1)只有对工作单元节中的数据项才能赋初值,不能对文件节中输入输出文件中的数据项赋初值。
(2)如果在组合项的描述体中使用VALUE,初值只能是表意常量或非数值型常量。对组合项整体而
言,一律按字符型数据项处理。
02 A VALUE ‘123456’.
03 A1 PIC 99. (12)
03 A2 PIC 99. (34)
03 A3 PIC 99. (56)
是可以的,并且A1,A2,A3可以进行运算。
但如果 02 A VALUE 123456. 则是错误的。
(3)当用一个带符号的数值作初值时,相应的PIC子句中应有‘S’描述符,否则符号无效。
77 D PIC S99 VALUE -21.
(4)赋初值时应该注意类型的一致性。
77 D PIC X(4) VALUE 1.22 (错误)
(5)VALUE子句给出的值应适合PIC子句的描述范围,否则会出现截断或产生错误。
2.数值型数据在内存中的存储形式:
(1)外部十进制(扩张十进制) 按每个数值位表示数值
77 C PIC 9(3) VALUE 486.
其在内存中占3个字节。则在主机系统内存中的实际内容如下
11110100 11111000 11110110
‘4’ ‘8’ ‘6’
如果数据项D描述如下(负值)
77 D PIC S9(3) VALUE -486.
11110100 11111000 11010110
主机系统用‘C’(1100)和‘F’(1111)表示正数,‘D’(1101)表示负数
(2)外部浮点数形式:
77 A PIC +9.99999E+99.
数符 数值部分 E 阶码符 阶码
对外部浮点数不能用VALUE子句赋初值,而应该从外部读入或者在程序中用MOVE语句传值
(3)内部十进制
前四位不起辨识作用,可以只用四位来表示。即每个字放2个十进制数。符号也占半个字。
所谓内部十进制就是压缩式的外部十进制
(4)定点二进制
简单的说就是不是一个一一对应的关系,而是把整数直接存储为二进制数。例如
10存储为1010
(5)内部浮点形式
短浮点:
4个字节(32位)表示一个数,阶码(指数)为8位,尾数为24位。
长浮点:
8个字节(64位)表示一个数,阶码(指数)为8位,尾数为56位。
数据描述与存储形式的关系
(一)字母型、字符型、编辑型、外部十进制数据和外部浮点形式表示
的数据用标准数据形式存放,即一个字符占一个字节。
(二)数值型数据可以由程序员任意选定存放形式。
(三)数据在计算机内进行运算,都是化成二进制以后再进行运算。
3.用法子句:
作用:可以使程序设计者自由选择数据在内存中的存放形式。
格式:
[USAGE IS] DISPLAY/COMPUTATIONAL/COMP
说明:
DISPLAY (标准数据形式,一个字节放一个字符)
COMPUTATIONAL (定点二进制形式)
/COMP
COMPUTATIONAL-1 (内部短浮点形式)
/COMP-1
COMPUTATIONAL-2 (内部长浮点形式)
/COMP-2
COMPUTATIONAL-3 (内部十进制形式)
/COMP-3
如省略USAGE子句,则隐含表示为用DISPLAY形式。
字符型、字母型、编辑型、外部十进制、外部浮点数形式的数据项必须为USAGE DISPLAY
(一般均省略该子句)
如果对组合项描述为某一种存储形式,则表示这个组合项的下属各初等项都是这种形式,如:
01 T.
02 T1 USAGE COMP.
03 X PIC S9(3).
03 Y PIC S9(3).
相当于
01 T.
02 T1.
03 X PIC S9(3) USAGE COMP.
03 Y PIC S9(3) USAGE COMP.
USAGE子句指定的数据存储形式不能和PIC子句指定的数据类型矛盾。
以下为错误用法
04 A PIC A(4) USAGE COMP.
04 B PIC $99.99 COMP-1.
长、短浮点数形式自然确定了内存长度,不应用PIC子句
01 A1 COMP-1.
01 B1 COMP-2.
在传送或运算时不同存储形式的数值型数据间可互相转换。
如:
77 A PIC 9(3) COMP.
77 B PIC 999V99 DISPLAY.
如果有如下语句:
MOVE A TO B.
则先将A转换成B的形式再存入B
ADD A TO B.
也由编译系统先进行转换,然后按B的形式将结果存入B。
在用DISPLAY语句显示数据项的内容,如果数据项不是指定的DISPLAY,则在显示前,
计算机自动将内存中数据形式转换成EBCDIC码(或者ASCII),然后再显示.
如果用WRITE语句,则直接输出,不进行转换。
4.符号字句(SIGN子句)
SIGN子句用来指定数值型数据描述体中运算符号的状态和位置
(一)在没有SIGN子句时,数值的符号是存放在数据项最近最后一个字节
如+012的显示型数据,内存中为 F0 F1 C2
(二)用SIGN子句可以指定符号在数值的前部还是后部
02 A PIC S9(3) USAGE DISPLAY SIGN IS LEADING.
C0 F1 F2
02 A PIC S9(3) USAGE DISPLAY SIGN IS TRAILING.
F0 F1 C2
02 A PIC S9(3) USAGE DISPLAY
二者相同,缺省符号在后
(三)指定符号单多占一个字节,用SEPARATE
02 A PIC S9(3) USAGE IS DISPLAY SIGN IS
TRAILING SEPARATE.(+12)
只能用于PIC字符串中含有“S”的数值型描述体中
使用SIGN子句的数据项用法应当是USAGE DIPLAY。而不能用于计算型的数据项
如果一个数据项的描述体中包含SIGN子句,则数据项的值应包括正或者负的符号,否则会出错
PPT 第67页问题??
5.重定义子句 REDEFINES
作用:不同的数据项可以共用内存中的同一段空间。例如已给数据项A分配了一段内存空间,在经
过某一段的过程后,A已经不再使用了,但它仍占着内存这部分空间,为了节约内存,可以将另一
数据项B也分配在A所占的这段内存空间。
格式:层号 数据名1 REDEFINES 数据名2
举例:02 A PIC X(5).
02 B REDEFINES A PIC 9(5).
组合项的重定义子句,如:
02 A.
03 A1 PIC 9(4).
03 A2 PIC X(6). 共14字节
03 A3 PIC X(4).
02 B REDEFINES A.
03 B1 PIC X(5).
03 B2 PIC 9(6). 共14字节
03 B3 PIC 99V9.
(1)数据名2 与数据名1的层号必须相同。
(2)用REDEFINES子句的描述体应该紧跟在被重新定义的数据项的描述之后,中间不能插入其它项的描述说明。
(3)可以多次重定义,但必须紧跟出现,而且要求使用最初定义的数据名。
(4)REDEFINES子句不能用于文件节的01层中。
(5)用REDEFINES子句可以改变数据结构,但数据名1、2的长度应该相等。
(6)REDEFINES子句应在其它子句之前。
(7)重定义子句所在的数据描述体中不能使用初值子句赋初值。.
6.重命名子句 RENAMES子句
REDEFINES子句——不改变数据项长度的前提下,重新定义数据区的名称和数据结构的形式;
RENAMES子句——将原来已定义的数据项重新组合成为一个新项,并以一个新名字来代表它。
RENAMES子句不能改变原来各初等项的类型、长度等属性。
格式:66 数据名1 RENAMES 数据名2 [THRU 数据名3]
(一)层号只能用66,它必须紧跟在01层记录中最后一个数据描述体之后,因为它是对记录中有关部分重新组合和命名的。
(二)如无THRU部分,则数据名1和数据名2代表的是同一内容。
(三)用THRU时,数据名2在记录中的位置应在数据名3之前,而且数据名3不应包括在数据名2之中。
(四)RENAMES子句只能用于工作单元节,而不能用于文件节。
7.遇零置空子句(BLANK子句)
作用:当数据项的值为零时,使它的内容改变为空白(空格)。这个子句只能用于数值型或编辑型的初等项。
举例:03 A PIC 9999 BLANK WHEN ZERO.
若同一个描述项中用了“*”来代替高位0,又有BLANK WHEN ZERO子句,则BLANK WHEN ZERO子句不起作用
8.对齐子句(JUSTIFIED子句)
作用:字符或字母型数据传送的时候是按标准的对齐方式,即“左对齐”,若想改为“右对齐”,可以用JUSTIFIED子句。
格式:JUSTIFIED/JUST RIGHT
举例:77 B PIC X(5) JUSTIFIED RIGHT
9.同步安置子句(SYNCHRONIZED子句)
作用:一个机器字一般定为4个字节,从内存中取数据的时候是以机器字为单位的,而数据存放则是按字节连续
存放的,这里面就存在一个边界对齐的矛盾,会影响目标程序运行时间。用同步安置子句可以指定数据项在内存
中如何按自然边界来安置。
格式:SYNCHRONIZED/SYNC LEFT/RIGHT
说明:1.用SYNC LEFT时,左对齐,右边补零或空格。
2.用SYNC RIGHT时,右对齐,左边补零或空格。
10.复写语句(COPY语句)
作用:把“源程序库”中的某些记录描述和数据描述插入到自己的源程序中。
格式:COPY 库名 [REPLACING 标识符1/常量1/字1 BY 标识符2/常量2/字2]
*/
/*
过程部是程序中的第四部分,它以部头PROCEDURE DIVISION开头。部头从A区(第8—11列)
开始书写。
过程部的语句一律从B区开始书写.即从12列以后开始书写。一个语句可以任意写在一行或几行上。续行也应从B区开始。
*/
PROCEDURE DIVISION.
A SECTION.
A1. MOVE 1 TO I
MOVE 2 TO J.
A2. ADD I TO J.
B SECTION.
/*
一.输入输出语句:
1.ACCEPT语句:直接从终端键盘或系统指定的输入设备上输入数据
ACCEPT 标识符 [FROM 助记名]
标识符(identifier)指的是能唯一地标识一个数据项的数据名,不能唯一地标识一个数据项的数据名不是标识符。
标识符可以是组合项。
在ACCEPT语句中如不写FROM部分,如ACCEPT A ,则表示从系统隐含指定的设备上读入一个数据给A。 如果不想从指定的设 备上输入,则要用FROM 选项, 这时“助忆名”需要在环境部中事先说明和那种外部设备相联系。如:
ENVIRONMENT DIVISION。(环境部)
CONFIGRATION SECTION。(配置节)
SPECIAL-NAMES.(专用名段)
CONSOLE IS ABC
如在过程部中有 ACCEPT T FROM ABC。 则表示要从控制台接收数据
2.DISPLAY语句:从计算机内存中输出到某一指定的输出设备上。
DISPLAY { 标识符1,常量1}[标识符2,常量2]…[UPON 助忆名]
( 标识符和助忆名的说明同上)
ACCEPT语句和DISPLAY语句不必定义文件,适用于少量的数据输入输出。
IDENTIFICATION DIVISION.
PROGRAM-ID. EXAMPLE.
ENVIRONMENT DIVISION.
SPECIAL-NAMES.
CONSOLE IS ABC.
DATA DIVISION.
PROCEDURE DIVISION.
DISPLAY 'HELLO' UPON ABC.
STOP RUN.
3.读语句READ
READ 文件名
READ IN-FILE
其中IN-FILE为内部文件名,它在环境部中和外部文件相关联
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE ASSIGN TO ':D:/COBOL_S/A.TXT'
在READ中操作的对象是文件。以文件为对象,以记录为单位。每执行一次,只是读入一个记录,而非整个文件
(不理解)应在计算机内存中专门开辟一个存储区来存放读入信息
DATA DIVISION.
FILE SECTION.
FD IN-FILE LABEL RECORD IS STANDARD.
01 IN-RECORD.
02 A1 PIC 9(6).
02 A2 PIC 9(3).
02 NAME PIC X(32).
文件读完时的处理
READ IN-FILE AT END STOP RUN.
例如:
READING-DATA.
READ IN-FILE
AT END DISPLAY TOTAL STOP RUN.
ADD QUANTITY TO TOTAL.
GO TO READING-DATA.
可以用一个READ语句读入一个记录并立即将记录转送到另外一个记录中去
READ IN-FILE INTO T AT END STOP RUN.
相当于:
READ IN-FILE AT END STOP RUN.
MOVE IN-RECORD TO T.
READ 语句的一般格式
READ 文件名 RECORD [INTO 标识符] [; AT END 执行语句]
[END-READ]
4、写语句WRITE
WRITE语句将数据输出到外部设备。形成打印文件或者磁盘文件。环境部定义文件——内部文件名和外部文件名
注意:WRITE语句中操作对象是记录:WRITE T. 表示将输出记录区T中的内容写到与T对应的文件中去
输出设备的选择:
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT OUTPUT-FILE ASSIGN TO 'D:/COBOL_S/A.TXT'.
将内存区中的数据输出到外部设备,主要由WRITE语句来完成,与输入文件相仿,
输出文件也在内存区开辟一个输出记录区,其中AFTER表示先移后打印,BEFORE表示先打后移。
定义输出记录区
DATA DIVISION.
FILE SECTION.
FD OUTPUT-FILE LABEL RECORD IS STANDARD.
01 OUTPUT-RECORD.
02 DATE-OUT.
03 YEAR PIC 99.
03 MONTH PIC 99.
03 DAYY PIC 99.
02 PRODUCT-CODE PIC 9(4).
…
02 TOTAL PIC 9(4).
在用WRITE语句输出一个输出记录前,应当向该记录区传送数据。
MOVE T1 TO OUTPUT-RECORD.
WRITE OUTPUT-RECORD.
MOVE T2 TO OUTPUT-RECORD.
WRITE OUTPUT-RECORD.
可以用一个WRITE语句先把内存区中另一数据项的内容送给要输出的记录区,然后再输出。
WRITE OUTPUT-RECORD FROM T1 AFTER 3.
相当于
MOVE T1 TO OUTPUT-RECORD.
WRITE OUTPUT-RECORD AFTER 3.
5.OPEN语句:程序中如果需要读写文件,则该文件必须先用OPEN语句打开,系统在执行READ,
WRITE以前先检查该文件是否已在规定的外部设备上准备就绪。
OPEN语句的一般格式为:
OPEN INPUT 文件名1 [,文件名2]…
OUTPUT 文件名3 [,文件名4]…
6.CLOSE语句:当对一个文件的读或写的操作已完成,就应关闭该文件。
CLOSE语句的一般格式为:
CLOSE 文件名 1 [,文件名2]…
*/
/*
二.算术运算语句
1.ADD语句:
格式1:ADD 标识符1,标识符2 … TO 标识符m [,标识符n]…
常量1 ,常量2
ADD A TO B A+B=>B
ADD A, 15 TO B A+15+B=>B
ADD A, B TO C A+B+C=>C
ADD A, B TO C, D A+B+C=>C和A+B+D=>D
格式2:ADD 标识符1,标识符2,标识符3…GIVING 标识符m [,标识符n]…
常量1 , 常量2 , 常量3
ADD A, B GIVING C A+B=>C
ADD A, B GIVING C , D A+B=>C和A+B=>D
TO 和GIVING 后面只能跟数据名,不能跟常量。
2.SUBTRACT语句:
格式1:SUBTRACT 标识符1,标识符2… FROM 标识符m [,标识符n]…
SUBTRACT B FROM A A-B=>A
SUBTRACT B, C FROM A A-B-C=>A
SUBTRACT B, C FROM A, T A-B-C=>A和T-B-C=>T
格式2:SUBTRACT 标识符1 ,标识符2… FROM 标识符m GIVING 标识符n [,标识符p]…
SUBTRACT B, C FROM A GIVING T A-B-C=>T
3.DIVIDE语句:
格式1:DIVIDE 标识符1 INTO 标识符2 [,标识符3]…
常量1
格式2:DIVIDE 标识符1 INTO 标识符2 GIVING
常量1 BY 常量2
标识符3 [,标识符4]…
注意:DIVIDE A INTO B 是指 B/A---》B
DIVIDE A INTO B GIVING C 是指B/A---》C
DIVIDE A BY B GIVING C 是指 A/B ---》C
下面的用法错误:
DIVIDE A BY B. DIVIDE A INTO 3.
DIVIDE A BY 0 GIVING C.
4.MULTIPLY语句:
格式1:MULTIPLY 标识符1/常量1 BY 标识符2 [,标识符3]…
格式2:MULTIPLY 标识符1 /常量1 BY 标识符2 /常量2 GIVING 标识符3 [,标识符4]…
5.COMPUTE 语句:
COMPUTE 标识符1 [,标识符2 ]…= 算术表达式
运算的优先级由高到低顺序为:(),正负号 ,** ,* 或 / ,+ 或 -
如: A*B*C+D3=>T A*B*C+D3=>P 则:
COMPUT T,P = A * B * C + D ** 3
三.传送语句(MOVE)
MOVE 语句用来实现内存中数据的传送(而不是内存和外设之间的传送)。
MOVE语句的一般格式为:
MOVE 标识符1 TO 标识符2 [,标识符3]…
常量1
MOVE语句的传送规则:
1,如果接收项和发送项在数据部中描述的类型和长度相同,则按字节一一对应传送。
2,如果接收项和发送项长度不相同,而二者都是数值数据项,则按小数点对齐处理。
3,对字母或字符数据(非数值型数据)的传送,按左对齐处理。
4,初等项和组合项之间可以相互传送。
用MOVE语句实现同名替换。
02 OLD-DATE. 02 NEW-DATE.
03 X. 03 X.
04 X1… 04 X2…
04 X3… 04 X1…
03 Y1. 03 Y.
04 A1… 04 A1…
MOVE X1 OF X OF NEW-DATE TO X1 OF X OF OLD-DATE.
用CORRESPONDING子句的传送 —— 对应传送(同名传送)
对应传送的一般格式:
MOVE CORRESPONDING 标识符1 TO 标识符2
CORR
(1)所谓同名,指的是它们有相同的全程受限,既全程同名。
(2)传送的两者间必须有成对的同名数据项,而且这一对中必须至少有一个项是初等项。否则不能作为对应项传送。
(3)如果两个组合项中包括的项不同,则只传送同名的项。
假如OLD-DATE和NEW-DATE的描述分别为:
02 OLD-DATE. 02 NEW-DATE.
03 X. 03 X.
04 X1… 04 X2…
04 X3… 04 X1…
03 Y. 03 Y.
04 A1… 04 A2…
03 Y1. 03 Y2.
04 A… 04 A…
则OLD-DATE中的A与NEW-DATE中的A就不是全程同名。
MOVE CORRESPONDING OLD-DATE TO NEW-DATE
CORR
四.转移语句:
当需要使程序改变正常执行的顺序时,可以使用无条件转移语句 GO TO 。其一般格式为:
格式1: GO TO 过程名
格式2: GO TO 过程名1 [,过程名2]…过程名n DEPENDING ON 标识符
注意:段名或节名为过程名。只能转移到段或节的开头,不能转移到段或节的当中某一语句。
五.条件语句(IF)
当需要根据给出的某些条件是否满足来决定应执行哪一部分语句时,可以使用条件语句IF。
IF语句的两种形式
(1)IF 条件 语句组
(2)IF 条件 语句组1 ELSE 语句组2 END-IF
六.停止语句(STOP)
其一般格式为:
STOP RUN
常量
STOP RUN 执行后,程序停止运行,停止后不能再接着运行,如需要,可重新运行一次。
STOP 常量,表示程序暂时挂起不往下执行,显示出此常量。
七.算术运算语句的较高技巧
1.四舍五入处理(ROUNDED子句):ROUNDED的作用是按照数据项的描述要求对多余位进行截断,然后对被截断的
后一位进行四舍五入处理。
2.长度溢出处理 (ON SIZE ERROR 子句):当发生溢出错误时,按程序设计者事先指定的操作处理。如:
MULTIPLY A BY B GIVING C
ON SIZE ERROR DISPLAY ‘SIZE ERROR’
STOP RUN.
DISPLAY C.
注意:当ROUNDED 与ON SIZE ERROR 一起使用时,先按ROUNDED 作四舍五入处理,再判断是否溢出。
3.对应项间的运算(带CORRESPONDING 子句的算术运算语句):
一般格式:
ADD CORR 标识符1 TO 标识符2
[ROUNDED] [;ON SIZE ERROR 强制语句]
SUBTRACT CORR 标识符1 FROM 标识符2
[ROUNDED] [;ON SIZE ERROR 强制语句]
八.IF语句高级技巧:
条件名条件说明的一般格式:
88 条件名 { VALUE IS} 常量1 [{THRU} 常量2]
[常量3 [ [{THRU} 常量4]] …]
如: 77 X PIC 9(6).
88 X1 VALUE 0 THRU 99.
88 X2 VALUE 100 THRU 999.
88 X3 VALUE 1000 THRU 4999.
88 X4 VALUE 5000 THRU 100000.
IF X1 MOVE 0.03 TO R.
IF X2 MOVE 0.04 TO R.
IF X3 MOVE 0.05 TO R.
IF X4 MOVE 0.06 TO R.
九.多分支选择语句(EVALUATE语句)
EVALUATE A
WHEN 3 DISPLAY A
WHEN 4
DIVIDE 2 INTO A
DISPLAY A
WHEN OTHER DISPLAY “ERROR”
END-EVALUATE.
十.执行语句(PERFORM)
1.执行语句的作用:在一个COBOL程序中,过程部中往往有一部分语句需要执行多次。为了
让重复的部分在程序中只出现一次,可以把重复的部分单独写成一段或一节(有一个段名
或节名),每次执行这部分语句时转去该段,执行完转回来。这时候就需要用到执行语句
(PERFORM )。
如:计算存款的本利和,公式为P1=P(1+R)。其中P为存款,R为利率,P1为年底的本利和。
如要计算(1)P=1000,R=0.06时的P1值。(2)P=100,R=0.04时的P1值,并显示P1的值。
则程序可写为:
A1. MOVE 0.06 TO R.
MOVE 1000 TO P.
PERFORM C.
A2. MOVE 0.04 TO R.
MOVE 100 TO P.
PERFORM C.
C. ADD 1 TO R.
MULTIPLY P BY R GIVING P1.
DISPLAY P1.
2.执行语句的最简单形式:
PERFORM 过程名
3.执行语句的一般形式:
PERFORM 过程名1 [THRU] 过程名2
4. PERFORM语句的嵌套:在一个执行语句所“调用”的语句序列中,又包括另一个执行语句,这叫嵌套。
A1. ……
PERFORM C.
( PERFOEM 下一句 )
C.……(从这段的第一个语句开始执行)
.
. PERFORM D.
.
D. ……(接着执行D段)
.
.
.
嵌套规则:嵌套不能交叉或有共同的终点。
5.使用PERFORM语句实现循环:
1) PERFORM 过程名1 [{THRU} 过程名2 ] 整数 TIMES
标识符
2) PERFORM 过程名1 [{THRU} 过程名2 ] UNTIL 条件
先判断UNTIL后面的条件是否满足,若不满足则执行执行语句。
3) PERFORM 过程名1 [{THRU} 过程名2 ]
VARYING 标识符1 FROM 常数1 BY 常数2 UNTIL 条件
标识符2 标识符3
4)执行语句的多重循环形式:COBOL 允许三重循环,其一般格式可写为:
PERFORM 过程名1 [{THRU} 过程名2 ]
[VARYING 参数1 FROM 初值1 BY 步长1 UNTIL 条件1 ]
[AFTER 参数2 FROM 初值2 BY 步长2 UNTIL 条件2 ]
[AFTER 参数3 FROM 初值3 BY 步长3 UNTIL 条件3 ]
5)出口语句(EXIT):EXIT语句提供了一组过程的公共出口,
既指出了被调用过程的逻辑终点。
ppt 第66页??
*/
/*
子程序:用已介绍过的执行语句(PERFORM语句)可以使某一语句序列重复执行若干次。
但这种调用方式只限于在本程序中使用。
可以把要调用的语句序列不放在本程序中,而另外编成一个程序,就是子程序。把原来的
程序称主程序。
*/
IDENTIFICATION DIVISION.
PROGRAM-ID. A.
ENVIRONMENT DIVISION.
...
DATA DIVISION.
...
PROCEDURE DIVISION.
...
CALL 'B'.
IDENTIFICATION DIVISION.
PROGRAM-ID. B.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 X PIC X(80).
PROCEDURE DIVISION.
MOVE ALL '*' TO X.
DISPLAY X.
END PROGRAM B.
/*
调用程序和被调用程序间的数据之间往往需要发生某些联系,这就是程序间的数据联系。
主程序,如下:
*/
…
MOVE 2 TO A.
MOVE 8 TO B.
CALL ‘ADDAB’ USING A, B, C.
DISPLAY C.
…
子程序ADDAB:
…
PROCEDURE DIVISION USING X, Y, Z.
COMPUTE Z=X+Y.
END PROGRAM .
/*
调用语句的一般格式:
CALL 子程序名 [ USING 数据名1 [,数据名2]……]
被调用程序中过程部部头的一般格式为
PROCEDURE DIVISION [USING 数据名1[,数据名2]……]
主程序和子程序中USING子句中各参数是依照它们各自的次序确定关系的,而不是依照名字相同来确定。
可以由主程序将参数传送给子程序,也可以由子程序将数据传送回主程序。共享内存中同一段存储单元。并且当执行完子程序后,主程序与子程序之间的这种关系就不存在了。
子程序的结构
1.标识部
说明子程序的名字,以供调用。
2.环境部
3.数据部
(1)文件节(FILE SECTION)
(2)工作单元节(WORKING-STORAGE SECTION)
(3)联接节(LINKAGE SECTION):如果子程序过程部部头的USING子句中有数据名,则此数据名应在此节中加以说明。
4.过程部
过程部的部头:PROCEDURE DIVISION USING 数据名1,数据名2,……
过程部中应该包括一个程序出口语句:
END PROGRAM 程序名.
*/
主程序:
IDENTIFICATION DIVISION.
PROGRAM-ID. EX1.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 A PIC 99 VALUE 2.
77 B PIC 99 VALUE 3.
77 C PIC 99.
PROCEDURE DIVISION.
S. CALL ‘SUB’ USING A, B, C.
DISPLAY ‘C=‘, C.
STOP RUN.
子程序SUB:
IDENTIFICATION DIVISION.
PROGRAM-ID. SUB.
ENVIRONMENT DIVISION.
DATA DIVISION.
LINKAGE SECTION.
77 X PIC 99.
77 Y PIC 99.
77 Z PIC 99.
PROCEDURE DIVISION USING X, Y, Z.
S. COMPUTE Z=X-Y.
END PROGRAM SUB.
//PPT 第13页??
/*
第一次调用子程序,该子程序处于初始态:所有文件处于关闭状态,数据项根据VALUE子句得到初始值
缺省状况下,下次调用的时候,程序保留其上次调用后的状态,所有打开的文件仍然打开,所有数据项保留上次运行时决定的值
保留上次运行状态有时候很有用,有时候则比较麻烦,可能造成程序不够清晰并难以调试。
可以将子程序强制设置为每次调用都从初始状态进行:方法是在PROGRAM-ID 中使用IS INITIAL子句
*/
/*
全局数据和文件
通常,数据和文件都是局部的,但也可以定义全局数据和文件——GLOBAL子句
一、全局数据项
01 DATA1 IS GLOBAL.
02 …
02 …
GLOBAL只能用于01层,其所有下层数据均具有全局特性,可以被任何子程序引用。
GLOBAL属性只适用于单个方向。程序不能引用其所包含的程序中定义的数据项
如果子程序局部数据名字和主程序中全局数据名字一样,则在该子程序内部屏蔽对全局数据的引用
子程序嵌套情况下,主程序A中的全局数据在其子程序B中被同名重新定义为全局数据,则在B的子程
序C中引用该全局数据是子程序B的,而不能引用A的
文件名和其相关记录也可以通过在FD项目中加上GLOBAL子句从而具有全局属性
FD FILENAME IS GLOBAL.
01…
02….
其含义和全局数据相似
EXTERNAL子句和GLOBAL有相似性。具有外部属性的同名文件与数据,不管是在主程序还是子程序,不
管是同时编译还是单独编译,都共享同一内存区域。
1、外部文件
任何地方如下声明的文件都是同一文件
FD FILENAME IS EXTERNAL....
01 …
02…
2、外部数据
和外部文件类似:
01 DATA1 IS EXTERNAL…
02…
external 和 global的区别??
*/
//cobol中表的概念类似于数组
01 student-record.
02 wang.
03 math pic 9(4).
03 eng pic 9(4).
02 zhang.
03 math pic 9(4).
03 eng pic 9(4).
……
02 zhu.
03 math pic 9(4).
03 eng pic 9(4).
/*
表中,序号(即指出表中第几个元素)称为下标,相对地址(相对于表中第一个
元素的字节地址)称为位标,下标和位标统称为“出现号”。
表中,序号(即指出表中第几个元素)称为下标,相对地址(相对于表中第一个
元素的字节地址)称为位标,下标和位标统称为“出现号”。
格式:OCCURS 整数 TIMES (在数据部中说明)
举例:01 STUDENT-RECORD.
02 STUDENT OCCURS 100 TIMES.
03 MATH PIC 9(4).
03 ENG PIC 9(4).
进一步简化: 03 COURSE OCCURS 2 TIMES.
这样又建立了一个表 “COURSE”,它的元素需要两个下标才能确定,因此是一个二维表。
如果要找第三个学生的英语成绩,则:COURSE (3, 2) , 第一个下标是指第几个学生,
第二个下标指出第几门成绩。
1.OCCURS子句不能出现在77层,因为77层是独立的数据项。
2.OCCURS子句不能用于01层。
3.只有当OCCURS所说明的数据是初等项时,才能在该数据项的描述中使用PIC子句。
4.不能用VALUE子句对表赋初值,不能同时用OCCURS子句和VALUE子句来描述同一数据项。
5.多维表的元素在内存中是以行排列的。如果A是一个二维表,每一维中包含两个元素,在内存中按以下顺序排列:A(1,1)=>A(1,2)=>A(2,1)=>A(2,2)。
可变长表
格式:OCCURS 整数1 TO 整数2 TIMES DEPENDING ON 数据名1
说明:根据数据名1的值来确定数据项重复的次数,即表元素的个数。数据名1可以在表所在的记录中描述,也可以在工作单元节中描述,但不能是表中的一部分。
例:
01 STUDENT-RECORD.
02 STUDENT OCCURS 10 TO 100 TIMES
DEPENDING ON STUDENT-NUM .
03 MATH PIC 9(4).
03 ENG PIC 9(4).
02 STUDENT-NUM PIC 9(3).
表元素的引用
格式:表名(下标或位标)
说明: 表必须先在数据部定义,才能在过程部引用。
01 TABLE.
02 B OCCURS 8.
03 C1 PIC X(2).
03 C2 PIC X.
1.如果B是一个表,不能直接引用表名B而不加下标。
MOVE B TO A. 是错误的。
MOVE B(1) TO A. MOVE TABLE TO A. 是正确的。
2.如果表元素是组合项,则引用它下属的项(可以是初等项或组合项),也必须用下标指明它是属于哪一个表元素的。
MOVE C1 TO A. 是错误的。
MOVE C1 (2) TO A. 是正确的,表示传送B(2)中的C1给A。
3.如果表元素是组合项,可以用它对下属的数据项进行限定,但带下标的数据名不能被限定。
MOVE SPACE TO C1 OF B(2). 是正确的。
MOVE SPACE TO B(1) OF TABLE. 是错误的。
4.下标只能是整常数或具有整型值的数据名,如A(I),A(3)为合法。不能是表达式,如:A(I+1),A(3+4)是不合法的。
5.下标不能是带下标的数据名,即不能是表元素。如
A( A(1))是不合法的。
给表元素赋初值 (两种方法) 不能赋初值??
1.对包括所有表元素的整个表赋给一个初值,这时可以对表的描述体上面一层的数据项赋一个初值即可。
例1:01 TABLE VALUE IS ZERO.
03 Q OCCURS 20 PIC 9(3).
例2:01 T VALUE ’ABCDEFHIJ’.
03 Q OCCURS 3 PIC X(3).
这样,Q(1),Q(2),Q(3)的内容分别是ABC,DEF,HIJ。
2.联合使用OCCURS子句和REDEFINES子句来给各个表元素赋值。
步骤:
(1)先在工作单元节中定义一个组合项,它占的内存的大小和需赋值的表一样,在该组合项中定义若干个数据项,数据项的描述和表的元素相同。
(2)然后对这些数据项分别用VALUE子句赋以初值,由于在这些数据项的描述中没有出现OCCURS子句,因此用VALUE赋初值是合法的(VALUE子句和OCCURS子句不能同时用来描述一个数据项)。这些值就是要赋给表元素的初值。
(3)把这个组合项重定义为一个表。
*/
01 PRICE-TABLE.
02 FILLER PIC X(10) VALUE ‘0010000200’.
02 FILLER PIC X(10) VALUE ‘0020000500’.
02 FILLER PIC X(10) VALUE ‘0030000400’.
02 FILLER PIC X(10) VALUE ‘0040000300’.
02 FILLER PIC X(10) VALUE ‘0050000300’.
01 PRICE-TABLE-R REDEFINES PRICE-TABLE.
02 TABLE OCCURS 5.
03 PROD-CODE PIC 9(4).
03 PROD-PRICE PIC 9(6).