Cobol 문법 (6) : 배열

yoneeki·2023년 8월 17일

cobolGrmr

목록 보기
6/11

배열 정의

  • 배열은 OCCURS구를 사용하여 정의한다.
# 일차원 배열 정의

DATA DIVISION.
.
.

01 BaeYul. 
	03 A PIC 99 OCCURS 5 TIMES.
.
.

설명

01 BaeYul. 
	03 A PIC 99 OCCURS 5 TIMES.
  • 01 : 배열 정의 시에는 계층 번호 01 번을 사용
  • BaeYul : 배열 전체의 명칭
  • 5 : 배열의 요소 수 / 두 자리 숫자를 다섯 개를 수록 가능 (PIC 99)
  • TIMES : 생략 가능

코볼의 인덱스

  • COBOL의 배열은 일반적으로 인덱스가 1부터 시작합니다. COBOL은 다른 일부 프로그래밍 언어와는 달리 0부터 시작하는 배열 인덱스를 지원하지 않습니다.
  • COBOL에서 배열을 선언하고 사용할 때 첫 번째 요소는 인덱스 1을 가지며, 두 번째 요소는 인덱스 2를 가지고, 이렇게 계속됩니다.
01 MY-ARRAY.
   05 ELEMENT-1 PIC X(10).
   05 ELEMENT-2 PIC X(10).
   05 ELEMENT-3 PIC X(10).

MOVE 'Value 1' TO ELEMENT-1
MOVE 'Value 2' TO ELEMENT-2
MOVE 'Value 3' TO ELEMENT-3

DISPLAY ELEMENT-1
DISPLAY ELEMENT-2
DISPLAY ELEMENT-3


// 화면 표시 결과
Value 1
Value 2
Value 3

일차원 배열

배열 실습 (1)

       IDENTIFICATION DIVISION.
       PROGRAM-ID. 08_ARRAY.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01   BaeYul.
            03  A   PIC 99  OCCURS  5.
       01   I PIC 9 VALUE 1.

       PROCEDURE DIVISION.
       SiJak-P.
           MOVE    1234567890   TO  BaeYul
           DISPLAY 'Values after MOVE:'
           PERFORM DISPLAY-A-VALUES
           DISPLAY '-------------------'

           MOVE    12345   TO  BaeYul
           DISPLAY 'Values after another MOVE:'
           PERFORM DISPLAY-A-VALUES
           DISPLAY '-------------------'
       
           STOP RUN.

       DISPLAY-A-VALUES.
           PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5
              DISPLAY 'A(' I ') : ' A(I)
           END-PERFORM.

[결과]

*** 1234567890 할당
Values after MOVE:
A(1) : 12
A(2) : 34
A(3) : 56
A(4) : 78
A(5) : 90 	// 사이좋게 두 자리씩 다 받았음
-------------------
*** 12345 할당
Values after another MOVE:
A(1) : 12
A(2) : 34
A(3) : 5 
A(4) :   	// 두 자리씩 주고 나머지는 할당 안 됨
A(5) :   	// 두 자리씩 주고 나머지는 할당 안 됨
-------------------

배열 실습 (2)

       IDENTIFICATION DIVISION.
       PROGRAM-ID. 09_ARRAY.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  BaeYul.
           03  A   PIC   99    OCCURS  5.
       77  I   PIC     99.
       77  Hab PIC     999     VALUE   0.

       PROCEDURE DIVISION.
       SiJak-P.
           MOVE 1 TO A(1)
           MOVE 2 TO A(2)
           MOVE 3 TO A(3)
           MOVE 4 TO A(4)
           MOVE 5 TO A(5)
           
           DISPLAY "양의 정수 5개.....?"
           PERFORM ChulRyuk VARYING I   FROM 5  BY  -1   UNTIL   I < 1.
           DISPLAY '합계 : ' Hab.
           STOP RUN.

       ChulRyuk.
           DISPLAY A(I).
           ADD A(I) TO Hab.

[결과]

양의 정수 5개.....?
05
04
03
02
01
합계 : 015

이차원 배열

