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