출력 편집 - 금액을 읽기 좋게
이 장에서 배우는 것
앞 장에서는 MOVE 가 자릿수와 소수점 위치에 맞추어 값을 옮기는 규칙을 보았다. 계산을 마친 값은 컴퓨터가 다루기에는 알맞다. 하지만 사람이 읽기에는 불친절하다. 앞에 0 이 길게 붙고, 천 단위 쉼표가 없고, 음수 표시도 처리계마다 다른 모양으로 붙기 때문이다. 이 장은 값은 그대로 두고 보이는 모양만 바꾸어 내보내는 방법을 다룬다. 이 일에 쓰는 것이 편집 PIC 이다.
- Z, 9, 쉼표, 마침표로 앞쪽 0 을 지우고 천 단위를 끊는다.
- -, +, * 로 부호를 보이거나 빈 자리를 채운다.
- 8자리 날짜를 2026/10/02 꼴로 내보낸다.
- 편집 항목을 계산에 쓰면 안 되는 이유를 설명하고, 계산용 항목과 출력용 항목을 나누어 쓴다.
- DISPLAY 로 머리글과 상세 줄의 세로 칸을 맞춘다.
문제 상황
신용협동조합의 일일 마감 담당자가 그날 처리한 거래 목록을 출력해서 받았다고 하자. 프로그램은 값을 그대로 찍었다. 입금 85000 원이 들어온 회원의 줄은 이런 모양이다.
100231 KIM MINSU 20261002 0085000 0001335000
담당자는 날짜를 눈으로 끊어 읽어야 한다. 잔액이 133만 원인지 1,335만 원인지 자릿수를 세어 보아야 한다. 출금이면 금액 뒤에 붙는 부호 표시를 해석해야 한다. 보고서에는 이렇게 나와야 한다.
100231 KIM MINSU 2026/10/02 +85,000 1,335,000
이 장에서는 회원 세 명의 거래를 한 건씩 처리해 이런 줄로 출력한다. 처리 결과는 숫자 항목에 두고, 화면에 내보내기 직전에만 편집 항목으로 옮긴다. 편집(editing)이란 값의 크기는 바꾸지 않고 앞쪽 0 의 처리, 쉼표, 부호 같은 표시 모양만 정하는 일이다. 뒤에서 보겠지만 이 분리가 이 장의 핵심 규칙이다.
편집 PIC 의 기호
숫자 항목과 편집 항목
PIC 9(7) 이나 PIC S9(7) 처럼 9 와 S, V 만 쓴 항목은 숫자 항목이다. 칸마다 숫자 하나만 들어 있어서 더하고 곱할 수 있다. 여기에 Z, 쉼표, 마침표, 부호 기호 같은 편집 기호를 섞으면 편집 항목(numeric-edited item)이 된다. 편집 항목에는 숫자뿐 아니라 쉼표, 공백, 별표 같은 글자가 들어간다. 항목의 길이는 PIC 문자열의 기호 수와 같다. 예를 들어 PIC Z,ZZZ,ZZ9 는 9바이트이고, 이 중 숫자 칸은 7개다.
아래 그림은 값 -3500 이 든 PIC S9(7) 항목을 PIC Z,ZZZ,ZZ9 항목으로 MOVE 할 때 칸이 어떻게 대응하는지 보여 준다.
Z 와 9, 쉼표, 마침표
Z 는 숫자 한 칸이다. 그 칸의 값이 앞쪽 0 이면 공백으로 바꾼다. 9 도 숫자 한 칸이지만 0 이어도 0 을 그대로 찍는다. 그래서 금액 항목은 보통 맨 끝 칸만 9 로 둔다. 값이 0 이면 아무것도 안 나오는 것보다 0 이 한 개 나오는 쪽이 읽기 편하다.
쉼표는 숫자 칸 사이에 끼워 넣는 삽입 문자다. 쉼표가 첫 번째 0 이 아닌 숫자보다 왼쪽에 있으면 공백으로 바뀐다. 그래서 42 를 옮기면 쉼표만 남는 일이 없다. 마침표는 소수점 위치에 찍히는 실제 글자다. 원천 항목에 V 로 표시해 둔 가상의 소수점이 출력에서는 눈에 보이는 점이 된다. 아래 표에서 ␣ 는 공백 한 칸을 뜻한다.
| 기호 | 하는 일 | PIC 예 | 값 → 결과 |
|---|---|---|---|
| Z | 앞쪽 0 을 공백으로 바꾼다 | ZZ9 | 7 → ␣␣7 |
| 9 | 0 이어도 숫자를 찍는다 | ZZ9 | 0 → ␣␣0 |
| , | 숫자 사이에 쉼표를 넣는다. 맨 앞 0 구간이면 공백이 된다 | Z,ZZ9 | 1234 → 1,234 12 → ␣␣␣12 |
| . | 소수점 위치에 점을 찍는다 | 9.99 | (9V99 의 1.25) → 1.25 |
| * | 앞쪽 0 자리를 별표로 채운다 | **,**9 | 350 → ***350 |
| - | 음수일 때만 - 를 찍는다 | -ZZ9 | -7 → -␣␣7 7 → ␣␣␣7 |
| + | 양수는 +, 음수는 - 를 찍는다 | +ZZ9 | 7 → +␣␣7 |
| / | 그 자리에 슬래시를 끼워 넣는다 | 9999/99/99 | 20261002 → 2026/10/02 |
부호: 고정과 떠다니는 부호
부호 기호를 PIC 맨 앞에 한 번만 쓰면 부호는 항상 그 자리에 찍힌다. -Z,ZZZ,ZZ9 에 -3500 을 옮기면 맨 왼쪽에 - 가 있고 숫자는 한참 오른쪽에서 시작한다. 같은 기호를 두 개 이상 이어 쓰면 부호가 첫 번째 0 이 아닌 숫자 바로 왼쪽으로 따라온다. 이를 부동 삽입(floating insertion)이라 한다. 이때 맨 왼쪽 기호 하나는 부호가 앉을 자리이고, 나머지 기호가 숫자 칸이 된다. 그래서 --,---,--9 의 숫자 칸은 7개다. 기호가 7개 이어진 뒤 9 가 하나 붙었지만 맨 앞 기호는 숫자 칸이 아니기 때문이다.
- 는 음수일 때만 부호를 찍고 양수에서는 공백을 둔다. + 는 양수에 +, 음수에 - 를 찍는다. 입금과 출금을 한 열에 같이 보이는 거래 보고서에는 + 쪽이 읽기 좋다. 회계 서식 중에는 금액 뒤에 CR 이나 DB 를 붙이는 방식도 있으나 이 책의 예제는 - 와 + 만 쓴다.
별표와 날짜
별표(*)는 Z 처럼 앞쪽 0 을 지우되 공백 대신 * 로 채운다. 수표나 지급 전표처럼 앞자리에 다른 숫자를 끼워 넣기 어렵게 해야 하는 서식에 쓴다. 날짜는 원천을 PIC 9(8) 로 두고 9999/99/99 로 옮긴다. 슬래시는 삽입 문자일 뿐이어서 20261002 의 순서는 그대로 두고 두 군데에 / 만 끼워 준다. 점과 하이픈은 날짜 구분자로 쓸 수 없다. 점은 소수점 기호이고 하이픈은 부호 기호이기 때문이다.
편집 항목은 출력 전용이다
PIC Z,ZZZ,ZZ9 항목에 1335000 을 옮기면 메모리에는 글자 9개, 곧 1 , 3 3 5 , 0 0 0 이 들어간다. 이 안에는 쉼표가 있고, 값이 작으면 공백이 있고, 별표 서식이면 별표가 있다. 숫자 연산은 칸마다 숫자 하나가 있다고 가정하고 동작한다. 쉼표나 공백이 든 글자열에 덧셈을 정의할 방법은 없다. 표준 COBOL 은 편집 항목을 산술문의 피연산자로 쓰지 못하게 하고, GnuCOBOL 도 이런 문장을 오류로 막는다. 설령 컴파일되는 처리계가 있더라도 기대하면 안 된다.
또 하나의 이유는 정보가 줄어든다는 점이다. 편집 항목으로 옮기는 순간 부호가 없는 PIC 라면 부호가 사라지고, 칸이 모자라면 높은 자리 숫자도 잘린다. 편집한 결과에서 원래 값을 되찾을 수 있다고 보장할 수 없다. 그래서 규칙은 단순하다.
- 계산과 보관은 숫자 항목(WS- 로 시작하는 이름)에서 한다.
- 출력 직전에 한 번만 편집 항목(ED- 로 시작하는 이름)으로 MOVE 한다.
- 편집 항목은 DISPLAY 나 파일 쓰기에만 쓰고, 다시 읽어서 계산하지 않는다.
이름 접두사 WS- 와 ED- 는 언어 규칙이 아니라 이 책의 관례다. 항목이 어느 쪽인지 이름만 보고 알 수 있게 하려는 것이다. 아래 완성 코드에서 월 이자를 계산하는 방식이 이 규칙의 예다. 이자는 숫자 항목 WS-INTEREST 에 먼저 구하고, 마지막에 ED-INTEREST 로 옮겨 찍는다.
DISPLAY 로 한 줄 맞추기
DISPLAY 는 나열한 항목을 구분 없이 이어서 한 줄로 내보낸다. 항목 사이에 공백이 필요하면 " " 를 직접 써 넣어야 한다. 세로 칸을 맞추는 방법은 모든 항목을 고정 폭으로 만드는 것이다. PIC X(10) 항목은 짧은 이름 뒤를 공백으로 채워 항상 10칸이 된다. 편집된 숫자 항목은 길이가 PIC 로 정해지므로 오른쪽 끝이 늘 같은 자리에서 끝난다. 이렇게 폭이 고정된 항목들을 같은 순서로 이으면 줄마다 칸이 일치한다.
머리글은 문자 리터럴로 직접 쓰므로 칸 수를 세어야 한다. 이 장의 상세 줄은 회원번호 6칸, 공백 1칸, 이름 10칸, 공백 1칸, 날짜 10칸, 공백 1칸, 변동액 10칸, 공백 1칸, 잔액 10칸으로 모두 50칸이다. 머리글은 이 폭에 맞추어 오른쪽 정렬로 쓴다. 눈금자를 위에 붙여 보면 확인하기 쉽다.
1 2 3 4 5
12345678901234567890123456789012345678901234567890
NO NAME DATE CHANGE NEW BAL
100231 KIM MINSU 2026/10/02 +85,000 1,335,000
이 책의 예제는 이름을 영문으로 쓴다. 한글은 UTF-8 에서 한 글자가 보통 3바이트이고 터미널에서는 두 칸을 차지한다. PIC X(10) 은 10바이트이므로 한글 이름으로 칸을 맞추기 어렵다. 한글 글자 폭 계산은 지금 목표에서 벗어나므로 다루지 않는다.
코드 쪽에서는 고정 형식의 72열 제한 때문에 긴 리터럴을 한 줄에 쓸 수 없다. 이럴 때는 리터럴을 둘로 나누어 DISPLAY 의 항목으로 이어 쓴다. 연속 줄의 항목은 12열 이후 아무 데서나 시작해도 되므로 위 항목과 세로로 맞추면 읽기 쉽다. 편집 PIC 의 전체 규칙은 GnuCOBOL 공식 사이트의 안내서에서 확인할 수 있다.
완성 코드
main.cob
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.
DATA DIVISION.
WORKING-STORAGE SECTION.
* 계산과 보관에 쓰는 숫자 항목
01 WS-MEMBER-NO PIC 9(6).
01 WS-NAME PIC X(10).
01 WS-TRAN-DATE PIC 9(8) VALUE 20261002.
01 WS-BALANCE PIC S9(7).
01 WS-CHANGE PIC S9(7).
01 WS-NEW-BAL PIC S9(7).
01 WS-NET PIC S9(7) VALUE ZERO.
01 WS-RATE PIC 9V99 VALUE 1.25.
01 WS-INTEREST PIC 9(7)V99.
01 WS-SAMPLE PIC S9(7).
* 출력 전용 편집 항목
01 ED-DATE PIC 9999/99/99.
01 ED-CHANGE PIC ++,+++,++9.
01 ED-NEW-BAL PIC --,---,--9.
01 ED-NET PIC ++,+++,++9.
01 ED-RATE PIC 9.99.
01 ED-INTEREST PIC Z,ZZZ,ZZ9.99.
01 ED-Z PIC Z,ZZZ,ZZ9.
01 ED-FIXED PIC -Z,ZZZ,ZZ9.
01 ED-FLOAT PIC --,---,--9.
01 ED-PLUS PIC +Z,ZZZ,ZZ9.
01 ED-STAR PIC *,***,**9.
PROCEDURE DIVISION.
MAIN-PARA.
MOVE WS-TRAN-DATE TO ED-DATE
DISPLAY "== LEDGER =="
DISPLAY "NO NAME DATE"
" CHANGE NEW BAL"
DISPLAY "-------------------------"
"-------------------------"
MOVE 100231 TO WS-MEMBER-NO
MOVE "KIM MINSU" TO WS-NAME
MOVE 1250000 TO WS-BALANCE
MOVE 85000 TO WS-CHANGE
COMPUTE WS-NEW-BAL = WS-BALANCE + WS-CHANGE
ADD WS-CHANGE TO WS-NET
MOVE WS-CHANGE TO ED-CHANGE
MOVE WS-NEW-BAL TO ED-NEW-BAL
DISPLAY WS-MEMBER-NO " " WS-NAME " " ED-DATE " "
ED-CHANGE " " ED-NEW-BAL
COMPUTE WS-INTEREST ROUNDED =
WS-NEW-BAL * WS-RATE / 1200
MOVE 100245 TO WS-MEMBER-NO
MOVE "LEE JIWON" TO WS-NAME
MOVE 2300000 TO WS-BALANCE
MOVE -45000 TO WS-CHANGE
COMPUTE WS-NEW-BAL = WS-BALANCE + WS-CHANGE
ADD WS-CHANGE TO WS-NET
MOVE WS-CHANGE TO ED-CHANGE
MOVE WS-NEW-BAL TO ED-NEW-BAL
DISPLAY WS-MEMBER-NO " " WS-NAME " " ED-DATE " "
ED-CHANGE " " ED-NEW-BAL
MOVE 100307 TO WS-MEMBER-NO
MOVE "PARK HAYUN" TO WS-NAME
MOVE 30000 TO WS-BALANCE
MOVE -45000 TO WS-CHANGE
COMPUTE WS-NEW-BAL = WS-BALANCE + WS-CHANGE
ADD WS-CHANGE TO WS-NET
MOVE WS-CHANGE TO ED-CHANGE
MOVE WS-NEW-BAL TO ED-NEW-BAL
DISPLAY WS-MEMBER-NO " " WS-NAME " " ED-DATE " "
ED-CHANGE " " ED-NEW-BAL
DISPLAY "-------------------------"
"-------------------------"
MOVE WS-NET TO ED-NET
DISPLAY "NET CHANGE " ED-NET
MOVE WS-RATE TO ED-RATE
MOVE WS-INTEREST TO ED-INTEREST
DISPLAY "KIM MINSU MONTHLY INTEREST AT " ED-RATE "%: "
ED-INTEREST
DISPLAY "== PATTERNS =="
DISPLAY "VALUE |Z,ZZZ,ZZ9|-Z,ZZZ,ZZ9|--,---,--9|"
"+Z,ZZZ,ZZ9|*,***,**9"
MOVE 1250000 TO WS-SAMPLE
MOVE WS-SAMPLE TO ED-Z ED-FIXED ED-FLOAT
ED-PLUS ED-STAR
DISPLAY " 1250000|" ED-Z "|" ED-FIXED "|" ED-FLOAT "|"
ED-PLUS "|" ED-STAR
MOVE -3500 TO WS-SAMPLE
MOVE WS-SAMPLE TO ED-Z ED-FIXED ED-FLOAT
ED-PLUS ED-STAR
DISPLAY " -3500|" ED-Z "|" ED-FIXED "|" ED-FLOAT "|"
ED-PLUS "|" ED-STAR
MOVE 0 TO WS-SAMPLE
MOVE WS-SAMPLE TO ED-Z ED-FIXED ED-FLOAT
ED-PLUS ED-STAR
DISPLAY " 0|" ED-Z "|" ED-FIXED "|" ED-FLOAT "|"
ED-PLUS "|" ED-STAR
STOP RUN.
줄별 해설
- WORKING-STORAGE 의 WS- 항목: 회원번호, 이름, 거래일, 잔액, 변동액, 새 잔액, 순변동 합계, 이율, 이자, 견본값이다. 모두 숫자 항목이거나 글자 항목이어서 계산에 쓸 수 있다. WS-NET 은 VALUE ZERO 로 0 에서 시작해 거래마다 쌓는다. WS-RATE 의 PIC 9V99 는 소수 둘째 자리까지 가진 1.25 를 담는다.
- ED- 항목: 출력 전용이다. ED-DATE 는 날짜용이고 ED-CHANGE 와 ED-NET 은 부호가 붙는 떠다니는 + 형식이다. ED-NEW-BAL 은 음수만 - 가 붙는 떠다니는 - 형식이다. ED-INTEREST 는 소수점 아래 두 자리를 가진다. 아래쪽 다섯 개(ED-Z, ED-FIXED, ED-FLOAT, ED-PLUS, ED-STAR)는 같은 값을 여러 PIC 로 비교하려는 견본이다.
- MOVE WS-TRAN-DATE TO ED-DATE: 날짜는 모든 거래에서 같으므로 한 번만 옮긴다. 20261002 가 2026/10/02 로 바뀐다.
- 머리글 DISPLAY: 리터럴을 둘로 나누어 72열을 넘지 않게 했다. 두 문자열을 합치면 50칸이고, 상세 줄 폭과 같다. 줄 모양은 구분선 DISPLAY 도 같은 방식으로 25칸씩 둘로 나누었다.
- 회원 한 명 처리 블록: 값을 채우고 COMPUTE 로 새 잔액을 구한다. ADD 로 WS-NET 에 변동액을 쌓는다. 그 뒤에야 MOVE 로 편집 항목에 옮겨 DISPLAY 한다. 계산은 모두 숫자 항목에서 끝났고 편집 항목은 출력에만 쓰인다.
- COMPUTE WS-INTEREST ROUNDED: 첫 회원의 새 잔액에 이율을 곱하고 1200 으로 나누어 월 이자를 구한다. 연 이율을 백분율에서 비율로 바꾸는 100 과 12개월로 나누는 12 를 곱한 값이다. 1335000 × 1.25 ÷ 1200 은 1390.625 이고 ROUNDED 로 소수 둘째 자리에서 반올림해 1390.63 이 된다. 이 값은 다음 두 회원을 처리하는 동안에도 WS-INTEREST 에 남아 있다.
- DISPLAY "NET CHANGE" ...: 리터럴을 29칸으로 만들어 ED-NET 이 변동액 열과 같은 오른쪽 끝에서 끝나게 했다.
- PATTERNS 구역: 견본값 세 개(1250000, -3500, 0)를 각 편집 항목으로 한꺼번에 MOVE 한다. 받는 항목을 여러 개 나열하는 MOVE 는 같은 값을 모두에게 옮긴다. 머리글에는 PIC 문자열을 그대로 적었다. 열 폭이 PIC 길이와 같으므로 머리글 아래에 결과가 정확히 놓인다.
실행 결과
$ cobc -x -Wall main.cob
$ ./main
== LEDGER ==
NO NAME DATE CHANGE NEW BAL
--------------------------------------------------
100231 KIM MINSU 2026/10/02 +85,000 1,335,000
100245 LEE JIWON 2026/10/02 -45,000 2,255,000
100307 PARK HAYUN 2026/10/02 -45,000 -15,000
--------------------------------------------------
NET CHANGE -5,000
KIM MINSU MONTHLY INTEREST AT 1.25%: 1,390.63
== PATTERNS ==
VALUE |Z,ZZZ,ZZ9|-Z,ZZZ,ZZ9|--,---,--9|+Z,ZZZ,ZZ9|*,***,**9
1250000|1,250,000| 1,250,000| 1,250,000|+1,250,000|1,250,000
-3500| 3,500|- 3,500| -3,500|- 3,500|****3,500
0| 0| 0| 0|+ 0|********0
PARK HAYUN 의 새 잔액이 음수인 것은 부호 표시를 보이려고 일부러 만든 값이다. 실제 마감 프로그램은 잔액보다 큰 출금을 먼저 가려내야 하며, 이는 조건을 다루는 장에서 이어진다. 패턴 표의 두 번째 줄을 보면 부호가 없는 Z 와 * 항목에서는 -3500 의 부호가 사라진 것을 알 수 있다.
실무에서 자주 틀리는 것
1. 편집 항목으로 계산한다
틀린 코드는 출력용으로 만든 항목을 그대로 계산에 끌어다 쓴다.
01 ED-BAL PIC Z,ZZZ,ZZ9.
01 ED-FEE PIC ZZ9.
01 WS-TOTAL PIC S9(7).
...
COMPUTE WS-TOTAL = ED-BAL + ED-FEE
컴파일러가 편집 항목을 피연산자로 받아 주지 않는다. 고친 코드는 값을 숫자 항목에 보관하고 출력할 때만 편집한다.
01 WS-BAL PIC 9(7).
01 WS-FEE PIC 9(3).
01 WS-TOTAL PIC S9(7).
01 ED-TOTAL PIC -Z,ZZZ,ZZ9.
...
COMPUTE WS-TOTAL = WS-BAL + WS-FEE
MOVE WS-TOTAL TO ED-TOTAL
DISPLAY ED-TOTAL
2. 편집 항목의 칸이 모자란다
01 WS-BAL PIC S9(7) VALUE 1250000.
01 ED-SHORT PIC ZZ,ZZ9.
MOVE WS-BAL TO ED-SHORT
DISPLAY ED-SHORT
ED-SHORT 의 숫자 칸은 5개뿐이어서 높은 자리가 조용히 잘린다. 출력은 1,250,000 이 아니라 50,000 이다. 오류도 경고도 나오지 않으므로 더 위험하다. 편집 PIC 의 숫자 칸 수(Z 와 9 의 개수, 떠다니는 부호 기호는 하나 뺀 수)가 원천 숫자 칸 수 이상이 되게 잡는다.
01 ED-FULL PIC Z,ZZZ,ZZ9.
MOVE WS-BAL TO ED-FULL
DISPLAY ED-FULL
3. 부호 자리를 빼먹는다
01 WS-CHANGE PIC S9(7) VALUE -45000.
01 ED-CHANGE PIC Z,ZZZ,ZZ9.
MOVE WS-CHANGE TO ED-CHANGE
DISPLAY ED-CHANGE
결과는 " 45,000" 이다. 출금 45,000 원이 입금처럼 보인다. 입출금이 섞이는 열은 부호가 있는 PIC 를 써야 한다.
01 ED-CHANGE PIC ++,+++,++9.
MOVE WS-CHANGE TO ED-CHANGE
DISPLAY ED-CHANGE
이제 " -45,000" 이 나온다.
4. 날짜 구분자에 점이나 하이픈을 쓴다
01 ED-DATE PIC 9999.99.99.
점은 소수점 기호라서 한 PIC 에 한 번만 쓸 수 있다. 컴파일러가 이 PIC 를 받아 주지 않는다. 하이픈은 부호 기호이므로 날짜 칸 사이에 두지 못한다. 슬래시 형식이면 편집 PIC 로 충분하다. 하이픈이 꼭 필요하면 날짜를 연, 월, 일 항목으로 나누어 조각마다 출력한다.
01 WS-DATE-PARTS.
05 WS-YYYY PIC 9(4).
05 WS-MM PIC 9(2).
05 WS-DD PIC 9(2).
...
MOVE "20261002" TO WS-DATE-PARTS
DISPLAY WS-YYYY "-" WS-MM "-" WS-DD
출력은 2026-10-02 이다.
한눈에 보기
| 주제 | 규칙 | 예 | 주의 |
|---|---|---|---|
| 0 억제 | Z 는 앞쪽 0 을 공백으로, 9 는 0 도 찍는다 | Z,ZZZ,ZZ9 | 끝 칸은 9 로 둔다 |
| 쉼표·마침표 | 쉼표는 앞 0 구간이면 공백, 마침표는 소수점 위치 | Z,ZZZ,ZZ9.99 | 점은 PIC 에 한 번만 |
| 부호 | 한 번만 쓰면 고정, 이어 쓰면 숫자 앞으로 따라옴 | -Z,ZZZ,ZZ9 --,---,--9 | 떠다니는 기호는 숫자 칸이 하나 적다 |
| 별표 | 앞쪽 0 을 * 로 채운다 | *,***,**9 | 부호는 나타나지 않는다 |
| 날짜 | 9(8) 원천에 / 를 끼운다 | 9999/99/99 | 점, 하이픈은 쓸 수 없다 |
| 계산 | 숫자 항목에서 계산하고 마지막에 MOVE | WS- 계산, ED- 출력 | 편집 항목을 피연산자로 쓰지 않는다 |
| 줄 맞추기 | 고정 폭 항목을 이어 DISPLAY, 머리글은 칸 수를 세어 쓴다 | 6+1+10+1+10+1+10+1+10 | 한글 이름은 칸이 틀어진다 |
연습 문제
- PIC 9(5) 항목의 값이 04300, 00300, 00000 일 때 PIC ZZ,ZZ9 항목으로 각각 MOVE 한 결과를 쓰시오. 공백은 ␣ 로 표시한다.
- PIC S9(5) 항목의 값이 -7500 이다. PIC +ZZ,ZZ9 와 PIC ZZ,ZZ9 로 옮긴 결과를 각각 쓰고, 둘의 차이를 한 문장으로 설명하시오.
- 아래 코드는 컴파일되지 않는다. 이유를 쓰고, 계산 항목과 출력 항목을 나누어 고치시오.
01 ED-COUNT PIC ZZ9. MOVE 5 TO ED-COUNT ADD 1 TO ED-COUNT DISPLAY ED-COUNT - 본문 프로그램에서 PARK HAYUN 의 WS-NEW-BAL(-15000)을 PIC *,***,**9 항목에 MOVE 하면 어떤 글자가 나오는가. 이 결과가 현장에서 문제가 될 수 있는 이유도 쓰시오.
정답과 해설
- 04300 은 "␣4,300", 00300 은 "␣␣␣300", 00000 은 "␣␣␣␣␣0" 이다. 04300 은 두 번째 숫자 칸의 4 가 0 이 아니므로 그 뒤의 쉼표가 찍힌다. 00300 은 쉼표 앞에 0 이 아닌 숫자가 없어서 쉼표도 공백이 된다. 00000 은 마지막 칸이 9 이므로 0 이 하나 남는다.
- +ZZ,ZZ9 는 "-␣7,500", ZZ,ZZ9 는 "␣7,500" 이다. 앞의 PIC 는 부호 칸이 있어 음수가 드러나고, 뒤의 PIC 는 부호 칸이 없어 절댓값만 남는다.
- 편집 항목은 ADD 의 받는 항목이 될 수 없다. 계산은 숫자 항목에서 하고 출력 직전에 편집 항목으로 옮긴다.
출력은 "␣␣6" 이다.01 WS-COUNT PIC 9(3). 01 ED-COUNT PIC ZZ9. MOVE 5 TO WS-COUNT ADD 1 TO WS-COUNT MOVE WS-COUNT TO ED-COUNT DISPLAY ED-COUNT - "***15,000" 이 나온다. 별표 PIC 에는 부호 칸이 없어서 -15000 의 부호가 사라진다. 잔액 부족인 계좌가 15,000 원이 남은 계좌처럼 보이므로 위험하다. 음수가 나올 수 있는 항목에는 -, + 같은 부호 칸이 있는 PIC 를 쓰고, 별표 서식은 항상 0 이상인 금액에만 쓴다.