关于表的基本用法
COBOL里的表类似于c中的数组,但更接近c中的结构体,因为里面的元素可以定义不同的类型。
一维表的定义:
*定义数组,数组名称为WS-DATA,共五个 01 WS-TABLE. 05 WS-DATA PIC A(4) VALUE 'DATA' OCCURS 5 TIMES. *一维标的遍历: DISPLAY 'ONE-D TABLE:' WS-TABLE.
二维表的定义:
*二维表,更像c中的结构式,结构内元素可以定义不同的数据类型。 01 WS-TABLE2. 05 WS-TA OCCURS 10 TIMES. 10 WS-TB PIC A(10) VALUE '外'. 10 WS-TC OCCURS 5 TIMES . 15 WS-TD PIC 9(6) VALUE '1'. *遍历全部二维表,相当于两重for循环,先运行外层,遍历内层,再运行外层,。。。 DISPLAY 'ERWEIBIAO:'WS-TABLE2. DISPLAY 'WS-TABLE2: 'WS-TABLE2. DISPLAY 'WS-TA(1):'WS-TA(1). DISPLAY 'WS-TC(1,1):'WS-TC(1,1). DISPLAY 'WS-TC(1,2):'WS-TC(1,2).
二维表遍历的方法:
01 WS-TABLE3. 05 WS-T3A OCCURS 3 TIMES INDEXED BY I. 10 WS-T3B PIC A(2). 10 WS-T3C OCCURS 2 TIMES INDEXED BY J. 15 WS-T3D PIC X(3). 15 WS-T3D PIC X(3). 01 TAI PIC 9(1) VALUE '1'. 01 TAJ PIC 9(1) VALUE '2'. MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE3. *相当于两重for循环,分别以I和J自增为下标,另索引可直接用定义常量,不是必须将索引定义在表中 PERFORM D-PARA VARYING I FROM 1 BY 1 UNTIL I>3 STOP RUN. D-PARA. PERFORM E-PARA VARYING J FROM 1 BY 1 UNTIL J>2. E-PARA. DISPLAY 'WS-T3C('I','J'):'WS-T3C(I,J). *用定义的TAI和TAJ 也能当作下标来找出对应的值 DISPLAY '-------------------'. DISPLAY 'WS-T3C('TAI','TAJ'):'WS-T3C(TAI,TAJ).
SET 语句:用于更改索引值,Set词用于初始化,递增或递减索引值。它与search和search all一起使用可以定位表中的元素。
应该是相当于for循环中int i=0;;i++的角色。
SET I J TO 1. DISPLAY WS-T3C(I,J). SET I J DOWN BY 1. DISPLAY 'I.J:'I J. DISPLAY WS-T3C(I,J). STOP RUN.
SEARCH 与Search all语法
SEARCH语法,类似于c中的strchr函数,表可以是无序的,原理经过遍历整个表,找出指定字符,另只能寻找一个字符,对字符串无效。
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-TABLE. 05 WS-A PIC X(1) OCCURS 18 TIMES INDEXED BY I. 01 WS-SRCH PIC A(1) VALUE 'M'. PROCEDURE DIVISION. MOVE 'ABCDEFGHIJKLMNOPQR' TO WS-TABLE. SET I TO 1. SEARCH WS-A AT END DISPLAY 'M NOT FOUND IN TABLE' WHEN WS-A(I)=WS-SRCH DISPLAY 'LETTER M FOUND IN TABLE' END-SEARCH. STOP RUN.
Search all 语法:
类似与二分法,寻找指定字符或字符串,所以表一定是有序的。
DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-TABLE.
*下面一行一定要注意长度,不要超过有效长度,不然会报错。 05 WS-RECORD OCCURS 10 TIMES ASCENDING KEY IS WS-NUM INDEXED BY I. 10 WS-NUM PIC 9(2). 10 WS-NAME PIC A(3). PROCEDURE DIVISION. MOVE '12ABC56DEF34GHI78JKL93MNO11PQR' TO WS-TABLE. SEARCH ALL WS-RECORD AT END DISPLAY 'RECORD NOT FOUND' WHEN WS-NUM(I)=93 DISPLAY 'RECORD FOUND ' DISPLAY WS-NUM(I) DISPLAY WS-NAME(I) END-SEARCH.