d라이브러리









퍼스널컴퓨터 교실⑤ 조건 LOOP문과 서브루틴

프로그램 중에는 계수기(counter) 를 사용하여 간단히 loop문을 제어하는 경우도 있지만 대개의 loop문에서는 계수기를 사용하지 않고 다른 방법으로 문제를 해결하는 수도 있다.

WHILE LOOP문

(그림 1) 제어변수를 사용하는 WHILE loop문의 일반적인 흐름도


이러한 Loop문은 한개 이상의 특정변수값의 상태를 점검함으로써 제어를 하는데 이 특정변수는 loop문의 본체(body of the loop)에서 계산되거나 입력변수로 제공되기도 한다. 앞에서 공부한 FOR loop문과 다른 특성은 계수기(counter)가 필요없으며 loop문의 반복수행 횟수를 미리 정하지 않았다는 것으로 이와같은 loop문을 WHILE loop문(또는 조건 loop문)이라고 한다.

WHILE loop문은 loop문 본체를 실행하기 전에 먼저 반복 실행 조건을 점검하여 조건이 허위(false)일때는 실행하지 않으며 참(true)일 경우에만 실행한다. 이것은 매우 중요한 특성이므로 기억하기 바란다.

(보기 1)
${2}^{0}$(1)부터 시작하여 1000까지의 2에 대한 제곱수를 계산하여 인쇄하는 WHILE loop문의 흐름도는(그림 2)와 같다. P의 최종값은 1024이지만 인쇄되는 최종값은 512임을 유의하기 바란다. 여기에는 P는 loop제어변수로 사용되었으며 그 값에 따라서loop실행의 반복을 결정하게 된다.
 

(그림 2) 1000이하의 수 중 2의 제곱수를 구하는 WHILE loop


흐름도에서 살펴볼 수 있는 바와 같이 WHILE loop에서 쓰이는 제어변수는 FOR loop의 제어변수와 비슷한 역할을 한다고 할 수 있다. 그러나 FOR loop와는 달리 loop제어단계를 WHILE loop의 흐름도 내에 분명히 표시하여야 한다.
이것을 BASIC문장으로 프로그램해 보기 바란다.

(그림 3) 보기1의 프로그램


위의 프로그램 설명에서 문번호 200번은 WHILE문이 REM문 내에 포함되어 있는데 이것은 BASIC의 종류 중에서 어떤 것은 WHILE을 지정용어(reserved word : BASIC과 같은 컴퓨터의 특정언어 내에서 사용하기로 미리 약속해 놓은 용어)로 쓰지 않기 때문에 일반적인 BASIC형태에서 공통으로 쓸수 있는 문장으로 작성했기 때문이다. 물록 여러분이 사용하고 있는 컴퓨터 시스템이 BASIC에서 WHILE을 지정용어로 쓴다면 그에 적합하도록 프로그래밍하면 된다.

그럼 WHILE loop문의 일반적인 형식을 정리해 보자.

WHILE loop문
형식
 

WHILE loop문


설명:●문번호1과 2는 loop의 바로 앞과 뒤의 문장이다.
●조건1은 loop가 실행될 수 있는 경우를 나타낸다. 따라서 WHILE loop문은 조건1이 참일 때만 실행된다.
●조건2는 loop실행이 끝나는 경우를 나타낸다. 따라서 매번 loop실행전에 조건2를 점검하여서 조건2가 허위(조건1이 참)일 경우에만 loop문이 반복해서 실행된다.
●조건2가 참(조건1이 허위)일 때에는 loop가 끝난 바로 뒷 문장부터 다시 계속해 나간다.

(보기2)
다음에 보인 프로그램은 변수C$에 문자열(Character strings)을 읽어들여서 그것을 인쇄하는 것이다.다만 문자열이 "DONE"이 아닌 경우에만 반복된다.
 

변수 C$에 문자열을 읽어들여서 그것을 인쇄하는 것


