Cobol 문법 (3) : 연산

yoneeki·2023년 8월 9일

cobolGrmr

목록 보기
3/11

기억형, 편집형 메모리

  • 기억형(Mnemonic) 메모리와 편집형(Edit) 메모리는 COBOL 프로그래밍 언어에서 사용되는 용어입니다.

기억형(Mnemonic) 메모리

기억형 메모리는 COBOL에서 데이터를 저장하고 처리하는 데 사용되는 변수를 정의하는 방식 중 하나입니다. 변수의 이름을 사람이 이해하기 쉬운 형태로 정의하며, 데이터를 표현하고 처리하기 위한 기호적인 이름을 사용합니다. 이는 가독성을 높이고 프로그래머가 코드를 이해하기 쉽도록 도와줍니다.

01 CUSTOMER-NAME PIC X(30).
** 위의 예시에서 CUSTOMER-NAME은 기억형 메모리 변수로, 
** 최대 30개의 문자를 저장할 수 있는 문자열을 나타냅니다.

편집형(Edit) 메모리

편집형 메모리는 COBOL에서 데이터를 보다 특정한 형식으로 표시하거나 처리하기 위해 사용되는 메모리 형식입니다. 숫자를 특정한 형식에 맞게 표시하거나 날짜, 시간 등의 데이터를 원하는 형태로 표현할 때 사용됩니다. 이는 출력 결과의 서식을 지정하거나 데이터 변환 작업을 수행할 때 유용합니다.

01 AMOUNT PIC 9(5)V99.
** 위의 예시에서 AMOUNT는 편집형 메모리 변수로, 
** 소수점 이하 두 자리까지 표시할 수 있는 숫자를 나타냅니다. 
** 특정 출력 형식을 지정할 때 
** 이러한 편집형 메모리를 사용할 수 있습니다.

연산문

ADD (덧셈)

  • ADD..TO (메모리에 수치를 더한다)

    "ADD..TO"는 변수나 필드의 값을 더하는 연산을 의미합니다. 이 연산은 메모리 내의 값을 변경하며, 계산 결과를 변수에 저장합니다.

    • ADD 자료1 자료2 ... TO 메모리1 메모리2 ... : 메모리는 모두 기억형이어야 한다. 편집형은 불가능. 자료는 수치형 리터럴 또는 메모리여야 한다. 연산식은 사용 불가능.
01 TOTAL-AMOUNT PIC 9(6)V99 VALUE 0.
01 TRANSACTION-AMOUNT PIC 9(6)V99 VALUE 100.50.

ADD TRANSACTION-AMOUNT TO TOTAL-AMOUNT.
ADD 100 TO X. : 
X에 100을 더한다 (X += 100)

ADD A TO X. : 
X의 현재 값에 A를 더한다 (X += A). 
예를 들어 덧셈 결과가 1234.567이고 
X의 PIC 구가 <9999V999>라면 X에 1234.567이 기억되고, 
PIC 구가 <999V9>라면 X에 234.5가 기억된다 (Size Overflow가 발생)
  • ADD..TO..ROUNDED (덧셈 결과를 반올림하여 메모리에 수록)

    "ADD..TO..ROUNDED"는 COBOL 프로그래밍 언어에서 사용되는 연산 구문 중 하나로, 더한 값을 반올림하여 결과를 저장하는 명령입니다. 이 구문은 연산 결과를 소수점 처리할 때 사용됩니다.

    • ADD 자료1 자료2 ... TO 메모리1 [ROUNDED] 메모리2 [ROUNDED] ... : 덧셈 결과 수치가 해당 기억장소의 PIC 구에 맞게 반올림된 후 수록된다.
01 TOTAL-AMOUNT PIC 9(6)V99 VALUE 0.
01 TRANSACTION-AMOUNT PIC 9(6)V99 VALUE 100.50.

ADD TRANSACTION-AMOUNT TO TOTAL-AMOUNT ROUNDED.
  • 기억장소 | PIC구 | ADD전 기억되어 있는 값
    A | 999V99 | 666.66
    B | 999V99 | 222.22
    X | 999V9 | 111.1
    Y | 999 | 111