배열 실습 (1)

       IDENTIFICATION DIVISION.
       PROGRAM-ID. 10_2DARRAY.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  BaeYul.
           03  AA               OCCURS  3 TIMES.
               04  A   PIC 99   OCCURS  4.  *> 2차원 배열을 정의

       77  I           PIC 9.
       77  J           PIC 9.

       PROCEDURE DIVISION.
       SiJak.
           PERFORM SooRok.  *> SooRok 프로시저 호출 (2차원 배열 초기화)
           PERFORM AA-Pyosi    VARYING I FROM 1 BY 1 UNTIL I > 3.  *> AA 배열 출력
           PERFORM Keut.  *> Keut 프로시저 호출 (최종 출력)
       
       SooRok.
           MOVE 1 TO I  *> 첫 번째 행으로 초기화
           PERFORM VARYING I FROM 1 BY 1 UNTIL I > 3
               MOVE 1 TO J  *> 첫 번째 열로 초기화
               PERFORM VARYING J FROM 1 BY 1 UNTIL J > 4
                   MULTIPLY I BY J GIVING A(I, J)  *> 각 요소에 I와 J를 곱하여 할당
               END-PERFORM
           END-PERFORM.
       
       AA-Pyosi.
           DISPLAY ' '.
           DISPLAY 'AA (' I ') : ' AA(I).  *> AA 배열 출력
           PERFORM A-Pyosi VARYING J FROM 1 BY 1 UNTIL J > 4.  *> A 배열 출력
       
       A-Pyosi.
           DISPLAY 'A (' I ', ' J ') : ' A(I, J).  *> A 배열 출력

       Keut.
           MOVE 123 TO AA(1).  *> AA 배열의 첫 번째 요소에 값 할당
           DISPLAY '  '.
           DISPLAY 'BaeYul : ' BaeYul.  *> BaeYul 출력
           STOP RUN.  *> 프로그램 종료

[결과]

AA (1) : 01020304
A (1, 1) : 01
A (1, 2) : 02
A (1, 3) : 03
A (1, 4) : 04
 
AA (2) : 02040608
A (2, 1) : 02
A (2, 2) : 04
A (2, 3) : 06
A (2, 4) : 08
 
AA (3) : 03060912
A (3, 1) : 03
A (3, 2) : 06
A (3, 3) : 09
A (3, 4) : 12
  
BaeYul : 123     0204060803060912

삼차원 배열

배열 실습 (1)

IDENTIFICATION DIVISION.
PROGRAM-ID. 11_3DARRAY.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 BaeYul        PIC X(500). *> 결과값을 저장할 변수
01 AAA.
    05 AA OCCURS 3.    *> 면
       10 A OCCURS 3.  *> 행
          15 X OCCURS 4 PIC 99.  *> 열

77 I               PIC 9.  *> 반복문을 위한 인덱스 변수
77 J               PIC 9.
77 K               PIC 9.

