4-2-마.for문 실습

반복문은 모든 프로그래밍 언어에 존재하는 가장 기본적인 제어 구조이다. 여기까지 학습을 진행하면 for문 정도는 아주 쉽다는 생각이 들겠지만 실전에서 루프는 훨씬 더 복잡한 형태로 응용되기 때문에 사실 초보자에게 루프는 결코 만만한 대상이 아니다. 하나의 루프에서 두 개의 제어 변수 사용하기, 루프 중간에서 제어 변수 조작하기, 무한 루프에 둘러싸인 다중 루프 등을 실전에서 만나게 되면 다소 헷갈린다는 생각이 들 것이다.

for문의 기본 형식을 이해하고 이미 만들어져 있는 예제를 분석하는 것은 아주 쉽지만 직접 반복문을 만드는 것은 응용력을 필요로 한다. 그래서 여기서는 for문에 대한 응용력을 기르기 위해 몇 가지 연습을 해 보도록 하자. 2장에서 만들었던 Triangle 예제는 *문자로 삼각형을 그렸으며 앞에서 이미 분석해 보았다. 이 예제를 조금 변형하여 다음과 같이 출력하도록 해 보자.

 

1

22

333

4444

55555

666666

7777777

88888888

999999999

::::::::::

;;;;;;;;;;;

<<<<<<<<<<<<

=============

>>>>>>>>>>>>>>

???????????????

 

각 줄에 출력될 문자를 문자 개수와 같은 숫자로 만든 것이다. 이 문제를 풀려면 제어 변수 i와 출력할 문자 개수, 그리고 출력할 문자의 코드 등의 관계를 먼저 파악해야 한다. 제어 변수와 각 반복 단위에 적용할 값의 함수 관계를 찾는 것이다. 도표로 관계를 정리해 보면 다음과 같은 결과를 얻을 수 있다.

 

제어 변수 i

문자의 개수

출력할 문자 코드

1

1

'1'

2

2

'2'

3

3

'3'

4

4

'4'

 

문자의 개수는 곧 안쪽 루프인 j의 반복 회수이며 j루프의 조건식에 사용된다. 이 값이 i와 같으므로 j의 반복 회수에는 곧바로 i값을 쓸 수 있다. 출력할 문자는 i의 정수값을 문자 코드로 바꾼 것인데 아스키 코드표를 보면 문자 '1'의 코드값이 49(0x31)이고 '2'의 코드값이 50(0x32)임을 알 수 있다. i와 이 코드와의 관계는 48만큼 차이가 나므로 i에 48을 더하면 곧 정수값에 해당하는 문자 코드를 구할 수 있다. i+48은 다시 i+'0'로 표기할 수 있으므로 출력되는 문자를 "*"로 고정하지 말고 이 연산식을 사용하면 된다. 정답은 다음과 같다.

 

: Triangle2

#include <Turboc.h>

 

void main()

{

     int i,j;

 

     for (i=1;i<=15;i=i+1) {

          for (j=0;j<i;j=j+1) {

              printf("%c",i+'0');

          }

          printf("\n");

     }

}

 

Triangle 예제와 비슷하되 출력할 문자가 i+'0'으로 바뀐 것만 다르다. 문자 하나만 출력하므로 좀 더 간단하게 쓰면 putch(i+'0')으로 쓸 수도 있다. 다음 예제는 삼각형을 거꾸로 뒤집어 출력한다.

 

***************

**************

*************

************

***********

**********

*********

********

*******

******

*****

****

***

**

*

 

이 정도도 아주 쉽다. i루프의 반복 방향을 반대로 뒤집기만 하면 된다.

 

: Triangle3

#include <Turboc.h>

 

void main()

{

     int i,j;

 

     for (i=15;i>=1;i=i-1) {

          for (j=1;j<=i;j=j+1) {

              printf("*");

          }

          printf("\n");

     }

}

 

i를 1~15까지 반복하면 삼각형이 되지만 15부터 1씩 감소하여 1까지 반복하면 역삼각형이 그려진다. 첫 번째 줄에 * 문자 15개, 그 다음 줄에 14개, 그 다음 줄에 13개 이런 식으로 말이다. Triangle 예제에서 i루프의 초기식, 조건식, 증감식만 바꿔 주면 역삼각형을 쉽게 그릴 수 있다. 또는 i루프는 그대로 두되 i와 j의 반복 회수와의 관계를 다르게 설정할 수도 있다. i가 1일 때 반복 회수는 15, 2일 때 14, 3일 13인 식이므로 이 관계는 16-i가 된다.

 

     for (i=1;i<=15;i=i+1) {

          for (j=1;j<=16-i;j=j+1) {

              printf("*");

          }

 

j루프의 계속 조건을 j가 16-i보다 작거나 같다로 바꾸어도 동일하다. 보다시피 하나의 문제를 푸는 방법은 여러 가지가 존재한다는 것을 알 수 있다.

 

 Triangle4, Triangle5

삼각형의 수평 대칭 모양을 그리는 예제를 만들어 보자. 이런 모양은 약간의 응용을 필요로 하는데 눈에 보이지 않는 공백 부분도 출력 대상으로 생각해야 한다. 단, 루프를 연습하고 있는 중이므로 이 문제를 푸는데 커서를 강제로 옮기는 gotoxy 함수는 사용하지 않기로 하자. 오른쪽 과제는 이등변 삼각형을 그린다. 최초 출력 위치, 출력할 문자 개수 등이 제어 변수와 어떤 관계를 가지는지를 잘 파악해야 한다.

 

              *

             **

            ***

           ****

          *****

         ******

        *******

       ********

      *********

     **********

    ***********

   ************

  *************

 **************

***************

               *

              ***

             *****

            *******

           *********

          ***********

         *************

        ***************

       *****************

      *******************

     *********************

    ***********************

   *************************

  ***************************

 *****************************

 

 

 ForMultiAdd

반복문을 사용하여 (1) + (1*2) + (1*2*3) + (1*2*3*4) + (1*2*3*4*5)의 결과를 구하라. 을 구하는 문제이다. 2중 루프를 사용할 수도 있고 단일 루프로도 문제를 풀 수 있다.