ADD A TO X. 
: X += A만을 수행하여 결과 수치 (777.76) 중 
X의 PIC 구(999V9)에 해당하는 777.7만을 X에 수록한다.

ADD A TO X ROUNDED.
: 결과수치 777.76을 X의 PIC 구(999V9)에 맞게 
소수점 이하 1자리로 반올림한 777.8을 X에 수록한다.

ADD A TO X ROUNDED Y ROUNDED.
: X += A, Y += A를 수행 -> 777.76, 777.66
X에는 777.8을 수록 (999V9)
Y에는 778을 수록 (999)

ADD A TO X ROUNDED Y. 
: X에는 777.8, Y에는 777을 수록

ADD A B TO X ROUNDED Y ROUNDED.
: X += (A + B), Y += (A + B) 을 수행
결과 수치를 X와 Y의 메로리에 맞게 반올림하여 수록

[코드 예시]

       IDENTIFICATION                    DIVISION.
       PROGRAM-ID.                       06_ROUNDED.
       
       DATA                              DIVISION.
       WORKING-STORAGE                   SECTION.
       77  A    PIC        S999V9    VALUE        345.6.
       77  B    PIC        S999      VALUE        111.
       77  X    PIC        -999. *> 편집형 기업장소

       PROCEDURE                         DIVISION.
       SiJak-P.
           ADD        A        TO        B. 
           MOVE       B        TO        X.
           DISPLAY    "X : ",  X.

           MOVE       345.6    TO        A.
           MOVE       111      TO        B.

           ADD        A        TO        B        ROUNDED.
           MOVE       B        TO        X.
           DISPLAY    "X : ",  X.
           STOP RUN.
           
 
 ****** 결과 *******
     X :  456
     X :  457
 ******************
  • ADD..GIVING (수치를 더하여 다른 기억장소에 수록)

    "ADD..GIVING"는 COBOL 프로그래밍 언어에서 사용되는 연산 구문 중 하나로, 더한 결과를 다른 변수나 필드에 저장하는 명령입니다. 이 구문은 값을 더하고 그 결과를 특정 변수에 저장할 때 사용됩니다.

    • ADD 자료1 자료2 GIVING 기억장소1 [ROUNDED] 기억장소2 [ROUNDED]
    • TO와 GIVING은 함께 사용할 수 없다.
01 TOTAL-AMOUNT PIC 9(6)V99 VALUE 0.
01 TRANSACTION-AMOUNT PIC 9(6)V99 VALUE 100.50.
01 RESULT-AMOUNT PIC 9(6)V99 VALUE 0.

ADD TRANSACTION-AMOUNT TO TOTAL-AMOUNT GIVING RESULT-AMOUNT.
ADD A B GIVING X.
: A와 B를 더하여 메모리 X에 수록한다(X = A + B).
이 때 반올림은 수행되지 않는다. 
메모리 X는 기억형은 물론 편집형도 가능.

ADD A B GIVING X ROUNDED.
: A+B를 X의 PIC 구에 맞게 반올림하여 X에 수록.

ADD A B GIVING X Y
: A+B를 X와 Y에 수록 (X=A+B, Y=A+B).
반올림은 수행되지 않는다.

ADD A B GIVING X ROUNDED Y.
: 위와 같으나 X에는 결과를 반올림하여 수록.

ADD A B GIVING X ROUNDED Y ROUNDED.
: X와 Y에 모두 결과 수치를 반올림하여 수록.

ADD A B TO C D GIVING X Y.
: ERROR. TO와 GIVING은 함께 사용할 수 없다.
  • ADD..ON SIZE ERROR (자리넘침 발생 시의 처리를 지정)

    "ADD..ON SIZE ERROR"는 COBOL 프로그래밍 언어에서 사용되는 연산 구문 중 하나로, 더한 결과가 변수의 자릿수를 초과할 때 발생하는 자리넘침(size overflow) 오류를 처리하는 방법을 지정하는 명령입니다.

    • ADD 자료1 자료2 .. TO 기억장소1 [ROUNDED] 기억장소2 [ROUNDED] ... ON SIZE ERROR 명령문. : ADD..TO와 같으나 덧셈 결과를 메모리에 수록하기에는 폭이 큰 경우 (SIZE OVERFLOW 발생 시) 명령문을 실행함.
    • ADD 자료1 자료2 ... GIVING 기억장소1 [ROUNDED] 기억장소2 [ROUNDED]... ON SIZE ERROR 명령문. : ADD..GIVING과 같으나 SIZE OVERFLOW가 발생한 경우에 명령문을 실행.