PROCEDURE DIVISION.
   SiJak.
       PERFORM SooRok VARYING I FROM 1 BY 1 UNTIL I > 3
                        AFTER J FROM 1 BY 1 UNTIL J > 3
                        AFTER K FROM 1 BY 1 UNTIL K > 4.
       PERFORM PyoSi VARYING I FROM 1 BY 1 UNTIL I > 3
                      AFTER J FROM 1 BY 1 UNTIL J > 3
                      AFTER K FROM 1 BY 1 UNTIL K > 4.
       PERFORM Keut.

   SooRok.
       COMPUTE X(I, J, K) = I * J * K.
       MOVE FUNCTION NUMVAL (X(I, J, K)) TO X(I, J, K).  *> 숫자 값을 문자열로 변환하여 다시 저장

   PyoSi.
       DISPLAY 'A (' I ', ' J ', ' K ') : ' X(I, J, K).

   Keut.
       STRING
             X(1, 1, 1) DELIMITED BY SPACE
             X(1, 1, 2) DELIMITED BY SPACE
             X(1, 1, 3) DELIMITED BY SPACE
             X(1, 1, 4) DELIMITED BY SPACE
             X(1, 2, 1) DELIMITED BY SPACE
             X(1, 2, 2) DELIMITED BY SPACE
             X(1, 2, 3) DELIMITED BY SPACE
             X(1, 2, 4) DELIMITED BY SPACE
             X(1, 3, 1) DELIMITED BY SPACE
             X(1, 3, 2) DELIMITED BY SPACE
             X(1, 3, 3) DELIMITED BY SPACE
             X(1, 3, 4) DELIMITED BY SPACE
             X(2, 1, 1) DELIMITED BY SPACE
             X(2, 1, 2) DELIMITED BY SPACE
             X(2, 1, 3) DELIMITED BY SPACE
             X(2, 1, 4) DELIMITED BY SPACE
             X(2, 2, 1) DELIMITED BY SPACE
             X(2, 2, 2) DELIMITED BY SPACE
             X(2, 2, 3) DELIMITED BY SPACE
             X(2, 2, 4) DELIMITED BY SPACE
             X(2, 3, 1) DELIMITED BY SPACE
             X(2, 3, 2) DELIMITED BY SPACE
             X(2, 3, 3) DELIMITED BY SPACE
             X(2, 3, 4) DELIMITED BY SPACE
             X(3, 1, 1) DELIMITED BY SPACE
             X(3, 1, 2) DELIMITED BY SPACE
             X(3, 1, 3) DELIMITED BY SPACE
             X(3, 1, 4) DELIMITED BY SPACE
             X(3, 2, 1) DELIMITED BY SPACE
             X(3, 2, 2) DELIMITED BY SPACE
             X(3, 2, 3) DELIMITED BY SPACE
             X(3, 2, 4) DELIMITED BY SPACE
             X(3, 3, 1) DELIMITED BY SPACE
             X(3, 3, 2) DELIMITED BY SPACE
             X(3, 3, 3) DELIMITED BY SPACE
             X(3, 3, 4) DELIMITED BY SPACE
             INTO BaeYul
       DISPLAY ' *** SUMMING UP *** '
       DISPLAY 'BaeYul : ' BaeYul
       STOP RUN.

[주석]

IDENTIFICATION DIVISION.
PROGRAM-ID. 11_3DARRAY.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 BaeYul        PIC X(500). *> 결과값을 저장할 변수

* 3차원 배열을 위한 선언
01 AAA.
    05 AA OCCURS 3.    *> 면
       10 A OCCURS 3.  *> 행
          15 X OCCURS 4 PIC 99.  *> 열

77 I               PIC 9.  *> 반복문을 위한 인덱스 변수
77 J               PIC 9.
77 K               PIC 9.

PROCEDURE DIVISION.

* SiJak 섹션: 3차원 배열 초기화를 위한 반복문 수행
   SiJak.
       PERFORM SooRok VARYING I FROM 1 BY 1 UNTIL I > 3
                        AFTER J FROM 1 BY 1 UNTIL J > 3
                        AFTER K FROM 1 BY 1 UNTIL K > 4.

* SooRok 섹션: 3차원 배열 요소 계산 및 숫자를 문자열로 변환하여 저장
   SooRok.
       COMPUTE X(I, J, K) = I * J * K.
       MOVE FUNCTION NUMVAL (X(I, J, K)) TO X(I, J, K).

* PyoSi 섹션: 3차원 배열 요소를 화면에 출력
   PyoSi.
       DISPLAY 'A (' I ', ' J ', ' K ') : ' X(I, J, K).

