프로그래밍 C언어

반복문(Loop)

게임첫걸음 2024. 8. 11. 23:13

반복문 for와 while에 대한 글입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <stdio.h>
 
void main()
{
    //반복문(Loop)
    //for문                                 //정해진 조건만큼 반복하는 함수
    int i = 0, j = 0;                       //예시로 사용한 i는 Index의 i를 사용함. 
    //for(초기화; 비교문; 증감문)           //초기값과 비교하고 증감하는 순서, 초기값이 설정되어 있다면 조건문에서 초기값을 빼고 ;만 넣어도 됨.
    for (i = 0, j = 2; i < 10; i += 3++j)
    {
        printf("%d ", i);   //조건문에서 j의 값에서 걸려서 한 번만 실행되어 출력값은 i의 초기값 0만 나옴.
 
        if (j > 3break;
    }
    printf("\n");
 
    for (i = 5; i > 0--i)
    {
        printf("%d ", i);
        printf("\n");
    }
 
    for (;;)                                //for (i = 0; i < 5; ++i) 초기값이 설정되어 있기 때문에 생략, 탈출문으로 비교문을 작성해서 생략, 
   {                                       //증감문을 {}중괄호 안에 넣을 수 있어 생략 가능
        printf("%d ", i);
 
        ++i;
        if (i >= 5break;                 //탈출문이라고 부름(Escape)
    }
    printf("\n");
 
    for (i = 2; i < 10++i)                //반복문 두 개 이상을 중첩하여 쓰는 것을 2중 반복문 그 이상은 삼중.... 반복문 3개 이상 짜여있으면 미친 코드임.
   {                                       //최대한 2중 반복문으로 끝내라
        for (j = 1; j < 10++j)
        {
            printf("%d %d = %d\n", i, j, i * j);
        }
        printf("\n");
    }
 
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    // while문
 
    i = 0;
    printf("while: ");
    while (i < 5)
    {
        printf("%d ", i++);
    }
    printf("\n");
 
    ///////////////////////////////////////////////////////////////////////////////////////////////////////
    // do~while문                            일단 해보고 조건이랑 부합안하면 빼라.라는 조건문 
    i = 3;
    do
    {
        printf("do~while: %d\n", i);
        ++i;
    } while (i > 5);
 
    int s, k;
    for (s = 1; s < 10; s++)
    {
        for (k = 1; k <= 10; k++
        {
            if (k <= s)
            {
                printf("*");
            }
        }
        printf("\n");
    }
}
cs

<for문>

반복문은 말 그대로 조건에 들어맞는다면 그 함수를 계속 반복 작업을 해야할 때 사용하는 명령문입니다. 그 중 for는 끝이 존재할 때 사용하는 반복문입니다.

void main()
{
    int i = 0, j = 0;                       //예시로 사용한 i는 Index의 i를 사용함. 
    //for(초기화; 비교문; 증감문)         
    for (i = 0, j = 2; i < 10; i += 3++j)

 

    {
        printf("%d ", i); 
        if (j > 3break;
    }
    printf("\n");
 

for문은 for(초기화; 비교문; 증감문)로 구성되는데 초기화값과 비교문의 조건과 비교하고 증감문에 대한 작용을 하는 순서로, 변수 선언 때 초기값을 설정했다면 조건문에서 초기값을 빼고 ;만 넣어도 허용합니다. (ex) for(; 비교문; 증감문) 위의 코드는  i에겐 0, j에겐 2의 변수 대입으로 초기화하고; i가 10이하라면 i 변수값에 +=3, j는 1씩 ++로 구성되어있습니다. 여기서 if문에 j값이 3을 초과 시 break, 명령을 끝내달라고합니다. 그에 따라 j의 2값에 대한 i의 값만 허용되므로 +=로 인해 0 3 6이 출력됩니다. 

for (i = 5; i > 0--i)
    {
        printf("%d ", i);
        printf("\n");
    }
위는 i를 5로 초기화하고 0초과 시 1씩 빼달라는 명령입니다. 즉, 출력값은 5 4 3 2 1이 됩니다.
for (;;)                                //for (i = 0; i < 5; ++i) 초기값이 설정되어 있기 때문에 생략, 탈출문으로 비교문을 작성해서 생략, 
  {                                     //증감문을 {}중괄호 안에 넣을 수 있어 생략 가능
        printf("%d ", i);
        ++i;
        if (i >= 5break;        //탈출문이라고 부름(Escape)
    }
    printf("\n");

 

맨위 이미 i = 5 초기화가 되어있으니 ;로, 비교문은 탈출문이 대신처리하여 ;로 대체하여 첫 for 문을 ( ; ;)로 표현할 수 있습
니다. 출력값은 위의 코드와 같습니다.

 

    for (i = 2; i < 10++i)                //반복문 두 개 이상을 중첩하여 쓰는 것을 2중 반복문 그 이상은 삼중....
  {                                        //최대한 2중 반복문으로 끝내라
        for (j = 1; j < 10++j)
        {
            printf("%d %d = %d\n", i, j, i * j);

 

        }
        printf("\n");
    }
반복문 두 개를 동시에 활용하는 코드를 2중 반복문이라고 표현하며 수가 늘어남에 따라 삼중, 사중으로 표현합니다.
그러나, 삼중 이상의 반복문은 해석하기 어렵기 때문에 반복문을 사용할 때 최대한 2중으로 설계하도록 노력합시다.

 

<별피라미드 쌓기>

반복문 중에서도 이중 반복문에 대한 예습을 할 때 가장 많이 사용되는 코드 짜기 실습입니다.

*

**

***

**** 를 목표 출력값으로 하고 만들어보겠습니다. 

#include <stdio.h>

int main()

{

    int i, j;                                               //i, j 변수 선언

    for (i = 0; i < 5; ++i)                          //i를 0으로 초기화, i가 5미만일 시 비교문, i의 값을 1씩 올리라는 증감문

    {

          for (j = 0; j < i; ++j)                     //j를 0으로 초기화, j가 i보다 미만일 시 비교문, j의 값을 1씩 올리라는 증감문

          {

                printf("*");                             //j의 대한 반복문이 정상 발동 시 * 을 출력

          }

          printf("\n");                                 //위의 두 반복문이 정상 발동 시 다음 줄로 이동 출력

     }

}

주석에 설명을 붙여놨습니다. 하나 더 난이도 올려 실습해보겠습니다.

   *

  ***

 *****

******* 를 목표 출력값으로 설정하겠습니다. 이번 예제는 3중반복문을 사용해야하며 규칙성에 대해 다뤄야 도움이 됩니다. 풀어 해석 후, 코드 짜겠습니다. 

()()()*

()()* *

()* * * 

* * * * 첫 예제의 형태입니다. 여기서 출력되는 *을 늘려줘야하는데 이건 반복문 하나를 더 써서 따로 다뤄야합니다. 즉, 삼중 반복문인 것이죠.

 

#include <stdio.h>

int main()

{

    int i, j;                                               //i, j 변수 선언

    for (i = 0; i < 5; ++i)                          //i를 0으로 초기화, i가 5미만일 시 비교문, i의 값을 1씩 올리라는 증감문

    {

          for (j = 0; j < 4 - i; ++j)                //j를 0으로 초기화, j가 4 - i 보다 미만일 시 비교문, j의 값을 1씩 증가

          {

                printf(" ");                              //해당 j 반복문 발동 시 " " 빈 칸 한 칸씩 출력

          }

          for (j = 0; j < 2*i-1; ++j)               //추가되는 * 에 대한 for문, 2*i - 1보다 미만일 시 비교문, j의 값을 1씩 증가

          {

                 printf("*");                            //해당 j 반복문 발동 시 * 을 출력

          }    

          printf("\n");                                  //위의 두 반복문이 정상 발동 시 다음 줄로 이동 출력

     }

}

주석 설명에서 추가하여 첫 줄은 ()빈칸 3번, 마지막줄은 ()빈칸 0번 출력하여야합니다. 때문에 빈 칸과 관련된 코드의 비교문을 j<4-i로 설정합니다. 이러면 ( ) 빈 칸은 첫 줄 4-1로 3번, 마지막 줄 4-4로 0번 출력됩니다. 그리고 *은 1, 3, 5, 7의 규칙성을 가지고 있습니다. 때문에 2i-1로 설정하면 첫 줄 2-1로 1번, 마지막 줄 8-1로 7번 출력됩니다. 

 

<while문>

= 0;
while (i < 5)
{
     printf("%d ", i++);
}
printf("\n");
 

 while문과 for문의 차이는 어떤 것에 중점을 뒀느냐입니다. for문은 반복횟수가 정해진 경우, while문은 무한루프나 특정 조건에 만족할 때까지 반복해야하는 경우입니다.

 

<do while문>

= 3;
do
{
    printf("do~while: %d\n", i);
    ++i;
} while (i > 5);

 

do while문은 while문과 조건에 따라 반복을 계속할지를 결정할 때 사용하는 것은 동일하지만, 무조건 중괄호 { }는 한 번 실행하고 조건을 검사하여 반복 결정합니다.

 

<break>

위의 설명된 반복문들은 잘못했다간 무한 반복 실행될 수 있습니다. 그래서 특정 조건에는 break문을 사용하여 함수를 종료시켜야합니다.

 

'프로그래밍 C언어' 카테고리의 다른 글

포인터 (pointer)  (0) 2024.08.13
배열 (Array)  (0) 2024.08.12
분기문(Branch)과 조건문(Condition)  (0) 2024.08.09
연산자(Operators)와 형변환(Type Casting)  (0) 2024.08.09
변수(Variable)와 상수(Constant)  (0) 2024.08.08