여기서는 2장에서 다룬 while 문을 사용하여 문제를 효과적으로 해결할 수 있는 프로그램 예제 몇 가지를 살펴본다.

      문제 명세    
 


10개의 정수를 읽어들여서 이 중에서 가장 작은 값을 결정하여 출력하시오.

 
     

 

      분석    
 


문제의 입력과 출력을 생각하고, 고려된 변수들간의 관계 식을 생각한다.


 

분석 사항

                    내용
 

문제 입력

    10개의 정수(int n)    
 

문제 출력

    가장 작은 수(int min)
 

추가된 변수

    반복 회수를 제어하기 위한 변수(int count)
 

관계식

     min ≤ n, n은 10개의 정수

여기서 문제의 입력이 10개의 정수임에도 단지 한 개의 변수 n만이 고려되고 있다. 이것은 반복 구조를 사용하여 n에 10개의 정수를 입력받겠다는 것을 의미한다. 또한, 반복 구조의 반복 회수를 제어하기 위해서 count의 변수가 추가로 도입되었음을 유의하라.

 
     

 

      설계    
 


알고리즘은 입력과 출력을 먼저 생각하고, 다음에 출력을 입력으로부터 어떻게 생성할 것인지를 고려하는 순서로 작성한다.

 

문제의 해결 과정은 다음과 같다. 먼저, min을 읽어들인 첫 번째 정수로 초기화한다(알고리즘 단계 1 ∼ 3 과정). 다음에, 나머지 9개의 정수에 대해서, 읽어들일 때마다 min과 비교하여 작은 값을 min이 포함하게 한다(알고리즘 단계 4 ∼ 7 과정). 따라서 min은 읽어들인 정수들 중에서 항상 작은 값을 포함한다.

문제 해결 과정을 다음과 같이 개략적으로 다이어그램으로 표현한다.

알고리즘 6-2에서 단계 2와 6은 한 개의 C 문장으로 표현하기에 복잡한 수준이다. 따라서 다음과 같이 세분화시킨다.

 

단계 2와 6이 들여쓰기를 통해서 각각 세분화되었다. count 변수는 읽어들인 정수의 개수를 계속 추적하여 WHILE 구조의 반복 수행을 제어하는 것을 알 수 있다.

 

 
     

 

      구현

이제 알고리즘 6-2-1의 각 단계를 한 개의 C 문장으로 변환할 수 있다. 고려 사항은 단계 4의 WHILE 구조의
본체가 3개의 행동(5, 6, 7)을 포함하기 때문에 변환되는 C의 while 문의 본체는 복합문으로 표현되고,
또한 행동 6은 if 문의 선택 구조로 표현된다는 것을 생각할 수 있다.

다음은 알고리즘 6-2-1에 대한 C 프로그램 버전의 작성 과정을 보여준다.

 


여러분은 알고리즘의 각 단계를 적합한 C 문장으로 변환함으로써 알고리즘에 대한 C 프로그램을 작성할 수 있음을 알 수 있다.

 

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

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

 

[문장 단위 입력 실행] 여러분은 다음 실습창에서 C 프로그램을 한 문장씩 입력하여 실행시켜  볼 수 있다. 새로운 프로그램을 한 문장씩 입력하고 오른쪽 창에서 그 실행 결과를  살펴 보시오.

사용법

1.아래의 실습창중 < C 문장 입력 > 란을 통하여 C문장 한문장씩 입력하고 Enter 키입력 버튼을 클릭하 면 해당 문장에 대한 시각화가 오른쪽에 나타나게 됩니다.
2.제어문장(while,for,if~else,do~while)은 아래의 실습창중 < 제어구조 문장 입력 >을 통하여 입력하고 제어구조 입력 버튼을 클릭하게 되면 새로운 창이 생성되어 제어구조문장 내부를 단계별로 실행할수 있습니다.
3.scanf()함수 호출시 조그만 새로운창이 생성되어 입력받게 됩니다.
4.
printf()
함수실행은 오른쪽실습창 하단 < printf 실행 창 >에 나타나게 됩니다.

자세한 사용법은 여기를 클릭하여 주십시요
 

      문제 명세    
 


사용자가 음수를 입력할 때까지 정수를 계속 입력받고, 입력한 정수에 대해서 짝수의 개수와 홀수의 개수를 계산한다. 사용자가 음수를 입력하면 더 이상의 입력을 중단하고, 계산된 짝수의 개수와 홀수의 개수를 적절히 출력한다.

 
     

 

      분석    
 