* Keut 섹션: 3차원 배열 요소를 문자열로 합친 후 결과를 출력
   Keut.
       STRING
             X(1, 1, 1) DELIMITED BY SPACE
             X(1, 1, 2) DELIMITED BY SPACE
             X(1, 1, 3) DELIMITED BY SPACE
             X(1, 1, 4) DELIMITED BY SPACE
             X(1, 2, 1) DELIMITED BY SPACE
             X(1, 2, 2) DELIMITED BY SPACE
             X(1, 2, 3) DELIMITED BY SPACE
             X(1, 2, 4) DELIMITED BY SPACE
             X(1, 3, 1) DELIMITED BY SPACE
             X(1, 3, 2) DELIMITED BY SPACE
             X(1, 3, 3) DELIMITED BY SPACE
             X(1, 3, 4) DELIMITED BY SPACE
             X(2, 1, 1) DELIMITED BY SPACE
             X(2, 1, 2) DELIMITED BY SPACE
             X(2, 1, 3) DELIMITED BY SPACE
             X(2, 1, 4) DELIMITED BY SPACE
             X(2, 2, 1) DELIMITED BY SPACE
             X(2, 2, 2) DELIMITED BY SPACE
             X(2, 2, 3) DELIMITED BY SPACE
             X(2, 2, 4) DELIMITED BY SPACE
             X(2, 3, 1) DELIMITED BY SPACE
             X(2, 3, 2) DELIMITED BY SPACE
             X(2, 3, 3) DELIMITED BY SPACE
             X(2, 3, 4) DELIMITED BY SPACE
             X(3, 1, 1) DELIMITED BY SPACE
             X(3, 1, 2) DELIMITED BY SPACE
             X(3, 1, 3) DELIMITED BY SPACE
             X(3, 1, 4) DELIMITED BY SPACE
             X(3, 2, 1) DELIMITED BY SPACE
             X(3, 2, 2) DELIMITED BY SPACE
             X(3, 2, 3) DELIMITED BY SPACE
             X(3, 2, 4) DELIMITED BY SPACE
             X(3, 3, 1) DELIMITED BY SPACE
             X(3, 3, 2) DELIMITED BY SPACE
             X(3, 3, 3) DELIMITED BY SPACE
             X(3, 3, 4) DELIMITED BY SPACE
             INTO BaeYul
       DISPLAY ' *** SUMMING UP *** '
       DISPLAY 'BaeYul : ' BaeYul
       STOP RUN.

[결과]

A (1, 1, 1) : 01
A (1, 1, 2) : 02
A (1, 1, 3) : 03
A (1, 1, 4) : 04
A (1, 2, 1) : 02
A (1, 2, 2) : 04
A (1, 2, 3) : 06
A (1, 2, 4) : 08
A (1, 3, 1) : 03
A (1, 3, 2) : 06
A (1, 3, 3) : 09
A (1, 3, 4) : 12
A (2, 1, 1) : 02
A (2, 1, 2) : 04
A (2, 1, 3) : 06
A (2, 1, 4) : 08
A (2, 2, 1) : 04
A (2, 2, 2) : 08
A (2, 2, 3) : 12
A (2, 2, 4) : 16
A (2, 3, 1) : 06
A (2, 3, 2) : 12
A (2, 3, 3) : 18
A (2, 3, 4) : 24
A (3, 1, 1) : 03
A (3, 1, 2) : 06
A (3, 1, 3) : 09
A (3, 1, 4) : 12
A (3, 2, 1) : 06
A (3, 2, 2) : 12
A (3, 2, 3) : 18
A (3, 2, 4) : 24
A (3, 3, 1) : 09
A (3, 3, 2) : 18
A (3, 3, 3) : 27
A (3, 3, 4) : 36
 *** SUMMING UP *** 
BaeYul : 010203040204060803060912020406080408121606121824030609120612182409182736  

복합 배열

  • 다른 언어에서는 배열의 요소들이 모두 동일한 자료형이어야 하지만 코볼에서는 다른 자료형의 데이터들을 묶어 배열로 만드는 것이 가능하다.
       IDENTIFICATION DIVISION.
       PROGRAM-ID. 12_COMPLEXARRAY.
       
       DATA DIVISION.
       WORKING-STORAGE SECTION.
           01 BaeYul.
               03          AA              OCCURS  3.
                   04      A      PIC 99   OCCURS  2.

       PROCEDURE DIVISION.
           DISPLAY BaeYul.
           STOP RUN.

[설명]

  • 기억장소 BaeYul은 다음과 같이 확보된다.
  • 실제로는 AA 다음에 BB가 배치된다.

