본문으로 바로가기

[C언어] 제어문 #4 for

category C 2014. 5. 3. 23:26

for

while 문와 같은 반복 기능을 한다. while 문은 조건반복에 많이 쓰이며, for 문은 단순반복에 많이 쓰인다.

 

[문법]

for (초기치; 조건문; 증감)

{

    문장;

}

예1)

for (int i = 0; i < 10; ++i)

{

    printf("%d ", i);
}

결과를 추론해보자

 

예2)

for (int i = 1; i < 10; i = i*2) 

{

    printf("%d ", i);
}

결과를 추론해보자

 

예2)

for (int i = 9; i > 0; i = i/3) 

{

    printf("%d ", i);
}

결과를 추론해보자

 

<유의점>

for (int i = 0; i < 10; ++i);

{

    printf("%d ", i);
}

과연 어디가 틀렸을까?

 

<for 문의 실행순서>

1. int i = 0; 으로 초기화 한다.

for (int i = 0; i < 2; ++i)

{

    printf("%d ", i);
}

 

2. i < 2 조건을 판단한다.

   2.1 참이면 3을 이동

   2.2 거짓이면  루프를 탈출한다.

for (int i = 0; i < 2; ++i)

{

    printf("%d ", i);
}

 

3. 블록{} 안의 문장을 실행한다.

for (int i = 0; i < 2; ++i)

{

    printf("%d ", i);
}

 

4. ++i 실행하며, 1씩 증가된다. 2번으로 이동

for (int i = 0; i < 2; ++i)

{

    printf("%d ", i);
}

 

<특이한 for 문>

#include <stdio.h>
void main()
{
 for (int i = 0, j = 10; i <= 10 && j >= 0; ++i, --j)
 {
  printf("%2d %2d\n", i, j);
 }
}

//-----------------------------------------

#include <stdio.h>
void main()
{
 int iNum;
 scanf("%d", &iNum);
 for (int i = 0, j = iNum; i < j; ++i, --j)
 {
  printf("%2d %2d\n", i, j);
 }

 puts("------");

 for (int i = 0, int j = iNum; i <= iNum/2 + iNum%2 -1; ++i, --j)
 {
  printf("%2d %2d\n", i, j);
 }

 puts("------");

 for (int i = 0, int j = iNum; i <= iNum/2 + iNum%2 -1; ++i)
 {
  j = iNum - i;
  printf("%2d %2d\n", i, j);
 }
}

 

<실습>

1 + 2 + ... + 100 = ?

1 ~ 100 까지 홀수의 합은?

 

<실습>

10 ! = 10 * 9 * ... * 2 * 1 (Factorial) 을 구하시오!

 

<다중 For문>

for 문 안에 중첩(nested)해서 또 다른 for 문을 넣을 수 있다.

for 문 안에 있는 변수가 특정한 의미를 가지고 있지 않다면, 전통적으로 i, j, k 순으로 쓴다.

 

-> 이중 For 문

for (int i = 0; i < 2; ++i)

{

    for (int j = 0; j < 2; ++j)

    {

        printf("i = %d, j = %d\n", i , j);

    }

}

<결과>

i = 0, j = 0
i = 0, j = 1
i = 1, j = 0
i = 1, j = 1
Press any key to continue

 

-> 삼중 For 문

for (int i = 0; i < 2; ++i)

{

    for (int j = 0; j < 2; ++j)

    {

        for (int k= 0; k< 2; ++k)

        {

            printf("i = %d, j = %d, k = %d\n"), i , j);

        }

    }

}

 

<결과>

i = 0, j = 0, k = 0
i = 0, j = 0, k = 1
i = 0, j = 1, k = 0
i = 0, j = 1, k = 1
i = 1, j = 0, k = 0
i = 1, j = 0, k = 1
i = 1, j = 1, k = 0
i = 1, j = 1, k = 1
Press any key to continue

 

<유의점>

for (int i = 0; i < 2; ++i)