문제의 입력과 출력을 생각하고, 고려된 변수들간의 관계 식을 생각한다. 여기서는 사용자가 수를 반복해서 입력하기 때문에 반복 구조를 생각할 수 있다. 그러나 입력한 수가 음수일 때 반복을 중단하므로, 프로그램 6-2에서와 같이 반복 회수를 추적하기 위한 count 변수가 필요 없다.

 

분석 사항

                    내용
 

문제 입력

    정수들(int n)  
 

문제 출력

     짝수와 홀수의 개수(int even, odd)

 
     

 

      설계    
 


알고리즘을 설계하기 전에 문제 해결 과정을 생각해보자. 이러한 생각을 토대로 알고리즘이 기술된다. 다음은 문제 해결 과정에 대한 생각이다.

문제에서 값이 여러 번 입력될 수 있기 때문에, 반복 구조를 생각한다. 먼저, 한 개의 정수를 읽어들여서 음수인지를 판단한다. 음수인 경우에는 반복 구조를 탈출하고, 그렇지 않으면 반복 구조의 본체를 생각한다.

본체는 반복시 수행해야 할 행동들을 포함한다. 본체가 어떠한 행동들을 포함해야 하는지를 생각한다. 여기서 두 가지의 행동을 생각할 수 있다. 첫째는, n이 짝수인지를 판단하여 짝수이면 even에 1을 더하고, 그렇지 않으면 odd에 1을 더한다. 둘째는 또 다른 정수 n을 읽어들이는 것이다. 다음에는, 새로 읽어들인 n에 대해서 다시 음수인지를 판단하는 과정을 반복한다.

위에서 생각한 반복 구조를 순서도 형식의 다이어그램으로 표현하면 다음과 같다.


문제 해결 과정에 대한 위의 생각들을 다음과 같이 알고리즘으로 기술한다.



다음은 위에서 기술한 부분 알고리즘을 토대로 작성한 문제에 대한 전체 알고리즘이다.

 

 

 
     

 

      구현    
 


다음은 알고리즘 6-3을 C 프로그램으로 변환하는 과정을 보여준다.

 
     

프로그램 6-26-3을 비교해보라. 프로그램 6-2에서 while 문의 반복 회수는 10으로 이미 알 수 있는 것에 반해서, 프로그램 6-3에서는 반복 회수가 미리 알 수 없다. 반복 회수는 프로그램 실행시에 사용자가 입력한 값에 의해서 결정된다.

즉, 사용자는 원하는 개수만큼의 값을 입력할 수 있다. 사용자가 반복을 중단하고 싶으면 음수를 입력하면 된다. 이와 같이 반복을 중단하기 위해서 사용된 값을 보초 값(sentinel value)이라 한다.

 

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

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

 

[문장 단위 입력 실행] 여러분은 다음 실습창에서 C 프로그램을 한 문장씩 입력하여 실행시켜  볼 수 있다. 새로운 프로그램을 한 문장씩 입력하고 오른쪽 창에서 그 실행 결과를 살펴 보시오.

사용법

1.아래의 실습창중 < C 문장 입력 > 란을 통하여 C문장 한문장씩 입력하고 Enter 키입력 버튼을 클릭하 면 해당 문장에 대한 시각화가 오른쪽에 나타나게 됩니다.
2.제어문장(while,for,if~else,do~while)은 아래의 실습창중 < 제어구조 문장 입력 >을 통하여 입력하고 제어구조 입력 버튼을 클릭하게 되면 새로운 창이 생성되어 제어구조문장 내부를 단계별로 실행할수 있습니다.
3.scanf()함수 호출시 조그만 새로운창이 생성되어 입력받게 됩니다.
4.
printf()
함수실행은 오른쪽실습창 하단 < printf 실행 창 >에 나타나게 됩니다.
5.while 제어구조문내부에 if~else 구조가 중첩되어 있는 경우에 여러분은 while문 내부의 if~else구문을 수행시에 다른 새로운 창을 통하여 자세하게 if~else문 내부를 단계별로 수행할수 있습니다.
6.여러분의 실습에 앞서 필히 자세한 사용법을 살핀후에 실습에 임해 주시기 바랍니다.

자세한 사용법은 여기를 클릭하여 주십시요

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


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