WHILE loop문을 사용한 알고리즘
WHILE loop문을 사용하여 알고리즘을 개발할 때에는 아래의 단계를 고려하기 바란다.
1) loop문 내에서 처리해야 할 내용이 무엇인지 완전히 기술한다.
2) loop제어변수를 정한다. 이 변수는 loop문내에 이미 존재하고 있는 경우도 있지만(문제1의S), 필요할 때에는 새로 추가한다.
3) 매번 loop문의 실행 전에 수행할 loop 제어변수시험을 정한다.
4) 시험이전에 loop제어변수의 값을 초기화(initialize)한다.
5) loop문의 마지막 부분에서 제어변수의 값을 변경시킨다.

(문제 1)
영준이는 고등학교 1학년에 재학중이다. 어제 국어시험을 보았는데 선생님께서 컴퓨터로 성적을 처리할 수 있는 프로그램을 작성하라고 말씀하셨다. 원하는 결과를 학급의 평균점수와 최고점수 학생의 출석번호, 성명, 점수를 인쇄하는 것이다. 함께 프로그래밍을 해보자.

(설명)
문제를 풀기 위한 실마리를 찾기 위해서, 컴퓨터 없이 수작업으로 최고점수를 찾는 경우를 가정해보면 점수가 기록된 목록을 위에서부터 차례로 하나씩 읽어 내려갈 것이다. 새로 읽은 점수가 앞에 읽은점수보다도 크면 그것을 가장 큰 점수로 기억하고 계속하여 다음 점수를 읽어가는 방법을 사용할 수 있다. 예를들어 점수가 35, 12, 68, 8, -1(-1이면 종료라고 가정)이라면

(점수) (결과)
35 35는 첫번째 읽은 수이므로 가장 큰수로 기억한다.
12 12는 35보다 작으므로 35는 아직 가장 큰 수이다.
68 68은 35보다 크므로 가장 큰 수는 68이 된다.
8 8은 68보다 작으므로 68은 아직 가장 큰 수이다.
-1 종료

이것을 알고리즘의 개발에 이용해 보자.
 

(그림 4) 문제1의 흐름도


문제에 대한 흐름도는 (그림 4)에 나타내었는데 각각의 점수를 읽을 때마다 최고점수 L과 비교하여 새로운 최고점수를 찾아내는 일이 이 알고리즘의 주요 내용이다.

그런데 입력으로 받아들여야 할 점수가 몇개까지 있는지 미리 정해져 있지 않는 경우라면 입력자료가 더이상 없다는 것을 프로그램에게 인식시켜야 할 것이다. 이러한 기능을 하는 것이 경계값(sentinel value)인데 자료표에 V로 표시되어 있으며 점수가 음수일 수는 없으므로 이 문제에서는 V=-1로 정하였다.

즉 매번 점수를 읽을 때마다 점수가 -1인지를 점검하여 -1이 아닐 때에만 WHILE loop 문을 반복하고 -1인 경우에는 WHILE loop문을 빠져 나간다.
 

(그림 5) 문제1의 프로그램과 결과


(문제 2)
갑과 을 2사람이 자전거 경주를 하고있다. 을이 더 빨리 달릴 수 있으므로 갑이 먼저 출발한다. 갑이먼저 출발한 후 을이 출발점을 떠난 시각부터 매 30분마다 2사람이 간 거리를 인쇄하는 프로그램을 작성해 보자. 단 갑이 을보다 앞서고 있는 동안에만 인쇄한다.

(설명)
 

(그림 6) 문제2의 흐름도