01 TOTAL-AMOUNT PIC 9(6)V99 VALUE 999999.
01 TRANSACTION-AMOUNT PIC 9(6)V99 VALUE 0.

ADD TRANSACTION-AMOUNT TO TOTAL-AMOUNT ON SIZE ERROR
    DISPLAY "Size overflow occurred!".

< 기억장소 A, B >

  • 77 A PIC S999V9 VALUE 333.3.
    77 B PIC S999V9 VALUE 955.5.
  • ADD A TO B.의 덧셈 결과는 1288.8로 메모리 B에 수록하기에는 폭이 크다 (S999V9의 최대 저장 값은 999.9). 그러므로 그대로 B에 값을 저장하게 되면 사이즈 오버플로우 발생.
ADD A TO X ON SIZE ERROR DISPLAY 'Error!' 
: 덧셈 결과 (X += A) 자리넘침이 발생하면 
DISPLAY 'Error!'를 발생시키나, 에러가 없다면 덧셈 결과를 X에 저장시킴.

ADD A TO X ROUNDED ON SIZE ERROR DISPLAY 'Error!' 
: 위와 같으나 덧셈 결과가 X에 저장될 때
반올림이 수행된다.

ADD A B GIVING ON SIZE ERROR MOVE 0 TO X.
: A+B의 결과를 X에 수록할 때 자리넘침이 발생하면
[MOVE 0 TO X]를 실행시킴 (X=0).
자리넘침이 발생하지 않으면 X=A+B 수록.

ADD A B GIVING X ROUNDED ON SIZE ERROR MOVE 0 TO X.
: 위와 같지만 A+B의 결과를 X에 수록할 때 반올림 수행.

[코드 예시]

       IDENTIFICATION            DIVISION.
       PROGRAM-ID.               06_ROUNDED2.

       DATA                      DIVISION.
       WORKING-STORAGE           SECTION.
       77  A        PIC        S999V9    VALUE    333.3.  *> 변수 A 선언 및 초기값 할당
       77  B        PIC        S999V9    VALUE    555.5.  *> 변수 B 선언 및 초기값 할당
       77  X        PIC        -999.9.  *> 변수 X 선언

       PROCEDURE                 DIVISION.
       SiJak-P.
           ADD    A        TO        B        ON SIZE ERROR
                                               DISPLAY 'ERROR!'.
           MOVE   B        TO        X.       *> 변수 B 값을 변수 X에 복사
           DISPLAY                   X.       *> 변수 X 값 출력
           MOVE        333.3    TO   A.       *> 변수 A에 새로운 값 333.3 할당
           MOVE        955.5    TO   B.       *> 변수 B에 새로운 값 955.5 할당
           ADD    A B      GIVING    X        ON SIZE ERROR
                                               DISPLAY 'ERROR!'.
           DISPLAY                   X.       *> 변수 X 값 출력
           STOP                      RUN.     *> 프로그램 실행 종료

SUBTRACT (뺄셈)

  • SUBTRACT..FROM (메모리에서 수치를 뺀다)
    • SUBTRACT 자료1 자료2 .. FROM 기억장소1 [ROUNDED] 기억장소2 [ROUNDED] .. [ON SIZE ERROR 명령문].
    • 각 기억장소(반드시 기억형)에서 지정한 각 자료를 모두 뺀다.
    • ROUNDED를 지정하면 뺄셈 결과가 메모리에 수록될 때 반올림이 수행됨.
    • ON SIZE ERROR를 지정하면 자리넘침이 발생한 경우 지정한 명령문을 실행.
    • 자료1, 자료2는 수치형 상수 또는 기억장소 (연산식 사용 불가)
