컴퓨터가 조건 판단을 수행할 수 있는 능력과 마찬가지로, 일련의 문장을 반복해서 수행할 수 있는 능력도 매우 중요하다.

다음 문제를 생각해보자: "10개의 수를 읽어들여서 모두 합하여 그 결과를 출력하는 프로그램을 작성하시오." 여러분은 이 프로그램을 어떻게 작성할 것인가? 먼저, 이 문제에 대한 알고리즘은 다음과 같이 작성할 수 있다.

 

 


다음에, 위의 알고리즘에 대한 프로그램은 다음과 같이 작성될 수 있다.

알고리즘 6-1의 단계 2는 한 개의 수를 읽어들여서 변수에 저장하는 10개의 scanf() 문장으로 변환되는 것을 알 수 있다. 10개의 수를 더하기 전에 모두 읽어들여서 기억공간에 보관해야하기 때문에 10개의 변수가 필요하다. 그리고 단계 3은 10개의 변수를 모두 더하여 sum에 배정하는 배정문으로 표현된다.

[프로그램 단위 입력 실행] 다음 실습창을 통해서 프로그램  6-1의 실행과정을 알아본다.

(여러분은 실습창의 왼편에 위치한 '새프로그램 입력' 버튼을 클릭하여 새로운 프로그램을 입력하여 실행시켜 볼 수 있다. )

10개의 수를 한꺼번에 읽어들여서 sum에 더하는 것보다는 수를 한 개씩 읽어들여서 sum에 더한다면 단지 한 개의 변수만 사용될 수 있다. 다음은 이와 같은 방식으로 처리하도록 알고리즘 6-1과 프로그램 6-1을 각각 변경한 것이다.

알고리즘 6-1-1에서 한 개의 수를 읽어들여서 sum에 합하는 과정이 10번 반복되고, 각 과정은 프로그램 6-1-1에서 동일한 두 개의 문장으로 변환되는 것을 알 수 있다. 대신 값 입력에 사용된 변수는 n1, n2, ..., n10의 10개에서 n의 한 개로 줄어들었음을 알 수 있다.

[프로그램 단위 입력 실행] 다음 실습창을 통해서 알고리즘 6-1-1의 실행과정을 알아본다.

(여러분은 실습창의 왼편에 위치한 '새프로그램 입력' 버튼을 클릭하여 새로운 프로그램을 입력하여 실행시켜 볼 수 있다. )

프로그램 6-1이나 6-1-1은 의미상 차이가 없으나, 동일한 문제를 갖는다. 만약에 10개의 수가 아니고 100개, 1000개, 또는 그 이상의 수를 읽어들여서 더하는 문제의 경우에 어떻게 해결할 것인가?

동일한 처리 과정을 똑같이 수백, 수천번 이상씩 반복하여 표현해야 하는가? 만약, 그렇다면 프로그램 작성하는 일이 정말로 따분하고 시간이 걸리는 작업이 될 것이다.

대부분의 언어가 처리 과정의 반복을 효과적으로 표현할 수 있는 반복 구조를 제공한다. 다음은 반복 구조의 한 예를 순서도로 표현한 것이다.

위의 순서도에서 처리 과정은 반복적으로 수행해야 할 부분을 나타낸다. 조건처리 과정의 반복 회수를 제어하는 부분을 나타내는 것으로 처리 과정을 계속 반복할 것인지를 판단한다. 조건이 참으로 평가되면, 처리 과정이 계속 수행되고, 그렇지 않으면 반복 구조의 수행을 끝낸다. 처리 과정 수행 후에는 반복을 계속 할 것인지를 판단하기 위해서 조건을 다시 평가한다.

중요한 것은 조건이 언젠가 거짓으로 평가되어 반복 구조를 탈출할 수 있어야 한다는 것이다. 그렇지 않는다면 처리 과정이 무한정 반복될 수 있을 것이다. 이것은 실행 오류이다. 따라서 처리 과정에서 조건이 언젠가 거짓으로 평가될 수 있도록 적절한 행동이 추가되어야 한다.

다음은 반복 구조를 표현하기 위한 알고리즘 구조를 보여준다.

 
  < 그림 6.2: 반복 구조를 위한 알고리즘>

반복 구조 표현을 위한 그림 6.2의 알고리즘 구조는 그림 6.1의 순서도와 동일한 실행 의미를 갖는다. 즉, 조건을 평가하고, 그 결과가 참이면 처리 과정을 수행하고, 그렇지 않으면 WHILE 문을 빠져나온다. 처리 과정을 수행한 후에는 다시 조건을 평가하여 반복 여부를 판단한다.

다음은 반복 구조를 위한 알고리즘과 순서도의 관계를 보여준다.

이제 알고리즘 6-1-1그림 6.2의 반복 구조를 위한 알고리즘 구조로 표현해 보자.

 

반복 구조의 알고리즘을 사용하여 알고리즘 6-1-1보다 훨씬 간단하게 표현할 수 있음을 알 수 있다.

알고리즘 6-1-2의 WHILE 문의 조건을 표현하는 부분에서 처리 과정이 10번 반복되었는지를 어떻게 아는가? 이를 위해서 count의 변수를 도입하여 처리 과정의 반복 회수를 다음과 같이 추적한다.

 

count 변수는 WHILE 문 시작 전에 0으로 초기화되고, WHILE 문에서 처리 과정 반복시마다 1만큼 증가된다. 따라서 WHILE 문의 조건 부분에서 count 변수의 값이 10이하이면 반복이 10번 이하 이루어졌음을 나타내고, 10이상이면 반복이 11번 이상 이루어졌음을 나타낸다.

count의 값이 10이면, 조건 식의 값이 거짓되어 WHILE 문을 탈출한다. 이 경우 처리 과정이 이미 10번 반복이 이루어진 상태이고, 따라서 WHILE 문의 탈출은 올바르다.

여러분이 알고리즘 6-1-3의 처리 과정에서 마지막 행동을 빠뜨린다면 어떻게 될 것인가? 반복이 이루어진 후에도 count의 값은 여전히 0의 값을 가질 것이고, 따라서 조건 식의 값은 항상 참이 될 것이다. 따라서 반복은 무한정으로 계속 이루어질 것이다.

여러분은 반복 구조의 조건 식이 언젠가는 거짓으로 평가될 수 있도록, 처리 과정에 조건 식 값에 영향을 미치는 행동을 반드시 포함시켜야 하는 것을 명심하라. 그렇지 않으면, 반복은 무한정으로 계속 이루어질 것이다.

C 언어는 반복 구조를 효과적으로 표현할 수 있는 세 가지 형태의 구조를 제공한다: while 문, for 문, 그리고 do while 문.

프로그램 중에서 반복되는 부분을 루프(loop)라고 한다. 이것은 마지막 문장을 수행한 후에 다시 처음 문장으로 되돌아와서 고리(루프)를 형성하기 때문이다. C에서 제공하는 반복 구조, while 문, for 문, do while 문을 통칭해서 루프라고 부른다.

다음 장에서는 C의 각 반복 구조에 대해서 살펴본다.



top으로... 다음페이지로.. home으로..