COBOL - Xử lý bảng
Mảng trong COBOL được gọi là bảng. Mảng là một cấu trúc dữ liệu tuyến tính và là một tập hợp các mục dữ liệu riêng lẻ cùng kiểu. Các mục dữ liệu của bảng được sắp xếp nội bộ.
Khai báo bảng
Bảng được khai báo trong Phân chia dữ liệu. Occursmệnh đề được sử dụng để xác định một bảng. Mệnh đề xảy ra chỉ ra sự lặp lại của định nghĩa tên dữ liệu. Nó chỉ có thể được sử dụng với số cấp bắt đầu từ 02 đến 49. Không sử dụng mệnh đề xảy ra với Định nghĩa lại. Mô tả bảng một chiều và hai chiều như sau:
Bảng một chiều
Trong bảng một chiều, occursmệnh đề chỉ được sử dụng một lần trong khai báo. WSTABLE là mục nhóm có chứa bảng. WS-B đặt tên cho các phần tử bảng xuất hiện 10 lần.
Syntax
Sau đây là cú pháp để xác định bảng một chiều:
01 WS-TABLE.
05 WS-A PIC A(10) OCCURS 10 TIMES.
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-A PIC A(10) VALUE 'TUTORIALS' OCCURS 5 TIMES.
PROCEDURE DIVISION.
DISPLAY "ONE-D TABLE : "WS-TABLE.
STOP RUN.
JCL để thực hiện chương trình COBOL ở trên -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Khi bạn biên dịch và thực thi chương trình trên, nó tạo ra kết quả sau:
ONE-D TABLE : TUTORIALS TUTORIALS TUTORIALS TUTORIALS TUTORIALS
Bảng hai chiều
Một bảng hai chiều được tạo với cả hai phần tử dữ liệu có độ dài thay đổi. Để tham khảo, hãy xem qua cú pháp và sau đó thử phân tích bảng. Mảng đầu tiên (WS-A) có thể xảy ra từ 1 đến 10 lần và mảng bên trong (WS-C) có thể xảy ra từ 1 đến 5 lần. Với mỗi mục WS-A sẽ có 5 mục WS-C tương ứng.
Syntax
Sau đây là cú pháp để xác định bảng hai chiều:
01 WS-TABLE.
05 WS-A OCCURS 10 TIMES.
10 WS-B PIC A(10).
10 WS-C OCCURS 5 TIMES.
15 WS-D PIC X(6).
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-A OCCURS 2 TIMES.
10 WS-B PIC A(10) VALUE ' TUTORIALS'.
10 WS-C OCCURS 2 TIMES.
15 WS-D PIC X(6) VALUE ' POINT'.
PROCEDURE DIVISION.
DISPLAY "TWO-D TABLE : "WS-TABLE.
STOP RUN.
JCL để thực hiện chương trình COBOL ở trên -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Khi bạn biên dịch và thực thi chương trình trên, nó tạo ra kết quả sau:
TWO-D TABLE : TUTORIALS POINT POINT TUTORIALS POINT POINT
Chỉ số dưới
Các phần tử riêng lẻ của bảng có thể được truy cập bằng cách sử dụng chỉ số con. Giá trị chỉ số con có thể nằm trong khoảng từ 1 đến số lần bảng xảy ra. Chỉ số phụ có thể là bất kỳ số dương nào. Nó không yêu cầu bất kỳ khai báo nào trong phân chia dữ liệu. Nó được tạo tự động với mệnh đề xảy ra.
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-A OCCURS 3 TIMES.
10 WS-B PIC A(2).
10 WS-C OCCURS 2 TIMES.
15 WS-D PIC X(3).
PROCEDURE DIVISION.
MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE.
DISPLAY 'WS-TABLE : ' WS-TABLE.
DISPLAY 'WS-A(1) : ' WS-A(1).
DISPLAY 'WS-C(1,1) : ' WS-C(1,1).
DISPLAY 'WS-C(1,2) : ' WS-C(1,2).
DISPLAY 'WS-A(2) : ' WS-A(2).
DISPLAY 'WS-C(2,1) : ' WS-C(2,1).
DISPLAY 'WS-C(2,2) : ' WS-C(2,2).
DISPLAY 'WS-A(3) : ' WS-A(3).
DISPLAY 'WS-C(3,1) : ' WS-C(3,1).
DISPLAY 'WS-C(3,2) : ' WS-C(3,2).
STOP RUN.
JCL để thực hiện chương trình COBOL ở trên -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Khi bạn biên dịch và thực thi chương trình trên, nó tạo ra kết quả sau:
WS-TABLE : 12ABCDEF34GHIJKL56MNOPQR
WS-A(1) : 12ABCDEF
WS-C(1,1) : ABC
WS-C(1,2) : DEF
WS-A(2) : 34GHIJKL
WS-C(2,1) : GHI
WS-C(2,2) : JKL
WS-A(3) : 56MNOPQR
WS-C(3,1) : MNO
WS-C(3,2) : PQR
Mục lục
Các phần tử bảng cũng có thể được truy cập bằng chỉ mục. Chỉ mục là một sự dịch chuyển của phần tử từ đầu bảng. Một chỉ mục được khai báo với mệnh đề xảy ra bằng mệnh đề INDEXED BY. Giá trị của chỉ mục có thể được thay đổi bằng cách sử dụng câu lệnh SET và tùy chọn thay đổi PERFORM.
Syntax
Sau đây là cú pháp để xác định Chỉ mục trong bảng:
01 WS-TABLE.
05 WS-A PIC A(10) OCCURS 10 TIMES INDEXED BY I.
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-A OCCURS 3 TIMES INDEXED BY I.
10 WS-B PIC A(2).
10 WS-C OCCURS 2 TIMES INDEXED BY J.
15 WS-D PIC X(3).
PROCEDURE DIVISION.
MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE.
PERFORM A-PARA VARYING I FROM 1 BY 1 UNTIL I >3
STOP RUN.
A-PARA.
PERFORM C-PARA VARYING J FROM 1 BY 1 UNTIL J>2.
C-PARA.
DISPLAY WS-C(I,J).
JCL để thực hiện chương trình COBOL ở trên -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Khi bạn biên dịch và thực thi chương trình trên, nó tạo ra kết quả sau:
ABC
DEF
GHI
JKL
MNO
PQR
Đặt câu lệnh
Câu lệnh set được sử dụng để thay đổi giá trị chỉ mục. Động từ set được sử dụng để khởi tạo, tăng hoặc giảm giá trị chỉ mục. Nó được sử dụng với Tìm kiếm và Tìm kiếm Tất cả để xác định vị trí các phần tử trong bảng.
Syntax
Sau đây là cú pháp để sử dụng câu lệnh Set:
SET I J TO positive-number
SET I TO J
SET I TO 5
SET I J UP BY 1
SET J DOWN BY 5
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-A OCCURS 3 TIMES INDEXED BY I.
10 WS-B PIC A(2).
10 WS-C OCCURS 2 TIMES INDEXED BY J.
15 WS-D PIC X(3).
PROCEDURE DIVISION.
MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE.
SET I J TO 1.
DISPLAY WS-C(I,J).
SET I J UP BY 1.
DISPLAY WS-C(I,J).
STOP RUN.
JCL để thực hiện chương trình COBOL trên.
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Khi bạn biên dịch và thực thi chương trình trên, nó tạo ra kết quả sau:
ABC
JKL
Tìm kiếm
Tìm kiếm là một phương pháp tìm kiếm tuyến tính, được sử dụng để tìm các phần tử bên trong bảng. Nó có thể được thực hiện trên bảng được sắp xếp cũng như không được sắp xếp. Nó chỉ được sử dụng cho các bảng được khai báo bằng cụm từ Chỉ mục. Nó bắt đầu với giá trị ban đầu của chỉ mục. Nếu phần tử được tìm kiếm không được tìm thấy, thì chỉ mục sẽ tự động tăng lên 1 và nó tiếp tục cho đến cuối bảng.
Example
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.
JCL để thực hiện chương trình COBOL trên.
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Khi bạn biên dịch và thực thi chương trình trên, nó tạo ra kết quả sau:
LETTER M FOUND IN TABLE
Tìm kiếm tất cả
Tìm kiếm Tất cả là một phương pháp tìm kiếm nhị phân, được sử dụng để tìm các phần tử bên trong bảng. Bảng phải được sắp xếp theo thứ tự cho tùy chọn Tìm kiếm Tất cả. Chỉ mục không yêu cầu khởi tạo. Trong tìm kiếm nhị phân, bảng được chia thành hai nửa và nó xác định trong đó một nửa phần tử được tìm kiếm có mặt. Quá trình này lặp lại cho đến khi phần tử được tìm thấy hoặc kết thúc.
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
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.
JCL để thực hiện chương trình COBOL ở trên -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Khi bạn biên dịch và thực thi chương trình trên, nó tạo ra kết quả sau:
RECORD FOUND
93
MNO