01 BALANCE PIC 9(6)V99 VALUE 1000.50.
01 WITHDRAWAL PIC 9(6)V99 VALUE 200.75.

SUBTRACT WITHDRAWAL FROM BALANCE.
SUBTRACT 100 FROM X. 
: X -= 100

SUBTRACT A 100 FROM X.
: X -= (A + 100) // X = X - A - 100

SUBTRACT A B FROM X Y.
: X와 Y에서 모두 A와 B를 뺀다.
X -= (A + B) & Y -= (A + B)

SUBTRACT A FROM X ROUNDED.
: <X-A>를 X에 수록할 때 X의 PIC 구에 맞게 반올림하여 수록.

SUBTRACT A FROM X ON SIZE ERROR DISPLAY 'Error!'.
: <X-A>를 X에 수록할 때 자리넘침이 발생하면
지정한 문장 출력. 
  • SUBTRACT..FROM..GIVING (뺄셈 결과를 다른 메모리에 수록)
    • SUBTRACT 자료1 자료2 .. FROM 자료A GIVING
      기억장소1 [ROUNDED]
      기억장소2 [ROUNDED][ON SIZE ERROR 명령문].
01 BALANCE PIC 9(6)V99 VALUE 1000.50.
01 WITHDRAWAL PIC 9(6)V99 VALUE 200.75.
01 NEW-BALANCE PIC 9(6)V99 VALUE 0.

SUBTRACT WITHDRAWAL FROM BALANCE GIVING NEW-BALANCE.

SUBTRACT 100 FROM 300 GIVING X.
: 300-100의 결과인 200을 X에 수록.

SUBTRACT A B FROM C GIVING X.
: C-A-B의 결과를 X에 수록.
연산이 수행된 후에 C값은 변화하지 않고 원래 값을 유지함.

SUBTRACT A B FROM C GIVING X Y.
: C-A-B의 결과를 X와 Y 각각에 모두 수록한다.

SUBTRACT A B FROM C GIVING X ROUNDED Y ROUNDED.
: 위와 같으나 X와 Y에 수록할 때 뺄셈 결과를 
X와 Y의 PIC 구에 맞게 반올림하여 수록함.

SUBTRACT A FROM B GIVING X ON SIZE ERROR MOVE 0 TO X.
: <B-A>를 수록하기에 자리넘침이 발생하는 경우에
<MOVE 0 TO X>를 실행. 즉 X에 0을 수록.
B는 원래의 값을 그대로 유지한다.

[코드 예시]

       IDENTIFICATION            DIVISION.
       PROGRAM-ID.               06_SUBTRACTION.

       DATA                      DIVISION.
       WORKING-STORAGE           SECTION.
       77  A        PIC        9(4)     VALUE    1000.
       77  B        PIC        9(4)     VALUE    500.
       77  RESULT   PIC        9(5)     VALUE    0.

       PROCEDURE                 DIVISION.
       SiJak-P.
           SUBTRACT B FROM A GIVING RESULT.  *> B에서 A를 뺀 결과를 RESULT에 저장
           DISPLAY 'Subtraction Result: ' RESULT.

           STOP                      RUN.     *> 프로그램 실행 종료

MULTIPLY (곱셈)

  • MULTIPLY..BY (메모리 값에 수치를 곱한다)
    • MULTIPLY 자료 BY 기억장소1 [ROUNDED] 기억장소2 [ROUNDED].. [ON SIZE ERROR 명령문].
    • 기억장소1, 기억장소2..의 값에 자료를 곱하여 그 결과를 기억장소(메모리)에 수록한다.
    • 자료는 수치 리터럴 혹은 기억장소이다.
    • 기억장소1, 2는 반드시 기억형이어야 한다. 편집형은 안된다.
01 QUANTITY PIC 9(4) VALUE 10.
01 PRICE PIC 9(6)V99 VALUE 25.75.



MULTIPLY QUANTITY BY PRICE.

MULTIPLY 5 BY A. 
: A *= 5

MULTIPLY 5 BY ROUNDED.
: 위와 같으나 곱셈 결과를 A의 PIC 구에 맞게 반올림 후
A에 수록한다.