배열 실습 (1)

  IDENTIFICATION DIVISION.
  PROGRAM-ID. 13_COMPLEXARRAY.

  DATA DIVISION.
  WORKING-STORAGE SECTION.
      01 BaeYul.
          03 AA OCCURS 3.
              04 A PIC 99 OCCURS 2.
          03 BB OCCURS 3.
              04 B PIC XXX OCCURS 2.
      77 I PIC 9.   *> 반복문을 위한 인덱스 변수
      77 J PIC 9.

  PROCEDURE DIVISION.
  SiJak.
      PERFORM SooRok VARYING I FROM 1 BY 1 UNTIL I > 3
                       AFTER J FROM 1 BY 1 UNTIL J > 2.
      MOVE 'ABCDEF' TO BB(1).    *> BB 배열의 첫 번째 요소에 값 할당
      MOVE 'abcdef' TO BB(2).    *> BB 배열의 두 번째 요소에 값 할당
      MOVE 'UVWXYZ' TO BB(3).    *> BB 배열의 세 번째 요소에 값 할당

      PERFORM PyoSi VARYING I FROM 1 BY 1 UNTIL I > 3.
      PERFORM Keut.

  SooRok.
      MULTIPLY I BY J GIVING A(I, J).    *> A 배열 요소에 값 할당

  PyoSi.
      DISPLAY A(I, 1) ' ' A(I, 2) ' ' B(I, 1) ' ' B(I, 2).    *> A와 B 배열의 일부 요소 출력

  Keut.
      DISPLAY '  '.    *> 빈 줄 출력
      DISPLAY 'BaeYul : ' BaeYul.    *> BaeYul 변수 값 출력
      STOP RUN.
  

[결과]

01 02 ABC DEF
02 04 abc def
03 06 UVW XYZ
  
BaeYul : 010202040306ABCDEFabcdefUVWXYZ

*** A 영역 : 010202040306
*** B 영역 : ABCDEFabcdefUVWXYZ

복합 배열을 어디에 쓸까

INDEXED BY

  • INDEXED BY 구 : 배열의 색인을 정의
    • 계층번호 배열요소명 PIC구 OCCURS n [TIMES] INDEXED BY 명칭1 명칭2....
	01 BaeYul
    	03	A PIC 9(3) OCCURS 5 INDEXED BY SaekIn.

배열 실습 (1)

IDENTIFICATION DIVISION.
PROGRAM-ID. IndexedByExample.

DATA DIVISION.
WORKING-STORAGE SECTION.
    01 MyArray OCCURS 10 TIMES.
        05 ArrayElement PIC 9.
    01 IndexCounter PIC 99.       *> 반복문 인덱스 변수
    01 MyIndex USAGE IS INDEX.     *> INDEXED BY 구문에 사용할 인덱스 변수

PROCEDURE DIVISION.
Main-Procedure.
    MOVE 1 TO IndexCounter.        *> 인덱스 변수 초기화

    PERFORM VaryingLoop VARYING IndexCounter FROM 1 BY 1 UNTIL IndexCounter > 10.

    DISPLAY 'Array contents:'.
    PERFORM DisplayArray VARYING IndexCounter FROM 1 BY 1 UNTIL IndexCounter > 10.

    STOP RUN.

VaryingLoop.
    MOVE IndexCounter TO MyIndex.  *> 현재 인덱스 값을 INDEXED BY 변수에 할당
    MOVE IndexCounter TO ArrayElement(MyIndex).  *> 배열 요소에 값 할당

DisplayArray.
    MOVE IndexCounter TO MyIndex.  *> 현재 인덱스 값을 INDEXED BY 변수에 할당
    DISPLAY 'Element ' IndexCounter ': ' ArrayElement(MyIndex).  *> 배열 요소 출력

[결과]

Array contents:
Element 01: 1
Element 02: 2
Element 03: 3
Element 04: 4
Element 05: 5
Element 06: 6
Element 07: 7
Element 08: 8
Element 09: 9
Element 10: 0

SET

  • SET 문 : 배열 색인의 값을 설정 및 변경
    • SET 색인명칭 TO n.
    • SET 색인명칭 UP (DOWN) BY n.

