课程编号: China’s Answer to Your IT Needs 培训课程名称 COBOL语言 Version 1.0 目标 通过讲座与练习,使培训者熟练掌握COBOL语法,规范、以 及COBOL语言的一些高级应用 熟悉开发环境,能够完成一般难度的编程需求。培养受训 者解决问题的能力,以及解决问题的方法 本课程以面授和上机实践为主,中间穿插进行讨论。其中 理论授课时间占50%,上机时间占50% 考核采用百分制记录方式。考核内容为:理论闭卷考试+平 时练习 学时分配 序号 教学内容 课时分 配 1 第一章 COBOL语言概述 4 2 第二章 标识部与环境部 4 3 第三章 数据部 8 4 第四章 过程部之基本语句 8 5 4 6 第五章 过程部之高级语句 第六章 数据部之高级语句 7 第七章 子程序 6 8 第八章 Cobol中的数据库访问 2 9 案例程序编写、调试、代码Review 16 10 单体测试与总结 18 11 考试 2 合计 80 8 开发环境说明 服务器: - Windows XP Professional 日文版 - Oracle 9i 服务器端 客户端: - 操作系统:Windows XP Professional日本版 - COBOL开发环境:NetCOBOL - 编辑工具:EditPlus - 翻译工具:ChineseWriter - 数据库:Oralce9i客户端 - 数据库开发工具:PL/SQL - 文件比较工具:Beycond Compare 第一章 COBOL语言概述 COBOL语言概述 COBOL是Common Business Oriented Language(通用商业 语言,或称管理语言)的缩写 最适用于数据处理 比较接近于自然语言(英语) COBOL的结构严谨,层次分明 COBOL的缺点是比较烦琐 第一个程序例子 IDENTIFICATION DIVISION. PROGRAM-ID. EXAM. ENVIRONMENT DIVISION. DATA DIVISION. PROCEDURE DIVISION. S. DISPLAY “THE FIRST PROGRAM”. STOP RUN. 每个程序包含四个部 IDENTIFICATION DIVISION (标识部) 主要用来指定源程序名字,也可以写入其他用作备忘的某些信息 (如日期、作者等)。 ENVIROMENT DIVISION(环境部) 主要用于指出程序中用到的数据文件名与计算机系统的设备的对 应关系,即把某一文件名与一个外部设备联系起来。 DATA DIVISION(数据部〕 程序中所用到的全部数据(包括输入输出的数据和中间数据)都 应在数据部中说明它们的类型和所占内存情况。 PROCEDURE DIVISION(过程部〕 用来给出程序要执行的指令,使计算机产生相应的操作,例如进 行数学运算。 COBOL程序结构 COBOL程序的书写格式 标号区 续行区 A区 B区 注释 1~6 7 8~11 12~72 73~80 1-6列 标号区 7列 续行区(-)及注释行(*) 8~11列 A区 部头,节头,段头,层号01,层号77以及文件描述符FD应从A 区开写。 12-72列 B区 正文过程部的句子只能从B区开始写,而不能写到A区去。 73-80列 注释区 编译时被舍弃 写程序时注意的问题 ⑴COBOL 编译系统允许使用大写或小写字母。认为字母大小写相等, 但引号内的字符串中字母大小写有区别。写程序时习惯上多用大写。 ⑵相邻的两个COBOL 字之间必须留一个以上空格。 ⑶运算符和等号左右两边必须各留一个空格(需要的话,可以留一个 以上空格)。左括号的左侧和右括号的右侧要留一个空格(需要的话, 可以留一个以上空格),而内侧不必留空格。如:A + (B + C) / D. ⑷逗号、句号、分号的左边不能留空格。 ⑸一个空格和多个空格作用相同。 ⑹一个语句或句子可以任意写在一行或几行上。一行可以写多个语 句或句子。 COBOL字符 数字:0~9 大写字母:A~Z 小写字母:a~z 专用字符共15 个: + - * / = ,. ;’ ( ) < > 空格 $ “#”、”!”、”?”、“%“等字符属于系统字符集,只能 在COBOL 程序中的字符串(用引号括起来)中出现 COBOL常量 数值常量 非数值常量 表意常量 *不象其他的语言,COBOL不支持自己定义的常量 数值常量与非数值常量 数值常量是由正负号,小数点,数字组成 小数点不能多于一个,而且不能出现在常数最右边,因为句号加空格 代表一个句子的结束。(123.和123.45.6) 长度不能超过18 位。 非数值常量 至少要有一个数字,不能多于一个符号。(+123.6-) 数字之间不能有空格。(12 34 代表两个常量12 和34) 指用引号括起来的字符串(“CHINA”,’JAPAN’)。 如果想把引号也包括在非数值常量中,可以使用QUOTE 保留字。但是QUOTE 不能代替引号,只有在引号外再使用QUOTE 保留字,它才能起到字符串的定 界作用。 例子:DISPLAY QUOTE ’ABCD ’ QUOTE 正确。 表意常量 ZERO,ZEROS,ZEROES 表示一个或多个零字符(16进制‘F0’) SPACE,SPACES 表示一个或多个空格字符(16进制‘40’) HIGH-VALUE,HIGH-VALUES 表示一个或多个字符具有最高值(16进 制‘FF’, 2进制‘11’) LOW-VALUE,LOW-VALUES 表示一个或多个字符具有最小值(16进制 ‘00’,2进制‘00’) QUOTE,QUOTES 表示一个或多个引号字符(16进制‘7F’) ALL 常量表示一个或多个该常量组成的字符串 COBOL变量 数据名相当于其它语言中的变量名。代表内存中某段存储单元。通过 数据名从内存取出数据或者将数据存放到内存中。数据名的命名规 则 数据名的长度为1~30 个字符之间。 能由字母、数字和连字符组成,而且其中至少应有一个字母。第一个和最后一个 字符不能用连字符。COBOL 并不一定要求数据名是有意义的英文字,但由于COBOL 具有成文自明的特点,习惯上把数据名定义成有意义的COBOL 字(用户定义字)。 数据名中不能出现空格,空格表示一个COBOL 字的结束。 保留字不能作为用户定义的数据名。 第二章 标识部与环境部 标识部 标识部的作用是标识一个COBOL源程序,即为程序加上标志以便识别。 标识部必写部分: IDENTIFICATION DIVISION.(部头) PROGRAM-ID. 程序名.(程序标识段) 标识部任选部分: AUTHOR. 作者姓名 INSTALLATION. 计算机设置的场所. DATE-WRITTEN. 源程序编写日期. DATE-COMPILED. 源程序编译日期. SECURITY. 保密程度. 环境部 环境部的作用是说明程序运行的环境,即程序是在什么软硬件环境 下运行的。要说明程序用到哪些设备,哪些文件,将程序中用到的 内部文件与外部文件(或外部设备)之间建立联系,这种联系是通过 SELECT 子句实现的。 语法 ENVIRONMENT DIVISION. (环境部) CONFIGURATION SECTION. (配置节) SOURCE-COMPUTER. 源计算机名. OBJECT-COMPUTER. 目标计算机名. [SPECIAL-NAMES. 专用名描述项] [INPUT-OUTPUT SECTION. (输入输出节) FILE-CONTROL. 文件控制描述体 [I-O-CONTROL. 输入输出控制描述体]] 配置节 源计算机指的是编译源程序时使用的计算机。 目标计算机指的是编译后的目标程序运行时使用的计算机。 专用名段把系统中原规定的一些设备名或功能名或符号改为用 户自己指定的名字或符号。专用名段的一般格式: SPECIAL-NAMES. [DECIMAL-POINT IS COMMA.] [CURRENCY SIGN IS 非数值常量.] [专用名 IS 助忆名.] CONFIGURATION SECTION. SOURCE-COMPUTER. IBM-AS400. OBJECT-COMPUTER. IBM-AS400. 输入输出节 输入输出节包括两个段:文件控制段和输入输出控制段(IO-CONTROL,几个文件共用一段内存,不常用)。 文件控制段的主要功能是给程序中使用的文件命名。指出 存放该文件的外部设备及其其它有关文件控制的信息。文 件控制段的一般格式: INPUT-OUTPUT SECTION. FILE-CONTROL.(段名写在A 区) SELECT 文件名 ASSIGN TO 外部文件名.(正文写在B 区) 文件的组织形式 文件的组织形式是指记录在文件中的排列的方式。 顺序文件(sequential file) 。在建立文件时,先送入文件的记录排 在前面,后送入的记录排在后面。顺序文件的记录从头至尾按顺序列 出。现有记录之间不能删除记录和插入新记录,只能在末尾增加新 记录。记录在文件中的排列顺序,读出的顺序和建立时的顺序三者 是一致的(先入先出)。 相对文件(relative file) 。在建立文件时,除了送入记录本身之 外,还要对记录的顺序编号,相对文件记录按逻辑记录号引用,记录 可以通过指定相对关键字按任意顺序处理。 索引文件(indexed file) 。在建立文件时,在存储设备上除了开辟 一个区域存放记录外,还建立一个”目录”以便查找,这个目录表 称为索引。 直接文件(direct file) 。又叫随机文件,在建立文件时,记录不 必顺序存放,由程序指定某一地址直接存放。读取记录时,先计算 地址再读取记录。 文件的存取方式 文件组织 存取方式 顺序文件 顺序存取 索引文件 顺序存取、随机存取、动态存取 直接文件 随机存取 相对文件 顺序存取、随机存取、动态存取 文件组织的从句 文件类型 语法 顺序文件 SELECT file-name ASSIGN TO implementor-name ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS data-name. 相对文件 SELECT file-name ASSIGN TO implementor-name ORGANIZATION IS RELATIVE ACCESS MODE IS [SEQUENTIAL RANDOM DYNAMIC] RELATIVE KEY IS data-name-1 FILE STATUS IS data-name. 索引文件 SELECT file-name ASSIGN TO implementor-name ORGANIZATION IS INDEXED ACCESS MODE IS [SEQUENTIAL RANDOM DYNAMIC] RECORD KEY IS data-name-1 ALTERNATE RECORD KEY IS data-name-2 WITH DUPLICATES 第三章 数据部 数据部的作用 数据部是整个COBOL 源程序中唯一描述数据的部分,数据部的作用 是定义数据项属性,描述数据结构。过程部中出现的所有数据项(输入 数据,输出数据,中间数据)都应当在数据部中对它们的属性进行说明。 包括: 每一个数据项的类型(是数值型或字符型...),它们在内存中的存 储形式, 它们的长度。 数据项间的相互关系(用层号表示)。 描述记录与文件的关系,即内存中的数据输入输出记录区是与哪一 个文件有关的。 文件的属性(FD 描述体:由多少个记录组成一个物理块,一个记录包 含多少个字节,文件有无标号记录等)。 数据的特点-层次的概念 数据有两种,一种是孤立数据项,一种是组合数据 层次的规定 结构:记录组合项初等项 层次下:从01开始,到49, 外层的层号小,里层的层号大。 66层用于重命名 77层一般用于定义无层次的变量 88层用于定义条件名 例子: 01 GZTJ. 05 ZGXM PIC X(20). 05 SR. 10 JBSR PIC 9(07). 10 BTSR PIC 9(07). 05 KC. 10 BX PIC 9(07). 10 SDS PIC 9(07). 05 SFGZ PIC 9(08). 数据部的结构 文件节(FILE SECTION)用来描述程序中用到的输入文件和输出 文件及其记录中各数据项的属性。 工作单元节(WORKING-STORAGE SECTION) 用来描述程序中用到 的非输入输出数据项(中间数据项)。 联接节(LINKAGE SECTION) 用来描述与调用程序间发生数据传 递的数据项。在子程序中设定该节。 报表节(REPORT SECTION),设计报表栏的打印形式和方法。 通信节(COMMUNICATION SECTION),用于前后台数据之间的通信。 文件节(FILE SECTION) 文件描述体的通常格式:(花括号的作用是表示在花括号中的各项中选择其一) FD 文件名 LABEL {RECORD IS } {STANDARD} {RECORDS ARE } {STANDARD} [ BLOCK CONTAINS [整数-1 TO ] 整数-2 { RECORDS } { CHARACTERS }] [ RECORD CONTAINS [整数-3 TO ] 整数-4 CHARACTERS ] [ VALUE OF LABEL IS [字符常量-1 ] ] [ DATA {RECORD IS } 数名-1 [,数据名-2 ] ...] 例子:FD S0-FILE RECORD CONTAINS 36 CHARACTERS. 01 S0-REC. 03 S0-KEY-VAN. 05 S0-TCD PIC 9(02). 05 S0-NM-VAN PIC X(30). 03 S0-KEY-SYS. 05 S0-SCD PIC 9(04). 字型子句(PIC子句) 数据项是什么类型的,如果数据项是数值型的,还要描述数据的符号 和小数位数。 数据项占据多大内存。 是否需要按照打印的要求准备有关字符。(输出数据的编辑形式) PICTURE PIC IS 描述字符串 数值型数据 - “9” 描述符 表示可以放入一个0~9之间的数字 02 X PIC 9999. 02 Y PIC 9(5). 描述 02 数值 在内存中表示 X PIC 9999 1234 1234 02 Y PIC 9(5) 467 00467 02 Z PIC 99 86 86 11011 011011 02 T PIC 9(6) 若 MOVE 1.25 TO Z, Z中的内容为 01,小数点后的舍弃 若 MOVE -1.25 TO Z, Z中的内容为 01,小数点后的舍弃,负号也舍弃 数值型数据 - “V” 描述符 指出在数值数据结构中隐含的小数点的位置 02 M PIC 999V99. 说明: 1. V隐含小数点的位置,占5个字节,传送时按小数点对齐,向两边延伸 MOVE 215.63 TO M -> M=213.63 MOVE 1215.637 TO M -> M= 215.63 2. 只能出现一个V 3. 按隐含的小数点位置对准进行运算 A PIC 9(3)V9. A=010.0 B PIC 9(2)V9(2). B=02.00 C PIC 9(2)V9(2). COMPUTE C=A+B => C=12.00 4. 显示时,不显示小数点(用编辑型显示小数点) 描述 数值 在内存中表示 02 A PIC 99V99 87.5 8750 02 T PIC 999V99 498.5 49850 02 W PIC 9(3)V9(2) 781 78100 03 N PIC 9(4) 1245.6 1245 03 H PIC V999 1.234 234 数值型数据 - “P” 描述符 为了节省内存,对低位上有若干个零的数和小数点后若干位后才有非零数字 的数,可以用P 描述符。如:表示10000000 和0.000023 1. 01 A PIC 9PPPPPPPPPP. 用9999999999来描述,占10个字节。为了节省内存,低位上有若干个0的 数,可以用“P”来描述。A在内存中只占1个字节,表示1x109,也可以写成: 01 A PIC 9P(9). 2. 01 3. 描述 A PIC PPPP99. 表示0.000099 内存中数字 03 AMOUNT PIC 03 03 9(4)PPPP 等价的算术量 1802 18020000 WAT PIC 9(3)P(3) 015 15000 WAT PIC P(3)9(2) 11 0.00011 03 87 0.0087 WAN PIC VPP99 4. P 描述符在COBOL中不常用 数值型数据 - “S” 描述符 在数据项中放入一个带符号的数,可以用S 描述符。 02 D PIC S99. (S不计数据项长度,表示负号,只能在99最前面) 描述 数值 内存中的表示 02 B PIC S9(4)V9(2) 126.89 012689 02 C PIC S9(4)V9(2) -1112.34 111234 02 D PIC S9(4)V99 -0.25 000025 02 E PIC S9(4)V99 -727.18 072718 字母型数据 - “A” 描述符 字母型数据用A 描述符,只能存放字母和空格。 02 A2 PIC AAAA. 02 A2 PIC A(4). MOVE “ABCD” TO T T内存中的表示 ABCD 不只能存放字母和空格以外的字符,也可以用X描述 字符型数据 - “X” 描述符 由任意的COBOL 字符组成的数据称字符型数据,字符型数据用X 描述符 01 A PIC X(2). 描述 02 R1 PIC X(4) 送入的数据 内存中的情况 BOOK BOOK 02 R2 PIC X(8) SIN(X) SIN(X)_ _ 02 R3 PIC X(7) COBOL-74 COBOL-7 02 R4 PIC X(12) DATA-NAME DATA-NAME _ _ _ 编辑型数据 编辑型数据项仅仅是为了输出的需要,不能用来运算 插入小数点 “.”,用“.”描述符 例:PIC 99.99. 插入小数点 “,”, 用“,”描述符 例:PIC 999,99.99. 插入“0”,用“0”描述符 例:PIC 9990000 (显示的事1230000,后面带0的). 插入空格用”B”描述符 例:PIC B999B. 插入正负号,用”+”或”-”描述符 例:PIC +99. 描述符 + 数值为正 加 “+” 号 数值为负 加“-”号 说明 一律加符号 - 数前加一空格 加“-”号 只对负值加符号 插入”$” 例:01 A PIC $99. MOVE 12 TO A. DISPLAY A.结果是$12. 若为MOVE 5 TO A.他的结果是$05. 浮动插入正负号和$ 例:PIC $$$.99. MOVE 12 TO A. DISPLAY A.结果是$12.00.若为MOVE 5 TO A.他的结果是$5.00. 取消高位0,用“Z”和“*”描述符 例:PIC Z999. 插入:”DB”和”CR”字符 赋初值子句(VALUE 子句) COBOL 中允许直接对工作单元节中数据赋以初值。 只能对工作单元节中的数据项赋初值。不能对文件节中输入输出文件中的数据项 赋初值。 如果在组合项的描述体中使用VALUE 子句,初值只能是表意常量或非数值型常量。 如: 01 A VALUE ‘1234’. 03 A1 PIC 99. 03 A2 PIC 99. 当用一个带符号的数值作初值时,相应的PIC 子句中应该有S 描述符。 赋初值时应注意类型的一致性。 VALUE 子句给出的值应适合PIC 子句描述的范围,否则会出现截断或产生错误。 USAGE子句-1 USAGE子句用于指定子句是用来指定数据项在内存中的存储形式,一般格式为: [USAGE IS] {DISPLAY, COMPUTATIONAL, COMP} USAGE IS DISPLAY 是“显示型用法”,适用于显示、打印 COMPUTATIONAL(COMP)是“计算型的用法”,适用与计算 DISPLAY 标准数据形式,一个字节放一个字符 COMPUTATIONAL 定点二进制形式 COMP COMPUTATIONAL-1 内部短浮点形式 COMP-1 COMPUTATIONAL-2 内部长浮点形式 COMP-2 COMPUTATIONAL-3 内部十进制形式 COMP-3(用得多) USAGE子句-2 例如:02 A PIC 9(4) USAGE IS COMP. 或:02 A PIC 9(4) COMP. 用DISPLAY显示的结果仍同原样。 例如:02 B PIC 9(6) USAGE IS DISPLAY. 02 B PIC 9(6) DISPLAY. 02 B PIC 9(6). 如不写DISPLAY,则表示隐含。 例如:01 T. 02 T1 USAGE COMP. 03 X PIC S9(3). 03 Y PIC S9(3). 组合项的全部初等项为COMP. 数据在计算机内的表示形式 字符数据在内存中的存取形式: 字符型、字母型和数值编辑型、字符编辑型数据项中的数据,每一个字符都在内 存中占一个字节。这种形式称为标准数据形式。 数值型数据在内存中的存取形式 1.外部十进制形式 按数值在机器外部的表现形式,一个数字在内存中占一个字节。 (如12,1占1个字节,2占一个字节) 2.内部十进制(缩合十进制)形式 为节省内存,可以只用四位二进制数字来代表一个十进制数。在一个字节 中放两个十进制数字。符号也占半个字节(+号为C,-号为D)。这种存放形式称 为内部十进制。在 COBOL 中用COMP-3 表示。例如: 03 R2A-DEN PIC 9(06) (USAGE IS可以省略) COMP-3. 03 R2A-GYO PIC 9(02) COMP-3. 内部十进制占用内存的计算方法:ROUND((N+1)/2)个字节。(比如上面的9(06) 占ROUND((6+1)/2)=4个字节,即如下所示,数字占3个字节,符号占半个字节) 数据在计算机内的表示形式 3.定点二进制形式(COMP) 先把十进制数化成定点二进制数形式,然后放在内存中。COBOL 规定在内存中根据数据 项的长度分别用二字节,四字节或八字节来存放一个以定点二进制形式存放的数。 1~4->2 5~9->4 10~18->8 4.外部浮点数形式 例如:01 A PIC +9.99999E+99. 01 B PIC +9V99999E-99. A 在内存占12 个字节,B 在内存占11 个字节(因为V在内存中不占字节)。 5.内部浮点形式 它以内部的指数形式来表示一个数,以固定长度的内存单元来存放一个数,以四个字 节表示一个数,称为短浮点形式(COMP-1)(第一个字节放指数,后三个字节放数字, 如:3.999*10^3,就是第一个字节放10^3 ,后三个字节放3.999 ) 。以八个字节表示 一个数,称为长浮点形式(COMP-2)。(第一个字节放指数,后7个字节放数字) 第四章 过程部之基本语句 过程部概述 以部头PROCEDURE DIVISION 开头。部头从A 区开始书写。过程部的 层次结构是:节、段、句子、语句。 过程部的语句都以一个动词开始,它表示计算机应执行的操作。 语句中的动词后面一般要跟以一个操作的对象。操作对象可以是数 据名或文件名。 过程部的语句一律从B 区开始书写。一个语句可以任意写在一行或 几行上。续行也应从B 区开始。 语句列表 4.1 输入输出语句 - 4.1.1 4.1.2 4.1.3 4.1.4 4.1.5 4.1.6 接收语句(ACCEPT 语句) 显示语句(DISPLAY 语句) 复写语句(COPY 语句) 读语句(READ 语句) 写语句(WRITE 语句) 打开语句(OPEN 语句) - 4.1.7 关闭语句(CLOSE 语句) 4.2 算术运算语句 - 4.2.1 4.2.2 4.2.3 4.2.4 加法语句(ADD 语句) 减法语句(SUBTRACT 语句) 乘法语句(MULTIPLY 语句) 除法语句(DIVIDE 语句) - 4.2.5 计算语句(COMPUTE 语句) 4.3 4.4 4.5 4.6 传送语句(MOVE 语句) 转移语句(GO TO 语句) 条件语句(IF 语句) 停止语句(STOP 语句) 4.7 执行语句(PERFORM 语句) 杂) (复 接收语句(ACCEPT 语句) 使用ACCEPT 语句直接从终端键盘或系统指定的输入设备上输入少量的数据。 ACCEPT 语句的一般格式: ACCEPT 标识符 [FROM 助忆名(助忆名与环境部专用名段有关)] 说明: - 标识符指的是能唯一地标识一个数据项的数据名。 - 助忆名是一个用来代表一个外部设备的名字。需要在环境部中的专用名段事先说明 助忆名和哪种外部设备想联系。如果不写FROM 部分,则表示从系统隐含指定的设 备上读入一个数据。每种计算机系统都分别规定隐含的输入设备。一般指定为控制 台。 - ACCEPT 后面只能跟一个标识符,不能在一个ACCEPT 语句中写两个以上标识符。但 是,如果两个标识符(W-NUM, W-CHAR) 属于同一组合项(W-NUMCHAR),则可以通过 ACCEPT W-NUMCHAR 使W-NUM, W-CHAR 接收到数据。W-NUMCHAR 被认为是字符型变 量,如果输入数据长度大于变量所占内存,遵循左对齐原则。 - ACCEPT 对于调试程序比较方便,但是由于人工干预,会影响计算机效率。 例子: - ACCEPT A - ACCEPT A FROM DATE 显示语句(DISPLAY 语句) 将少量数据从计算机内存中输出到某一指定的外设上,可用DISPLAY 语句。 DISPLAY 语句的一般格式 DISPLAY 标识符1(或者常量) [标识符2(或者常量) ] [UPON 助忆名] 如果没有UPON 可选项,在计算机系统隐含指定的输出设备上显示数 据。每执行一个DISPLAY 语句,总是从一个新行开始显示的。多用 于调试程序时使用。 复写语句(COPY 语句) 利用COPY 语句可以使某些记录描述和数据描述为不同的程序共用。为此 要建立一个源程序库,将上述这些共同使用的源程序中的某一部分事先存入库 中。编码人员用COPY 语句就可以将这些源程序体插入到自己的源程序中。 COPY 语句一般格式: COPY 库名 REPLACING 标识符1 BY 标识符2 标识符的含义为不超过30 个字符组成的字符序列。 例如: COPY IN-FILE REPLACING ==IN== BY ==A==.( COPY进来的 IN-FILE文件只要有 IN ,就用A 替换IN) COPY 语句不仅可用于数据部,而且也可用于其它部分。使用COPY 语句可以减少 写程序的工作量,便于程序的保存和修改。 读语句(READ 语句) 用于从外部数据文件上读入数据输入到程序的数据项。存取操作以文件为对象, 以记录为单位。文件是按名字存取的。 READ 语句最简单的格式为: READ 内部文件名(不直接使用外部文件名,是为了便于移植) 每执行一次READ 语句,就从内部文件名对应的外部文件中读入一个记录,而不是 整个文件。并将读入的记录放入到内存(程序为存储 记录在内存区专门开辟一片存储单元)。 读语句(READ 语句) READ 语句一般格式: (INTO ident 是指将读入的记录写入到标识符中。而 statements 是指所触发的事情) 1.顺序访问 READ 内部文件名 RECORD [INTO ident] [AT END statements] [NOT AT END statements] [END-READ] 2.随机访问 READ 内部文件名 RECORD [INTO ident] [INVALID KEY statements] [NOT INVALID KEY statements] [END-READ] 3.动态访问 READ 内部文件名 NEXT RECORD [INTO ident] [AT END statements] [NOT AT END statements] [END-READ] READ 内部文件名 RECORD [INTO ident] [INVALID KEY statements] [NOT INVALID KEY statements] [END-READ] 写语句(WRITE 语句) WRITE 语句将内存区中的数据输出到外部设备或写入文件中。 1.顺序文件的格式 WRITE 记录名 [FROM ident] [BEFORE ADVANCING id-lit LINE AFTER PAGE] AFTER 是先移后打,即先移行再打印,打印完后不再移行。BEFORE 是先打后移, 打印之前不移行,打印完后再移行。当不出现AFTER 或BEFORE 时,按AFTER 1 处 理。 在许多计算机系统的COBOL 中,在用WRITE 语句在打印机上打印记录时,输出记 录区的第一个字符被系统作为“纵向走纸控制“之用。也就是说,输出的每一记录的 第 一个字符将不输出而作为控制走纸字符之用。 如果将不同内容通过相同结构输出到某一文件中,每次记录写入前赋值,该记录被输 出之后系统将不再保存该记录的值。即下一次赋值时,旧的内容会被新的内容新所覆 盖。”记录名”必须是紧跟在该输出文件FD 描述体之后定义的记录名。 打开语句(OPEN 语句) OPEN 语句一般格式: OPEN INPUT OUTPUT I-O EXPEND 内部文件名 INPUT 方式:文件只能读取。如果要打开的输入文件不存在,则会触发出错误处 理。 OUTPUT 方式:生成程序写入记录的新文件。如果要打开的输出文件已经存在,则 所有记录被删除,否则生成新文件 I-O 方式:文件即可读取也可写入。如果文件不存在,则打开操作不成功,会产 生错误条件。 EXTEND 方式:与OUTPUT 方式相似,只能写入文件。程序将新记录写入文件末尾。 如果文件不存在,则打开操作不成功。 关闭语句(CLOSE 语句) CLOSE 语句一般格式: CLOSE 文件名1 说明: - OPEN 与CLOSE 用法不同,CLOSE 不必指出文件类型。 - 一个程序中OPEN 与CLOSE 成对出现。 - 对外部文件进行读写操作之前要先将该文件打开, 读写操作结束 后,关闭文件。关闭后,不能再对该文件进行读写操作,如需再用, 可以再打开。 加法语句(ADD 语句) 1.加法语句的一般格式。(标识符1 ,标识符2 是数据名或是常量) ADD 标识符1 , 标识符2… TO 标识符3 , 标识符4 ADD 标识符1 , 标识符2… GIVING 标识符3 , 标识符4 2.加法语句的几种不同的形式。 - ⑴ADD A TO B.表示数据项A 的值和数据项B 的值相加,结果置于 B 中。 - ⑵ADD A,B GIVING C.表示将A 和B 相加,结果放在C 中。 - ⑶ADD A,B TO C,D.表示C=A+B+C,D=A+B+D 3.注意事项: - 在TO 和GIVING 后面只能是数据名,而不能是常量。TO 前后的数 据名的次序不要随意更换(ADD A TO B 不等于ADD B TO A) 。 GIVING 后面可以跟几个数据名。 减法语句(SUBTRACT 语句) 1.减法语句的一般格式。(标识符1 ,标识符2 是数据名或是常量) SUBTRAC 标识符1 , 标识符2… FROM 标识符3 , 标识符4 SUBTRAC 标识符1 , 标识符2… FROM 标识符3 GIVING 标识符3 , 标识符4 2.减法语句的几种不同的形式。GIVING 后面可以跟几个数据名。 ⑴SUBTRACT B,C FROM A,D.表示A=A-B-C,D=D-B-C。 ⑵SUBTRACT B,C FROM A GIVING X.表示X=A-B-C。 如果不带GIVING,FROM 后面不能是常量。 乘法语句(MULTIPLY 语句) 1.乘法语句的一般格式。(标识符1 ,标识符2 是数据名或是常量) MULTIPLY 标识符1 BY 标识符2 , 标识符3… MULTIPLY 标识符1 BY 标识符2 GIVING 标识符3 … 2.乘法语句的几种不同的形式。 ⑴MULTIPLY A BY B,C.表示B=A*B,C=A*C。 ⑵MULTIPLY A BY B GIVING X.表示X=A*B。 如果不带GIVING,BY 后面不能是常量。带GIVING 时,BY 后面可以 是常量,GIVING 后面不能是常量。总之存放值的项,只能是数据名, 不能是常量。 除法语句(DIVIDE 语句) 除法语句的几种不同的形式。 DIVIDE A INTO B,C.表示B=B/A,C=C/A。 DIVIDE A INTO B GIVING C.表示C=B/A。 DIVIDE A BY B GIVING C. 表示C=A/B。 如果不带GIVING,INTO 后面不能是常量。带GIVING 时,INTO 后面 可以是常量,GIVING 后面不能是常量。总之存放值的项,只能是数 据名,不能是常量。如果除不尽,则多余的位截去。 计算语句(COMPUTE 语句) COBOL 还提供了一种计算语句,可以进行比较复杂的四则运算。一 般格式: COMPUTE 标识符1 = 算术表达式 例如:COMPUTE Z = (B – A) * 2 + C * X – E / D. 说明: - 所有运算符两侧均应留一空格。 - 括号的外侧应留空格,内侧可不要留空格。 - COMPUTE 语句运算速度较单一的加减乘除慢。 传送语句(MOVE 语句) MOVE 语句用来实现数据的传送,将一个数据从一个内存域送到另一个内存域中。相当于其 它高级语言中的赋值语句。传送规则(各种类型数据的特点通过MOVE 语句体现): MOVE A TO B. ( A 称为发送项,B 称为接收项。) 说明: - 如果接收项和发送项在数据部中描述的类型和长度相同,则按字节一一对应地传送。 - 如果接收项与发送项长度不相同,而两者都是数值数据项,则按小数点对齐原则处理。 如果是整数,则认为小数点在最后一位数字之后。接收项长度大于发送项,则多余位补 零,接收项长度小于发送项,则产生截断。 - 对字母或字符数据的传送,按左对齐原则处理。如接收项长度大于发送项的长度,则多 余位置补空格,如接收项长度小于发送项的长度,则从右端截断。 - MOVE 语句可以将一初等项内容传送给另一初等项,也可以将一组合项内容传送给一初 等项,也可以将一初等项内容传送给一组合项。 - 发送项是数值型数据,而接收项是编辑数值型数据,则先将发送项中数据 按接收项的描述要求进行编辑,然后再传送。(比如 01 A. 03 A-1 PIC 9V9. 03 A-2 PIC 9.9. MOVE A-1 TO A-2. 假如A-1是1.2 ,内存中显示是12,MOVE之后在A-2中显示的是1.2。) - MOVE A(2:6) TO B。(将变量A 从第二位开始取出6 位传送给变量B) 转移语句(GO TO 语句) GO TO 语句是一个无条件转移语句,程序执行到此语句时,无条件 地转到指定的节或段去。但是,程序中尽量少使用,以避免无限循 环(死循环) 一般格式: GO TO 过程名 条件语句(IF 语句) 关系运算符意义 IS GREATER THAN IS LESS THAN IS EQUAL TO NOT GREATER THAN NOT LESS THAN NOT EQUAL TO (>) (<) (=) (NOT >) (NOT <) (NOT =) IF 语句的两种形式 IF 条件语句组 IF 条件语句组1 ELSE 语句组2 大于 小于 等于 不大于 不小于 不等于 执行语句(PERFORM 语句) 在一个COBOL 程序中,往往有一部分语句是需要多次执行的。我们 希望重复的部分只出现一次,即把重复的部分单独写成一段或一节。 每次需要执行这部分语句时转去该段,执行完后转回来。这时需要 用到执行语句(PERFORM 语句)。另外,当程序很长时,也可以分成若 干个节,这些节的调用也是通过这时执行语句(PERFORM 语句)。 PERFORM 语句的一般形式: PERFORM 过程名1 [THRU 过程名2] 停止语句(STOP 语句) 当实现了程序预期的要求后,应使程序停止执行。 格式为:STOP RUN 第五章 过程部之高级语句 语句列表 初始化语句(INITIALIZE 语句) 对应传送(带CORRESPONDING 子句的MOVE 语句) 四舍五入处理(ROUNDED 子句) 余数字句(REMAINDER 子句) IF 语句 EVALUATE 语句 CONTINUE 语句 字符串连接语句(STRING 语句) 字符串分解语句(UNSTRING 语句) 检测语句(INSPECT 语句) 执行语句(PERFORM 语句) 出口语句(EXIT 语句) 初始化语句(INITIALIZE 语句) INITIALIZE 语句将数据项的值设置为初始值。如果不指定要设置的数 据项数值,则数字和数字编辑型数据初始化为0,其它所有数据项初始 化为空格。 INITIALIZE 语句的一般形式: INITIALIZE 数据名 [REPLACING ALPHABETIC ALPHANUMERIC NUMERIC DATA BY id-lit] ALPHANUMERIC-EDITED NUMERIC-EDITED MOVE语句的高级技巧 同类型数据间的传送规则 数值型数据之间的传送,按小数点位置对齐,如发送项长于接收项, 则多余位截去,如短于接收项,接收项的空位补零 字母或字符型数据间的传送,按左端对齐,如发送项长于接收项, 右端多余位截去,如短于接收项,右端补空格 编辑传送。发送项是数值型数据,而接收项是编辑数值型数据,则 先将发送项中数据按接收项的描述要求进行编辑,然后再传送。不能 由编辑型数据传送给数值型数据 MOVE语句的高级技巧 (1).同类型数据间的传送规则: 数值型数据之间的传送,按小数点位置对齐,如发送项长于接收项,则多余位截 去,如短于接收项,接收项的空位字母或字符型数据之间的传送,按左端对齐,如发送项 长于接收项,右端多余位截去,如短于接收项,右端补空格。 (2).编辑传送 发送项是数值型数据,而接收项是编辑数据型数据,则先将发送项中数据按接收项的描述 要求进行编辑,然后再传送。 传送的方向是:由数值形数据传送给编辑型数据,而不能由编辑型数据传送给数值型数 据。 77 A PIC 9(4)V99 77 B PIC $(6). 99 MOVE A TO B 是正确的 MOVE B TO A 是错误的 MOVE语句的高级技巧 不同类型数据间的传送 非法的传送 - 数值编辑项、字符编辑项、SPACE、字母数据项不能传送给数值数据项或数 值编辑项 - 数值常量、ZERO、数值数据项、数值编辑项都不能传送给字母数据项 - 非整数的数值数据项或数值常量不能传送给字符数据项或字符编辑数据项 合法的传送 - 接收项为字符数据项或字符编辑项,而发送项的长度大于接收项的时候, 按“对齐”原则,超出部分截断。如长度小于接收项,多余位置补空格。 当发送项的描述是带符号的数值时,符号不予传送。 - 接收项是数值项或数值编辑项(初等项),可以接收数值项的数据以及内 容为全数字的字符型数据项。 - 接收项是字母型,按左对齐原则接收字母致富,多余位置补空格。但它不 应该接收非字母的字符。 长度溢出处理: 77 A PIC 9V9 VALUE 1.2. 77 B PIC 9V9 VALUE 9.0. 77 C PIC 9V9. MULTIPLY A BY B 如果改为 GIVING C. 则C为08。 MOVE语句的高级技巧 组合项的传送 组合项的传送是将发送项的内容不加转换地一个字节一个字节地 顺序传送到接收项。 - 若发送项与接收项都是组合项,而且其结构和描述都相同,则 可看作将各初等项一一对应传送。 - 如果发送项和接收项长度相同,但结构形式不同,则将发送项 的内容原样不变地自左向右传送到接收项 - 如果传送时,发送项与接收项长度不同,按:左对齐,右补空 格,多余位截去 MOVE语句的高级技巧 对应传送(带CORRESPONDING 子句的MOVE 语句) 我们尽量不在同一个COBOL 源程序中使用相同的数据名。但是,在比较复杂的COBOL 程序中往往使用同一个数据名来代表不同的数据项。如同名现象。这时应使用限定词 OF 把数据名变成唯一,只用一次限定词OF 达不到把数据名变成唯一时可多次使用限定 词OF。 对应传送或同名传送的一般格式: MOVE CORR(CORRESPONDING) 标识符1 TO 标识符2 说明: (也可以有ADD CORR A TO B.则使跟他们对应的相加,比如A中的A1与B中的A1, A中的A2与B中的A2相加) ⑴如果两个组合项中包括的项不同,则只传送同名的项(不同名的保留)。 ⑵传送的两者间必须有成对的同名数据项,而且这一对中必须至少有一个项是初等项。 01 A. 01 B. 例如: 01 A. 01 A1. 02 AI PIC X(3). 02 BI PIC X(4). 02 B PIC X(2). 03 B PIC X(2). 02 A2 PIC X(4). 02 B2 PIC X(3). 02 C. 03 C. 假如A 是(A1)ABC(A2)DEFG如果是MOVE A TO B.则B是 03 C1 PIC X(4). 05 C3 PIC X(6). (BI)ABCD(B2)EFG. 03 C2 PIC X(5). 05 C4 PIC X(3). 如果是MOVE COPR A TO B.则B是(BI)DEFG(B2)ABC. ⑶所谓同名指的是它们有相同的全程受限。 ⑷带有RENAME子句或REDEFINES子句 或OCCURS子句的数据项不予以传送。 四舍五入处理(ROUNDED 子句) ROUNDED 子句的作用是按照数据项的描述要求对多余位截断,然后对截断的后一 位数进行四舍五入处理。如果计算结果有多个,则应分别说明哪一个接收项要进 行舍入处理,ROUNDED 应写在有关接收项的数据名的后面。如: 长度溢出处理: 77 A PIC 9V9 VALUE 1.2. ADD A B C TO D E F ROUNDED G ROUNDED H. 77 B PIC 9V9 VALUE 9.0. eg: 77 C PIC 9V9. 则C为08。 MULTIPLY A BY B ADD A, B TO C ROUNDED C PIC 9(3). A PIC 9(3)V9(2). B PIC 9(3)V9(2). GIVING C. 如果改为 MULTIPLY A BY B GIVING C ON SIZE ERROR. DISPLAY “ERROR”. //系统自动判断是否溢出。 STOP RUN. 假设A的值是10.23, B的值是10.24,C的值是100,则实际是120。如果C改为 PIC 9(3)V9(1)则为120.5 。 余数字句(REMAINDER 子句) 除法语句只能求商,不能求余数。可用REMAINDER 子句求出余数。 如: DIVIDE 1.5 INTO 7 GIVING C REMAINDER D. 说明: - 商和余数的值不仅取决于被除数和除数,还取决于数据部中对商和余数 的描述。 - 如果ROUNDED 子句,它只对商起作用。 IF 语句高级应用 符号条件 用来检查某数据项的值的代数符号。 符号条件的一般形式: 数据名 IS [NOT] POSITIVE(正:还可表示为”IF … > ZERO”) 算术表达式 NEGATIVE(负:还可表示为”IF … < ZERO”) ZERO(还可表示为”IF … = ZERO”) 类型条件 检查数据项的类型是否符合指定的要求。 类型条件的一般形式: 标识符 IS [NOT] NUMERIC ALPHABETIC IF 语句高级应用 复合条件 由若干个简单的条件可以组成复合的条件。COBOL 用到的逻辑运算符有:AND、OR、 NOT。如果在同一个IF 语句中用到AND,OR,NOT,运算顺序按NOT,AND,OR 的次序。 IF 语句的嵌套(通常最多允许四层IF 语句的嵌套) 字符串连接: (接后面的字符串连接语句(STRING)) IF 条件1 语句组1 STRING A,B,C DELIMITED BY SIZE INTO D. ( IF 条件11 如果: A B C 语句组11 A B C D E E F ELSE 则: D 语句组12 A B C D E E F END-IF ) ELSE 符号条件 IF 数据名 IS[NOT] POSITIVE(+) 语句组2 NEGATIVE(-) ( IF 条件22 ZERO(0) 语句组21 类型条件 IF 数据名 IS[NOT] NUMERIC ELSE AIPHABETIC 语句组22 END-IF ) IF A>=B <= IF A>=B OR C= D AND E=F END-IF OR C= D AND E=F EVALUATE 语句 EVALUATE 语句根据一系列表达式的值,从一大组语句中选择一组要执行的语句。 一般格式:(EVALUATE 语句可以嵌套) ①EVALUATE 变量 WHEN 值A WHEN 值1 THRU 值2 WHEN OTHER END-EVALUATE. ②EVALUATE 变量1,变量2,变量3 WHEN 值1,ANY,值2 WHEN ANY,ANY,值2 WHEN OTHER END-EVALUATE. ③EVALUATE TRUE WHEN 表达式1 WHEN 表达式2 WHEN OTHER END-EVALUATE. CONTINUE 语句 CONTINUE 语句什么也不干,只是一个语句占位符。通常与EVALUATE 语句的“WHEN OTHER”一起使用,达到跳出EVALUATE 语句的目的。 字符串连接语句(STRING 语句) 1.STRING 语句用来将多个非数值型的数据项的值连接起来送到一个接收数据项中。 可以在传送时插入所需字符。一般格式: STRING {标识符1} [,标识符2]… DELIMITED BY {标识符3} [{标识符 4} [, 标识符5]… DELIMITED BY {标识符6}] INTO 标识符7 [WITH POINTER 标识符8] [ON OVERFLOW 强制语句] 2.DELIMITED 短语用来控制各个发送项的终止位置。如果是DELIMITED BY SIZE 表 示将整个发送项的字符全部送到接收项。也可以使用其它字符串作定界符。 3.如果不想从接收项的最左端开始接收字符而从中间某一字符位开始向右接收字字 符,可以用POINTER 短语。 说明: - 接收字符串的数据项必须是初等项,且不能有JUST RIGHT 字句和编辑字符。 指针项必须是一个整形的初等项。 接收项中未被送入的字符位置上保持原有内容,而不会自动设置空格。 强制语句是无条件的执行语句,IF 语句是有条件的执行语句 字符串分解语句(UNSTRING 语句) 1.将一个发送项的数据分别传送到多个接收项中。一般格式: UNSTRING {标识符1} [DELIMITED BY [ALL] { 标识符2} [OR [ALL] { 标 识符3}]…] INTO 标识符4 [,DELIMITER IN 标识符5] [,COUNT IN 标 识符6] [标识符7 [,DELIMITER IN 标识符8] [,COUNT IN 标识符9]…] [WITH POINTER 标识符10] [TALLING IN 11 ] [ON OVERFLOW 强制语句] 2. 可以用DELIMITED 短语来作分解时的定界符。如果在DELIMITED BY 后面加一 个 ALL 表示定界符是长度不定的一个常量。 3. 可以用COUNTER 短语将以发送的字符个数计入用户定义的计数数据中。 4. 定界符存储短语DELIMITER。当DELIMITER 短语和COUNTER 短语一起使用时, DELIMITER 短语应在前面。 5. 如果希望从发送项某一指定的位置开始传送可以使用POINTER 短语。 6. 接收项计数短语TALLYING。用来记录实际接收传送的接收项项数。 说明: ⑴本语句短语较多,应注意各短语的前后次序。 ⑵发送项可以是组合项,也可以是字符型初等项或字符编辑型数据。 ⑶接收项可以是字母型、字符型、数值型的,但不能是编辑型数据项。 ⑷如果发送项和接收项长度不等,按MOVE 语句的规定对发送项截断或对接 收项补空格或零。 检测语句(INSPECT 语句) 检测语句的的作用 - 用一个指定的字符去代替另外一个指定的字符。 - 累计一个指定字符出现的次数。 - 用BEFORE/AFTER 指定被检测区间。 Eg:INSPECT A TALLYING N FOR ALL 检测语句的的格式 ⑴替换的检测:INSPECT 标识符 REPLACING 短语。 例1: INSPECT W-STR1 REPLACING ALL “A” BY “B” 该语句是检测到W-STR1中的每一个“A”,并且将所有“A”替换成“B”。 例2: INSPECT W-STR1 REPLACING ALL "A" BY "C" BEFORE ".". 该语句是用"C"替换"."前的所有"A"。(W-STR1="AAB.AD") ⑵ 累计的检测:INSPECT INSPECT 标识符 TALLYING 短语。 例1: INSPECT W-STR1 TALLYING W-CNT1 FOR ALL “A". 该语句是检测W-STR1 中“A”出现的次数并且将该次数放入到W-CNT1 中。 例2: INSPECT W-STR1 TALLYING W-CNT1 FOR ALL " " BEFORE "." 该语句是检测W-STR1 中位于"."前的" "(空格)出现的次数并且将该次数 放入到W-CNT1 中。(W-STR1="1 . 2") 执行语句(PERFORM 语句) PERFORM 语句的嵌套 嵌套不能交叉。后一个被调用的语句序列或者全部在前一个被调用的语句序列之中,或者全部 在它之外是正确的。 使用PERFORM 语句实现循环 有时需要利用一个PERFORM 语句多次执行同一个语句序列。这种形式的PERFORM 语句的一般格 式为: PERFORM 过程名1 THRU 过程名2 标识符 TIMES 如果此标识符的值在执行语句序列中有变化,不会影响执行的次数。 执行语句的较复杂形式 1.PERFORM 过程名1 THRU 过程名2 [WITH TEST BEFORE ]UNTIL 条件 AFTER 指定WITH TEST 从句可以选择在第一次执行之前或之后判断条件。省略WITH TEST 从句等效于BEFORE,既执行之前进行条件判断。 2.多重循环形式(从内层开始向外层实行) 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] COBOL 允许用到三重循环。 出口语句(EXIT 语句) EXIT 语句提供了一组过程的公共出口,或者说它指出了被调用过程的逻辑终 点。EXIT 语句不使计算机产生任何操作,能将被调用过程和调用过程的后续 过程连接起来。一般用来作PERFORM语句调用的语句序列的出口,使程序返回 到PERFORM语句的下一个语句上去。注意EXIT 语句必须是本段中唯一的语 句,即该段中不允许有其它语句。EXIT 语句前必须有一段名。 转换语句(TRANSFORM) TRANSFORM A FROM ‘K’ TO ‘T’. 第六章 数据部之高级语句 REDEFINES子句 不同的数据项可以共用内存中的同一段空间。重定义字句的一般格式为: 层号 数据名1 REDEFINES 数据名2 使用规则: - 数据名2 与数据名1 的层号必须相同。 - 用REDEFINES 子句的描述体应紧跟在被重新定义的数据项的描述之后,中间不能插 入其它项的描述说明。 - 可以多次重定义,但必须紧跟出现,而且要求使用最初定义的数据名。 - REDEFINES 子句不能用于文件节的01 层。如果是多格式记录文件,系统默认共用同 一内存区,当记录长度不同时,内存区长度按记录长度最大分配。 - REDEFINES 子句可以改变数据的结构,但数据名1 和数据名2 的长度应相等。 EG: 02 A PIC 9(3). 02 B REDEFINES A PIC X(3). MOVE 123 TO A..则A为123,B为123. A,B定义的长度必须相等。 计算用A,打印用B, B,A共用一段内存 REDEFINES子句 - ⑹REDEFINES 子句应在其它子句之前。 - ⑺ REDEFINES 子句所在的描述体中不能使用VALUE 子句赋初值。 - ⑻内存中的值为数据名1 和数据名2 共享。(无论数据名1 和数据名2 哪一个的值发生 变化,都会使数据名1和数据名2 的值同时发生变化, 数据名1和数据名2 的值始终相同) 补充说明: - 有时需要定义部分记录,但知道这部分永远不会用到。用FILLER 关键字占有这个记录 部分的位置。例如帐票的表头。 - 如果是组合项,总长度一致可以。但是重定义的必须在后边。 - 例: - 02 A. 03 A1 PIC 9(4). 03 A2 PIC X(6). 03 A3 PIC X(4). - 02 B REDEFINES A. 03 B1 PIC X(5). 03 B2 PIC X(6). 03 B3 PIC 99V99. 重定义字句(REDEFINES 字句) 重命名子句(RENAMES 子句)的作用是把原来已经定义的某些数据项重新组合成一 个新项,并以一个新名字来代表它。但重命名子句不能改变原来各初等项的内容 和长度等属性。 一般格式: 66 数据名1 RENAMES 数据名2 [THRU 数据名3] 使用规则: - 层号只能用66,它必须紧跟在需要重命名数据项所在01 层记录中最后一个数据 描述体后面,因为它是对该记录中有关部分重新组合和命名的。 - 如无THRU 部分,则数据名1 和数据名2 代表的是同一内容。只重定名,不重新 组合。 - 如用THRU 部分,数据名2 在记录中的位置应该在数据名3 之前,而且数据名3 不应包括在数据名2 之中。此时数据名1 是一个组合项,包括从数据名2 到数 据名3 之间的所有初等项。 - 重命名子句(RENAMES 子句)只能用于工作单元节中,不能用于文件节中。 遇零置空子句(BLANK 子句) BLANK 子句的作用是当数据项的值为零时,使它的内容改 变为空白。只能用于数值型或编辑数值型的初等项。如: 03 W-BLKZR PIC 9(02) BLANK WHEN ZERO. MOVE 10 TO W-BLKZR. DISPLAY "M W-BLKZR=" W-BLKZR. MOVE ZERO TO W-BLKZR. DISPLAY "G W-BLKZR=" W-BLKZR. (执行情况==> M W-BLKZR=10 G W-BLKZR= ) 对齐子句(JUSTIFIED 子句) 可以用JUSTIFIED 子句改变非数据型数据的对齐方式,该子句不 能用于数值型数据项和编辑型数据项,这两种类型的数据项按小数 点对齐定位。如: 03 W-TSTJST PIC X(08) JUST RIGHT. (右对齐) 03 W-TSTJSTL PIC X(08). (左对齐) MOVE "ABCD" TO W-TSTJST. DISPLAY "W-TSTJST=" W-TSTJST, ".". MOVE "ABCD" TO W-TSTJSTL DISPLAY "W-TSTJSTL=" W-TSTJSTL, ".". (执行情况==> W-TSTJST= ABCD. W-TSTJSTL=ABCD .) 符号子句(SIGN 子句) SIGN 子句的作用:用SIGN 子句指定数值型数据描述体中运算符号的状态和位置。 SIGN 子句的使用方法: - 在没有SIGN 子句时,数值的符号是存放在数据项的最后一个字节中。 03 W-STSTNUM2 PIC S9(06). 符号在数值的后部 - 用SIGN 子句可以指定符号在数值的前部还是后部。 03 W-STSTNUM1 PIC S9(06) SIGN IS LEADING. 符号在数值的前部 03 W-STSTNUM2 PIC S9(06) SIGN IS TRAILING.符号在数值的后部 - 用SEPARATE 指定符号单独占一个字节。 03 W-STSTNUM3 PIC S9(06) SIGN IS LEADING SEPARATE. 数据项W-STSTNUM3 在内存中占7 个字节,当W-STSTNUM3 的值为‘-112200’时, 则内存中的情况为: 01100000/11110001/11110001/11110010/11110010/11110000/11110000 符号子句(SIGN 子句) SIGN 子句的注意事项: - SIGN 子句只能用于PIC 字符中含有’ S’的数值型数据描述体中。 - 使用SIGN子句的数据项的用法(USAGE) 应当是USAGE DISPLAY ( 显示的或隐含的)。不能用于计算型用法的数据项。 - 数值型数据项在向字符型数据项传送数值时,符号不予传送,相当 于没有这个符号一样。 - 如果一个数据项的描述体中包含SIGN 子句,则数据项的值应包括 正或负的符号,否则会出错。 数组子句(OCCURS 子句) OCCURS 子句指定数据项为固定项目数或可变项目数的数组。OCCURS 子句不能 用于01 和77 层的项目,但可以用于基本或组合数据项目。如: 01 TIME-WORKED. 03 WEEK PIC 9 OCCURS 7 TIMES. COBOL 允许在OCCURS 子句所在组的下属项目中使用OCCURS 子句,从而提供多 维数组。如: 01 TIME-WORKED. 03 MONTH OCCURS 12.(12 个月) 05 DAY OCCURS 31 TIMES.(31 天) 07 REGULAR PIC 99. 引用多个OCCURS 子句的数据项时,第一个下标是最外边的OCCURS,后续下标 一直继续到最里层。 第七章 子程序 子程序概述 PERFORM 语句可以使某一语句序列重复执行若干次。PERFORM 语句所调用 的语句序列必须也在以该名字命名的程序中。如果要调用的部分比较复杂, 则会使程序冗长、庞杂、使编制者和阅读者都会感到不便,我们可以把程 序中要调用的这部分语句放在另外一个程序中,就是子程序。我们把原来 的程序称主程序。特别当被调用的部分不仅是一个程序需要调用它,而且 多个程序都需要调用它时,把它单独编成子程序更为方便,可以被各个程序 共用。 - 主程序可以调用子程序,子程序不可以调用主程序。 - 子程序可以再调用其它子程序,即子程序可以嵌套。 - 一个程序不可以直接或间接调用自己,即COBOL 语言不允许递归调用。 使用子程序的优点 可以根据需要建立一个主程序和一批子程序,使主程序结构简化, 程序的结 构层次清晰。 子程序易于编写,易于调试,减少错误。 可以将一个大的程序分为主程序和若干个子程序,分别由若干人完成,便于 多个程序员合作共同编制一个复杂程序。 修改子程序比较容易。 通用性强。将常用的一些程序写成子程序,供各用户使用,减少重复劳动。 调用格式 调用语句的一般格式为: CALL 子程序名 [USING 数据名1,…] 被调用程序中过程部部头的一般格式为: PROCEDURE DIVISION [USING 数据名1,…] 主程序: 子程序: MOVE 2 TO A. MOVE 8 TO B. CALL SUB USING A, B, C. MOVE C TO T. DISPLAY C. STOP RUN. PROCEDURE DIVISION USING X, Y, Z. COMPUTE Z = X - Y. EXIT PROGRAM. 说明 主程序中CALL 语句中USING 子句用到的参数的个数和子程序中过程部部头USING 子句用到的参数的个数必须相等。 主程序和子程序中USING 子句中各参数是依照它们各自的次序确定关系的,而不 是依照名字相同来确定对应关系的。每个程序中定义的数据名只在本程序中有效。 在执行子程序期间主程序和子程序中相应的数据名共享内存中同一段存储单元。 调用程序和被调用程序的相应的数据项的长度应相同,如果相应数据项的类型不一 致,则按不同类型数据之间的数据传送规则进行类型转换。 可以由调用程序将数据传递给子程序,也可以由子程序将数据传回调用程序,主程 序和子程序之间也可以无数据的传递。 按引用(BY REFERENCE)或按内容(BY CONTENT)传递参数。BY CONTENT从句表示调 用程序中参数的内容被复制到被调用程序的连接节。子程序可以修改这个数据, 但调用程序中的参数不变。BY REFERENCE 参数表示被调用程序实际引用调用程序 中参数的内容。子程序可以修改这个数据,调用程序中的参数也改变。缺省为BY REFERENCE。 子程序的结构 标识部:遵守按名字进行管理和调用的原则,即程序名不能重复。 环境部:指出子程序的运行环境。 数据部:在子程序中用到的数据项有两种情况:一是与调用程序无关的数据项, 一是与调用程序有联系的数据项。在子程序中专门设一个联接节(LINKAGE SECTION), 用来说明与调用程序有数据联系的数据项,如果调用程序与被调用 程序之间不发生参数传递,则可以不设该节。但是联接节的数据描述不能VALUE 子句。 过程部: 首先,过程部的头部的格式为: PROCEDURE DIVISION USING X, Y, Z. 其次,过程部还要有程序出口语句: EXIT PROGRAM. (子程序中逻辑上最后一个语句) 补充说明: CANCEL语句让被调用的子程序返回初始状态,关闭打开的文件,将VALUE从 句指定数据项复位原值(CANCEL 子程序名)。 问题讨论 参考资料 COBOL 语言 (谭浩强) COBOL for OS/390 & VM Programming (IBM) Guide