MULTIPLY A BY X Y.
: X*A를 X에, Y*A를 Y에 수록.
X *= A & Y *= A.

MULTIPLY A BY B ON SIZE ERROR MOVE 1 TO Flag.
: A*B를 계산하여 B에 수록하되,
자리넘침이 발생하는 경우에는 MOVE 1 TO Flag를 수행.
B는 원래 값을 그대로 유지한다.
  • MULTIPLY..BY..GIVING (곱셈 결과를 다른 메모리에 수록)
    • MULTIPLY 자료A BY 자료B GIVING 기억장소1 [ROUNDED] 기억장소2 [ROUNDED]... [ON SIZE ERROR 명령문].
    • 자료A X 자료B 를 기억장소1, 기억장소2..에 수록한다.
    • 자료A, 자료B는 수치 리터럴 혹은 기억장소다.
    • 기억장소1, 기억장소2..는 기억형은 물론 편집형도 가능.
01 QUANTITY PIC 9(4) VALUE 10.
01 PRICE PIC 9(6)V99 VALUE 25.75.
01 TOTAL-AMOUNT PIC 9(8)V99 VALUE 0.

MULTIPLY QUANTITY BY PRICE GIVING TOTAL-AMOUNT.


MULTIPLY 3 BY 5 GIVING X.
: X = 3*5

MULTIPLY A BY B GIVING X.
: X = A*B

MULTIBLY A BY B GIVING X Y.
: X = A*B & Y = A*B

MULTIPLY A BY B GIVING X ON SIZE ERROR MOVE 0 TO X.
: A*B를 X에 수록하되
자리넘침이 발생하면 X에 0을 수록.

DIVIDE (나눗셈)

  • DIVIDE..INTO (메모리 값을 수치로 나눈다)
    • DIVIDE 자료 INTO 기억장소1 [ROUNDED] 기억장소2 [ROUNDED].. [ON SIZE ERROR 명령문].
    • 각 메모리의 값을 <자료>로 나누어 그 결과를 각 메모리에 수록한다.
    • 자료는 수치 리터럴 또는 기억형(기억장소)이다.
    • 기억장소1, 2는 반드시 기억형이어야 한다. 편집형 불가.
01 TOTAL-SALE PIC 9(8)V99 VALUE 1000.50.
01 QUANTITY-SOLD PIC 9(4) VALUE 25.
01 AVERAGE-PRICE PIC 9(6)V99 VALUE 0.

DIVIDE TOTAL-SALE INTO QUANTITY-SOLD GIVING AVERAGE-PRICE.


DIVIDE 10 INTO A. 
: A ÷= 10

DIVIDE A INTO X Y.
: X ÷= A & Y ÷= A 

DIVIDE A INTO X ROUNDED Y ROUNDED. 
: 위와 같으나 나눗셈 결과를 X, Y에 수록할 때
X와 Y의 PIC 구에 맞게 반올림 후 수록한다.

DIVIDE 0.01 INTO A ON SIZE ERROR MOVE 1 TO Flag.
: A ÷ 0.01의 결과를 A에 수록할 수 없을 때에 
A는 원래 값을 유지하고 Flag에 1을 수록한다.
  • DIVIDE..INTO(BY)..GIVING (나눗셈 결과를 다른 메모리에 수록)
    • DIVIDE 자료A INTO(BY) 자료B GIVING 기억장소1 [ROUNDED][REMAINDER 기억장소2] [ON SIZE ERROR 명령문].
    • 자료B ÷ 자료A (INTO) or 자료A ÷ 자료B (BY) 를 계산하여 그 몫을 기억장소1에 나머지를 기억장소2에 수록.
    • 자료A, B는 수치 리터럴 또는 기억장소다.
    • 기억장소1, 2는 기억형은 물론 편집형도 가능하다.
01 TOTAL-SALE PIC 9(8)V99 VALUE 1000.50.
01 QUANTITY-SOLD PIC 9(4) VALUE 25.
01 AVERAGE-PRICE PIC 9(6)V99 VALUE 0.

