정확한 알고리즘을 개발하는 일은 문제해결을 위한 핵심이다. 흐름도를 이용하여 반복해서. 알고리즘의 중요성을 이해하자.
지난 호에서 판단문 구조(dieision structure)와 FOR LOOP문에 대하여 공부하였다. 이번 호에서는 일반적인 제어문 구조(control structure)가 어떻게 실행되는지 사용예를 들면서 설명하겠다.
제어이동 명령(transfer instructions)
컴퓨터의 중앙처리장치(CPU)가 프로그램에서 정한 경로에 따라 프로그램을 처리해 나가는 순서를 제어흐름(control flow)이라고 한다. 이러한 제어흐름을 원하는 방향으로 옮길 수가 있는데 GOTO문(무조건 이동문) 또는 IF-THEN문 (조건 이동문)을 사용하면 된다.
예를들면
GOTO 320
은 즉시 제어의 흐름을 문번호 320으로 옮기고 문번호 320에서부터 다시 순서대로 처리를 계속하게 된다. 그러나 IF-THEN 문은 주어진 조건이 참일 경우에만 제어의 흐름이 이동한다. 즉,
IF X>M THEN 540
은 X의 값이 M보다 큰 경우에만 540으로 제어흐름이 이동하며 그렇지 않은 경우에는 IF-THEN문의 바로 다음문이 수행된다. 이때 ELSE로 지정한 문번호가 있을 때는 ELSE 다음의 문번호(또는 처리내용)를 처리한다.
판단문 구조
□ 단일선택 판단문 구조(single-alternative decision structrue)
주어진 조건이 허위일 경우에는 아무것도 처리하지 않고 흐름도의 맨 밑에 표시된 화살표의 진행방향대로 처리를 계속해 가며 참일 경우에만 해당되는 내용을 처리한 후에 화살표의 진행방향대로 처리를 계속해 나간다. if로 시작되는 문을 판단문 구조의 시작문(header statement)이라고 하며 IFEND문을 종료문(rerminator statement)이라고 한다. THEN 다음에 표시된 문번호 (또는 처리내용)는 참인 경우에 수행해야 할 내용이 ELSE 다음에 표시된 문번호(또는 처리내용)는 허위일 경우에 계속할 내용이다. 그러나 참일 경우 수행할 내용이 한 문장으로 표시되는 경우에는 ELSE없이 쓸 수도 있다.
IF X> 10000 THEN PRINT "DATA ITEM TOO LARGE"
IF X> 10000 THEN CI=CI+I:SI=SI+X:GOTO 220
□ 이중선택 판단문 구조(Double-alternative decision structure)
주어진 조건이 참인 경우와 허위일 경우에 따라서 한가지의 처리경로가 결정된다. 해당하는 처리를 끝낸후에야 흐름도의 맨밑에 표시된 화살표의 진행방향에 따라 처리를 계속한다.
(문제 1)
두 수를 변수 X, Y에 읽어 들여서 비교한 후 큰 수를 Y에 넣는 프로그램을 작성하라.
(설 명)
두 수를 읽고 비교한 후 Y가 X보다 클 때에만 X와 Y를 바꾼다. 이 때 일시적으로 사용할 변수가 필요한데 T를 사용하기로 하며 이 변수가 필요한 두 수 3 ,5 ,7 ,2에 대해 설명하면 아래와 같다
(그림 4) 문제 1의 프로그램
110 REM 두 수 중 큰 수 구하기
110 CLS
120 PRINT : PRINT : PRINT
130 PRINT TAB(20) "두 수 X,Y을 입력하시오" ;
140 INPUT X, Y
150 PRINT TAB(20) "X="; X, "Y=";Y
160 PRINT : PRINT
170 IF Y < =X THEN 220
180 T=X
190 X=Y
200 Y=T
210 PRINT : PRINT : PRINT
220 PRINT TAB(20) "큰 수=";X
230 PRINT TAB(20) "작은 수=";Y
240 PRINT : PRINT : PRINT
250 PRINT TAB(20) "계속=1, 끝=2";
260 INPUT
270 IF C=1 THEN 110
280 END
(문제 2)
각 행과 열, 그리고 대각선으로 이어진 숫자의 합이 모두 같은 요술 모눈표(magic square)를 만드는 프로그램을 작성하라. 단 행과 열의 칸 수(N)는 같으며 홀수일 때이다.
(설명)
가) 맨 윗 열의 가운데 칸에 1을 채운다.
나) 위로 1칸, 좌로 1칸을 이동하여 다음의 번호로 채운다.
다) 만약 모눈표의 밖으로 나가면 반대편의 모눈표가 계속 연결되어 있는 것과 같이 계속한다.
라) 만약 해당하는 칸이 이미 채워져 있으면 대신 아래로 1칸을 이동하여 채우고 계속한다
(그림 5)의 프로그램을 실행하여 N의 값을 5로 입력할 경우 아래와 같은 결과를 얻는다.
(그림 5) 문제 2의 프로그램
100 REM MAGIC SQUARE GENERATION
110 INPUT N
120 IF FIX(N/2) <> N/2 THEN 170
130 CLS
140 PRINT : PRINT : PRINT : PRINT
150 PRINT TAB(20) "입력오류"
160 GOTO 110
170 I=N : J=N
180 DIM SQ(I,J)
190 SQ(O,(N-1/2)=1
200 KY 2
210 I= 0
220 J=(N-1)/2
230 IF KY>(N>2) THEN 360
240 K=I-1
250 IF K<O THEN K=N+K
260 L=J-1
270 IF L<O THEN L=N+L
280 IF SQ(K,L)=0 THEN GOTO 310
290 I=I+1
300 GOTO 330
310 I=K
320 J=L
330 SQ(I,J)=KY
340 KY=KY+1
350 GOTO 230
360 CLS
370 PRINT : PRINT : PRINT : PRINT : PRINT
380 FOR 1=0 TO N-1
390 FOR J1=0 TO N-1
400 PRINT TAB(20+5*J) SQ(I,J);
410 NEXT J
420 NEXT I
430 END
FOR LOOP문
FOR LOOP문의 일반적인 형식과 성질을 정리하면 아래와 같다.
(문제 4)
양의 정수 N의 팩도리얼(factorial)을 계산하는 프로그램을 작성하여라.
(설 명)
양의 정수 N의 팩토리얼(N!)=(N-1)×(N-2)×……2×1
즉, 6!=6×5×4×3×2×1=720
(그림 7) 문제 4의 프로그램
100 REM 양의 정수 N의 팩토리얼 구하기
110 CLS
120 PRINT : PRINT : PRINT
130 PRINT TAB(20) "**양의 정수 N의 팩토리얼 구하기**"
140 PRINT : PRINT : PRINT
150 PRINT TAB(13) "양의 정수를 입력하시오";
160 INPUT N
170 F=N
180 PRINT : PRINT : PRINT
190 PRINT TAB(13) N"의 팩토리얼=";N;
200 FOR I=N-1 TO STEP -1
210 F=F*1
220 PRINT "*";I;
230 NEXT I
240 PRINT "=";I;
250 PRINT : PRINT : PRINT
260 PRINT TAB(13) "계속=1, 끝=2";
270 INPUT C
280 IF C=1 THEN 110
290 END
(문제 5)
임의의 자연수를 입력하였을 때 이 수까지의 모든 홀수와 홀수의 합, 그리고 이 수까지의 모든 홀수와 홀수의 합, 그리고 이수까지의 모든 짝수와 짝수의 곱을 계산하여 출력하는 프로그램을 작성해 보자.
(설 명)
1) 임의의 자연수 N을 입력한다.
2) N까자의 홀수의 합을 계산하도록 변수 S를 정하고 초기값을 0으로 한다.
3) 홀수는 1부터 시작하여 2씩 증가시켜서 구한다.
4) N까지의 짝수의 곱을 계산하도록 변수 P를 정하고 처음 값을 1로 한다.
5) 짝수는 2부터 시작하여 2씩 증가시켜 구한다.
(그림 8) 에보인 프로그램을 실행(RUN)시키면 (그림 9)와 같은 화면이 나타난다. 원하는 자연수를 10으로 입력시키면 (그림 10)과 같은 결과가 화면에 나타난다. 이 화면에서 다른 자연수를 입력하고 싶으면 1, 끝내고 싶으면 2를 입력하면 된다. 1을 입력할 경우 (그림 9)와 같은 화면이 계속해서 나타나게 되는 것이다.
(문제 6)
여러분은 은행의 예금업무담당 직원이라고 가정하자. 고객에게 각종 예금의 장점을 알리고 고객과 상담하는 일은 중요한 업