一.表的概念
COBOL语言中的表(TABLE)类似于其他高级语言中的数组(ARRAY)。
表中,序号称为下标,相对地址称为位标,下标和位标称为“出现号”。
二.表的建立(OCCURS子句)
格式:OCCURS 整数 TIMES
举例:01 PRODUCT-RECORD.
03 RODUCT OCCURS 20 TIMES.
04 QUANTITY-OF-PRODUCTION PIC 9(6).
04 QANTITY-OF-SALES PIC 9(6).
04 QANTITY-OF-HAND PIC 9(6).
说明:1。OCCURS子句不能出现在77层,因为77层是独立的数据项。
2.OCCURS子句不能用于01层。
3.只有当OCCURS所说明的数据是初等项时,才能在该数据项的描述中使用PIC子句。
4.不能用VALUE子句对表赋初值,不能同时用OCCURS子句和VALUE子句来描述同一数据项。
三.可变长表
格式:OCCURS 整数1 TO 整数2 TIMES DEPENDING ON 数据名1
说明:根据数据名1的值来确定数据项重复的次数。
四.表元素的引用
格式:表名(下标)
说明:1。如果B是一个表,不直接引用表名B而不加下标。
2.如果表元素是组合项,则引用它下属的项(可以是初等项或组合项),也必须用下标指明它是属于哪一个表元素的。
3.如果表元素是组合项,可以用它对下属的数据项进行限定。
4.下标只能是整常数或具有整型值的数据名。
5.下标不能是带下标的数据名,即不能是表元素。
五.给表元素赋初值
1.对包括所有表元素的整个表赋给一个初值,这时可以对表的描述体上面一层的数据项赋一个初值即可。
例1:01 TABLE VALUE IS ZERO.
03 OCCURS 20 PIC 9(3).
例2:01 T VALUE’ABCDEFHIJ’.
02 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)把这个组合项重定义为一个表。
六.用位标法引用表元素
1.位标的概念:位标的值表示表元素在该表中的相对位置(以字节数表示)。
2.位标名的指定方法:在数据部中定义一个表时所用的OCCURS子句中要加上“INDEXED BY 位标名”短语来指定。
说明:(1)由于位标是专门用于引用表元素的特殊数据项,它不能用来进行算术运算。
(2)一维表或多维表的每一维按需要可以指定若干个位标名,引用时这些位标名只能在该维内使用。
(3)有时需要把位标的值转存到另一个数据项中,但由于位标是特殊类型的数据项,因此,需要另外定义一种特殊的数据项叫位标数据项,用来专门存储位标的值。位标数据项在数据部中定义。描述位标数据项用USAGE子句。例如:77 K USAGE IS INDEX.
七.SET(设置)语句
1.作用:将一表元素的相对地址放到指定的位标去。
如: SET I TO 10.
表示将位标I置位到第10个元素的第一个字节的相对地址上去。
2.格式一
SET 标识符1[,标识符2]…… TO 标识符3/位标3/整数
位标1[,位标2]……
规则列表(设SET A TO B)
横-发送项B 竖-接收项A |
整数 |
数值初等项 |
位标名 |
位标数据项 |
数值初等项 |
不合法 |
不合法 |
将位标代表的序号传送 |
不合法 |
位标名 |
将整数(序号)化成相对地址传送 |
同左 |
(1)如果两个位标名指向同一个表,则转换成另一表的相对地址再传送,即将发送项代表的表元素顺序号减1,乘以接收项相关表元素的长度,再传送 |
简单传送 |
位标数据项 |
不合法 |
不合法 |
简单传送 |
简单传送 |
3. 格式二
SET 位标1 [,位标2]…… UP/DOWN BY 标识符/整数
作用:给位标增减一个量。
八.表的检索
1.用于顺序检索的SEARCH语句
格式:SEARCH 表名[VARYING 位标名1/标识符2][AT END 强制语句1]
WHEN 条件1 强制语句2/NEXT SENTENCE
[WHEN 条件2 强制语句3/NEXT SENTENCE]……
举例:SET N TO 1.
SEARCH WORKER-TABLE
AT END DISPLAY‘CANNOT FIND NAME’
WHEN NAME(N)=‘ZHANG SHENG’
DISPLAY NAME(N),PAY(N).
……
SEARCH语句是这样执行的:从指定的表元素开始,检查是否满足WHEN后面指定的条件。如不满足,就使N增值,自动执行一个SET N UP BY 1。使N指向下一个元素的地址,如果查到某一个元素满足指定的条件时,查表工作立即停止,执行WHEN字句中条件后面的语句。
2.用于有序表的SEARCH语句(折半法检索)
(1)说明升(降)序的一般格式为:
ASCENDING/DESCENDING KEY IS 数据名1[,数据名2]……
ASCENDING/DESCENDING KEY IS 数据名3[,数据名4……]……
举例:02 BOOK-TABLE OCCURS 100
ASCENDING KEY IS NAME
DESCENDING KEY IS COD
INDEX BY N.
(2)SEARCH语句的一般格式(之二)
SEARCH ALL 表名[;AT END 强制语句1]
WHEN 条件 强制语句2/NEXT SENTENCE
举例:SEARCH ALL BOOK-TABLE
AT END DISPLAY’CANNOT FIND NAME’
WHEN NAME(N) = ‘COMPUTER DESIGN’
DISPLAY NAME (N),NUM (N).
九.用PERFORM语句对表进行检索
最多可以处理三重循环
格式:
PERFORM 过程名1[THRU 过程名2]
VARYING 位标名1/下标名1 FROM 位标名2/常量1/标识符1 BY 常量2/标识符2 UNTIL 条件1
AFTER 位标名3/下标名2 FROM 位标名4/常量3/标识符3 BY 常量4/标识符4 UNTIL 条件2
AFTER 位标名5/下标名4 FROM 位标名6/常量5/标识符5 BY 常量6/标识符6 UNTIL 条件3