DIVIDE TOTAL-SALE INTO QUANTITY-SOLD GIVING AVERAGE-PRICE.


DIVIDE 10 INTO A GIVING X.
: A ÷ 10의 몫만을 X에 수록한다.
A는 원래의 값을 그대로 유지한다.

DIVIDE B INTO A GIVING X REMAINDER Y.
: A÷B의 몫은 X에, 나머지는 Y에 수록.
A는 원래의 값을 그대로 유지한다.

DIVIDE B INTO A GIVING X ROUNDED REMAINDER Y.
: 위와 같으나 X에 수록할 때는 반올림하여 수록한다.

DIVIDE B BY A GIVING X.
: B÷A의 몫을 X에 수록한다.

DIVIDE B BY A GIVING X REMAINDER Y.
: B÷A의 몫을 X에, 나머지를 Y에 수록한다.

COMPUTE 연산 (일반 연산)

  • COMPUTE를 사용하면 앞서 살펴보았던 ADD, SUBTRACT, MULTIPLY, DIVIDE를 사용하는 것보다 간편하다.

COMPUTE를 사용한 연산

  • COMPUTE 기억장소 [ROUNDED] = 연산식
    [ON SIZE ERROR 명령문].
  • 연산식의 결과를 기억장소에 수록한다.
  • 연산식은 기억장소, 리터럴, 수식 모두 가능하다.
  • 기억장소는 기억형은 물론 편집형도 가능하다.

코드 예시

COMPUTE A = 100.
: A에 100을 수록한다. 
<MOVE 100 TO A.> 와 동일.

COMPUTE A = A + B.
: A + B를 A에 수록. 
<ADD B TO A.> 와 동일.

COMPUTE A ROUNDED = A + B.
: 위와 같으나 A + B의 결과를 A의 PIC 구에 맞게 
반올림한 후 A에 수록한다. 
<ADD B TO A ROUNDED.>와 동일.

COMPUTE X = A * b ON SIZE ERROR MOVE 0 TO X.
: A*B를 X에 수록하되 자리넘침이 발생하면 X에 0을 수록.
<MULTIPLY A BY B GIVING X ON SIZE ERROR MOVE 0 TO X.>

COMPUTE문의 연산식

연산식

  • 우선순위 순으로 기재
  1. ** : 거듭제곱
  2. * : 곱셈
  3. / : 나눗셈
  4. + : 덧셈
  5. - : 뺄셈

주의사항

  • 연산자 좌우에는 반드시 공란을 띄워야 한다.
  • 연산자의 처리순서에 주의.
  • 메모리에 수록될 때는 해당 PIC 구에 해당하는 숫자부분만 수록된다. ROUNDED의 경우는 반올림 후 수록된다.

[코드 예시]

       IDENTIFICATION            DIVISION.
       PROGRAM-ID.               06_COMPUTE.

       DATA                      DIVISION.
       WORKING-STORAGE           SECTION.
       77  A        PIC        9(4)     VALUE    100.
       77  B        PIC        9(4)     VALUE    50.
       77  C        PIC        9(5)     VALUE    0.

       PROCEDURE                 DIVISION.
       SiJak-P.
           COMPUTE C = A + B.            *> A와 B를 더한 결과를 변수 C에 저장
           DISPLAY 'Addition Result: ' C.

           COMPUTE C = A - B.            *> A에서 B를 뺀 결과를 변수 C에 저장
           DISPLAY 'Subtraction Result: ' C.

           COMPUTE C = A * B.            *> A와 B를 곱한 결과를 변수 C에 저장
           DISPLAY 'Multiplication Result: ' C.

           COMPUTE C = A / B.            *> A를 B로 나눈 결과를 변수 C에 저장
           DISPLAY 'Division Result: ' C.

           STOP                      RUN.     *> 프로그램 실행 종료
           
           
***** 실행결과
***** Addition Result: 150
***** Subtraction Result: 50
***** Multiplication Result: 5000
***** Division Result: 2
profile
Working Abroad ...

1개의 댓글

comment-user-thumbnail
2023년 8월 9일

좋은 정보 얻어갑니다, 감사합니다.

답글 달기