명령형 언어의 특징과 그 결과 간의 상호 작용을 다음 예를 가지고 알아본다. 이 예는 소수를 작성하는 프로그램이다. 2~n 사이의 소수를 인쇄한다.
program primes(input, output) :
const n = 50 ;
var i : 2.. n ;
j : 2.. 25 :
i_is_prime : bloolem ;
begin
for i := 2 to n do
begin { i가 소수인가? }
j := 2 ; i_is_prime := true ;
while i_is_prime and ( j <= i div 2) do
if ((i mod j) < > 0) then j = j +1
else i_is_prime := false ;
{ 소수이면 값을 인쇄 }
end
end.
이 프로그램은 내포된 두 개의 반복문으로 구성되었다. 외측 반복문 (for i := 2 to n)은 주어진 영역(2 ~ ㅜ)의 값을 순차로 실행하며, 내측 반복문은 이들이 소수인지를 조사한다. 각 반복문을 이해하려면 최소한 몇 번 정도는 수행시키면서 종료 조건을 검사하고, 또 올바른 수행할 수 있는 조건을 조사하여야 한다.
여기서 내측 반복문의 수행 횟수는 외측 반복문의 제어 변수 i에 따라 달라짐을 알 수 있다. 또 외측 반복문의 if문도 내측 반복문의 배정문에 따라 수행 내용이 달라진다. 이를 일반화하면 명령형 프로그램은 계층적 (hierraachical)이 아님을 알 수 있다.
계층적이라는 용어는 각 원소가 하부의 다른 부분의 결과를 이용하도록 되어 있다. 이 예에서도 내측 반복문은 외측 반복문에서 변경시키는 i 값에 따라 달라지며, 외측 반복문은 내측 반복문에서 i_is_prime의 값을 무엇으로 하느냐에 따라 달라진다. 즉, 구성 요소들이 서로 밀접하게 관련되어 있는 것이다. 각 구성 요소는 값을 계산하는 것이 아니라 결과, 특히 변수에 값을 배정하는 결과를 만들어낸다.
제어 구조는 문장의 순서를 조정하여 합하여진 결과들이 목적에 맞도록 하는 것이다.
댓글