{

    for (int j = 0; i < 2; ++j)

    {

        printf("i = %d, j = %d\n", i , j);

    }

}

과연 어디가 틀렸을까?

 

기대하는 결과는 아래와 같지만

i = 0, j = 0
i = 0, j = 1
i = 1, j = 0
i = 1, j = 1
Press any key to continue

 

실행해보면 결과는 i = 0이며 j 의 값은 무한정 올라간다.

 

<실습>

구구단 만들기 (아래와 같이 출력하시오)

 

---2단---

2 * 1 =  2

2 * 2 =  4

 

...

2 * 9 = 18

---3단---

3 * 1 =  3

...

...

...

9 * 9 = 81

 

<실습>

1^1 + 2^2+ 3^3 + 4^4 + 5^5  = ?

1 + 2*2 + 3*3*3 + 4*4*4*4+ 5*5*5*5*5 = ?

 

실행결과

1^1 =     1, sum =      1
2^2 =     4, sum =      5
3^3 =    27, sum =    32
4^4 =  256, sum =   288
5^5 = 3125, sum = 3413

1^1 + 2^2+ 3^3 + 4^4 + 5^5  = 3413
Press any key to continue

 

<과제>

2~100 까지 소수 구하는 프로그램 만들기

 

출력결과

2 3 5 7 ...

 

 

특정한 수 n(2 이상)을 2에서 부터 n 까지 나누었을때

나머지가 0인 것이 n 자기 자신 밖에 없는 수를 소수라고 한다.

 

알고리즘

만약 n == 7 이라면

7 % 2, 7 % 3, 7 % 4, 7 % 5, 7 % 6 로 연산해서 나머지가 0인 경우가 한번도 없을 경우

7은 바로 소수가 된다.

 

효율적인 방법으로는 sqrt(square root) 즉 루트16을 2 부터 15 까지 조사를 하는 것 보다

루트16 의 값은 4이니깐 4부터 조사를 하면 된다고 수학적으로 알려져 있다.

특정한 수 n의 경우 루트n 값으로 부터 시작하면 된다.

 

 

 

 

<참고> 참고만 하세요! 게임프로그래머 입사 시험에 단골로 등장합니다.  

문자열 뒤집어 출력하기

 

<방법1>

 

#include <stdio.h>
#include <string.h>
void main()
{
     char text[1024], temp;
     scanf("%s", text);
     for (int i = 0, j = strlen(text)-1; i < j; ++i, --j)
    {
        temp = text[i];
        text[i] = text[j];
        text[j] = temp;
    }
    printf("%s", text);
}

 

 

<방법2> 

 

#include <stdio.h>
#include <string.h>
void main()
{
    char text[1024], temp;
    scanf("%s", text);
    int i, j = strlen(text)-1;
    for (i = 0; i < j; ++i)
   {
        temp = text[i];
        text[i] = text[j];
        text[j--] = temp;
    }
    printf("%s", text);
}

 

<방법3> 

 

#include <stdio.h>
#include <string.h>
void main()
{
    char text[1024], temp;
    scanf("%s", text);
    iNum = strlen(text)-1;

    for (int i = 0, int j = iNum; i <= iNum/2 + iNum%2 -1; ++i, --j)
    {

        temp = text[i];
        text[i] = text[j];
        text[j] = temp;
    }
    printf("%s", text);
}

 

<방법4>

 

#include <stdio.h>
#include <string.h>
void main()
{
    char text[1024], temp;
    scanf("%s", text);
    iNum = strlen(text)-1;

    for (int i = 0, int j = iNum; i <= iNum/2 + iNum%2 -1; ++i)    {

        j = iNum - i;

        temp = text[i];
        text[i] = text[j];
        text[j] = temp;
    }
    printf("%s", text);
}

 

생각의 차이에 따라 여러가지 프로그램이 나올 수 있다. 
가장 효율적인 방법을 찾고 추구해야하는 것이

 

     " 바로 프로그래머의 몫인 것이다. "