이 문제는 실제 상황에서 발생할 수 있는 사건을 컴퓨터로 모의실험하는 것이다. 2사람이 간 거리를 계산하기 위해서는 거리=속도 X시간(단, 속도는 ㎞/시간)의 공식을 사용하며, 을이 출발하기 전에 갑이 먼저 간 거리를 고려하면 되겠다. 문제에 대한 알고리즘은(그림6)에 나타냈는데 갑이 먼저간 거리는 속도와 먼저 출발한 시간이 곱(D1=S1*H)으로 구하며 이때 을이 간 거리는(D2)는 0이다. T는 을이 출발한 시각으로 부터 매 30분마다 경과한 시간을 표시하며 loop문의 반복은 물론 D1이 D2보다 큰 경우에만 실행된다.
 

(그림 7) 문제2의 프로그램과 결과


하향식 프로그래밍과 서브루틴

앞에서 설명하였던 것처럼 문제를 컴퓨터에 의해서 해결하고자 할 때 바람직한 방법은 전체의 문제를 여러 개의 작은 문제로 나누어서 각각 별도로 처리하는 것이다.

우리는 지금까지 알고리즘을 여러 단계로 나누어서 개발하고 필요하면 각 단계를 또 다시 보다 작은 크기의 단계로 나누는 과정을 통하여 문제를 분할하는 연습을 많이 했었다. 이와같이 하나의 큰 문제점을 여러 개의 작은 문제들로 계속 세분해가면서 알고리즘을 개발하는 기법을 하향식 프로그래밍(top-down Programming)이라고 한다.

그러나 지금까지 우리가 연습하였던 프로그램들은 그다지 복잡하지 않은 것이었기 때문에 알고리즘을 여러 수준(level)으로 까지 세분하지 않아도 되었으며 여기에서도 간단한 프로그램으로 하향식 프로그래밍을 설명하겠지만 실제의 경우에는 복잡한 문제들이 많아서 이 기법은 매우 유용하게 쓰이는 것이다.

하향식 프로그래밍은 주프로그램 (main program)과 서브루틴(subroutine)의 작성으로 이루어지는데 우리가 알고리즘을 작성할 때 구체화시키지 않은 처음의 것은 주프로 그램에 해당하며 각각 세분되어 구체화시킨 부분들은 서브루틴이라고 할 수 있다. 이때 서브루틴은 주프로그램내의 문장에서 필요시 연결되어 수행되는 것이다.

서브루틴 정의
●GOSUB문에 의해서만 연결되어 수행되어 RETURN문에 의해서만 수행이 종료되는 BASIC문장의 군(group)
●GOSUB문번호
주프로그램으로부터 서브루틴의 첫번째 문장으로 연결시킨다.
●RETURN
서브루틴 수행후 주프로그램 내의 GOSUB문 바로 다음 문장으로 제어(control)를 이동.

STOP문
형식 : STOP
설명 : 프로그램의 실행을 끝마친다.

(문제 3)
임의의 두 수를 생성하여 화면에 보여준 후 두 수를 암산하여 입력하게 하는 주프로그램과 그 답이 맞는지 알려주는 서브루틴을 작성해 보자.

(설명)
 

(그림 8-가) 문제3의 1차 및 2차흐름도-주프로그램



(그림8)은 주프로그램과 서브루틴을 설명하고 있으니 차이점을 잘 이해하기 바란다. loop문의 반복을제어하기 위해서 WHILE loop문을 사용하였다(제어변수는 G).RND는 0과 1사이의 임의의 수를 만드는 기능을 갖고 있으며 INT는 소숫점이하의 수를 잘라버리고 정수로 만드는 기능이 있다.
 

(그림 8-나) 3.6을 구체화 시킨것-서브루틴


(그림9)의 프로그램이 실행되는 순서는 다음과 같다.
1)주프로그램 : 문번호 100-300
2)서브루틴 : 문번호 1010-1140
3)주프로그램 : 문번호 305-360
 

(그림 9) 문제3의 프로그램과 결과
 

1986년 12월 과학동아 정보

  • 전문철 연구원

🎓️ 진로 추천

  • 컴퓨터공학
  • 소프트웨어공학
  • 정보·통신공학
이 기사를 읽은 분이 본
다른 인기기사는?