배열 실습 (1)

IDENTIFICATION DIVISION.
PROGRAM-ID. SetExample.

DATA DIVISION.
WORKING-STORAGE SECTION.
    01 IndexCounter PIC 99.       *> 반복문 인덱스 변수

PROCEDURE DIVISION.
Main-Procedure.
    MOVE 1 TO IndexCounter.        *> 인덱스 변수 초기화

    PERFORM IncreasingLoop VARYING IndexCounter FROM 1 BY 1 UNTIL IndexCounter > 10.

    MOVE 10 TO IndexCounter.       *> 인덱스 변수 초기화

    PERFORM DecreasingLoop VARYING IndexCounter FROM 10 BY -1 UNTIL IndexCounter < 1.

    STOP RUN.

IncreasingLoop.
    DISPLAY 'Increasing Loop: Element ' IndexCounter.
    SET IndexCounter UP BY 2.      *> 인덱스를 2씩 증가시킴

DecreasingLoop.
    DISPLAY 'Decreasing Loop: Element ' IndexCounter.
    SET IndexCounter DOWN BY 3.    *> 인덱스를 3씩 감소시킴

[결과]

Increasing Loop: Element 01
Increasing Loop: Element 04
Increasing Loop: Element 07
Increasing Loop: Element 10
Decreasing Loop: Element 10
Decreasing Loop: Element 06
Decreasing Loop: Element 02

OCCURS..DEPENDING

  • OCCURS..DEPENDING : 배열 요소 개수를 가변적으로 정의
    • 계층번호 배열명 PIC구 OCCURS m TO n [TIMES] DEPENDING ON 기억장소

배열 실습 (1)

IDENTIFICATION DIVISION.
PROGRAM-ID. DynamicArrayExample.

DATA DIVISION.
WORKING-STORAGE SECTION.
    01 ArraySize PIC 99 VALUE 5.  *> 배열 크기를 나타내는 변수
    01 MyArray   OCCURS 0 TO 99 DEPENDING ON ArraySize
                 PIC 9(5).         *> 배열 요소의 PICTURE 정의
    01 IndexCounter PIC 99 VALUE 1.  *> 반복문 인덱스 변수

PROCEDURE DIVISION.
Main-Procedure.
    PERFORM InitializeArray.   *> 배열 초기화 수행

    MOVE 10 TO ArraySize.      *> 배열 크기 변경
    PERFORM DisplayArray.      *> 변경된 크기로 배열 출력 수행

    MOVE 7 TO ArraySize.       *> 배열 크기 다시 변경
    PERFORM DisplayArray.      *> 변경된 크기로 배열 출력 수행

    STOP RUN.

InitializeArray.
    MOVE 1 TO IndexCounter.     *> 반복문 인덱스 초기화
    PERFORM VARYING IndexCounter FROM 1 BY 1 UNTIL IndexCounter > ArraySize
        MOVE IndexCounter TO MyArray(IndexCounter)
    END-PERFORM.

DisplayArray.
    DISPLAY '배열 요소:'
    PERFORM VARYING IndexCounter FROM 1 BY 1 UNTIL IndexCounter > ArraySize
        DISPLAY '인덱스 ' IndexCounter ': ' MyArray(IndexCounter)
    END-PERFORM.

[결과]

배열 요소:
인덱스 01: 00001
인덱스 02: 00002
인덱스 03: 00003
인덱스 04: 00004
인덱스 05: 00005
인덱스 06: 00000
인덱스 07: 00000
인덱스 08: 00000
인덱스 09: 00000
인덱스 10: 00000
배열 요소:
인덱스 01: 00001
인덱스 02: 00002
인덱스 03: 00003
인덱스 04: 00004
인덱스 05: 00005
인덱스 06: 00000
인덱스 07: 00000

레코드와 필드

  • 동일한 형태의 자료가 다수 존재할 때 <자료의 가로방향>을 레코드, <자료의 세로방향>을 필드라고 한다. 필드를 항목(Item)이라고도 한다.
profile
Working Abroad ...

0개의 댓글