컴퓨터 공부/© C

[C언어] 4. 반복문

letzgorats 2021. 1. 27. 15:29

4. 반복문

 

<for문>

 

- for문 내부의 조건에 부합하면 계속해서 특정한 구문을 실행

- 반복문을 탈출하고자 하는 위치에 break구문 넣어준다.

 

for(초기화; 조건; 반복 끝 명령어){

            반복적으로 실행할 부분

}

 

- for문은 1)특정한 초기화 구문을 거칠 수도 있고 이 초기화 구문이 없을 수도 있다.

- 다음으로, 2)조건을 만족한다면 실행할 부분을 실행하고 다시 돌아오게 되는데,

3)반복 끝 명령어를 수행하면서 들어왔을 때 조건이 다시 만족한다면 실행할 구문이 또 실행되는 것이다.

   이게 계속 반복되는 원리

 

(예제1) 1부터 100까지의 정수 출력하기

 

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main(void) {

        for (int i = 0; i <= 100; i++) {
                printf("%d\n", i);
        }

        system("pause");
}

(해설) int i=0 으로 초기값을 정해주고(초기화를 시켜주고) i<=100까지 i1씩 더해가면서(i++) 반복문을 수행해라라는 말이다. 그러면 1부터 100까지의 값이 출력 된다.

for문도 {중괄호}로 열어주고 닫아주는 거, (괄호)안에 (초기값,조건,반복끝명령어)로 넣어주는거 잊지마라.

옛날 c언어에서는 int i;라고 for문이전에 선언을 해줘야 작성이 가능했는데, 지금은 그냥 (괄호)안에다 바로 int i에 값을 넣어줘도 된다.

 

(예제2) 1부터 n까지의 합 출력하기

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

        int n, sum = 0;

        printf("n을 입력하세요.");

        scanf("%d", &n);

                for (int i = 1; i <= n; i++) {
                        sum = sum + i;
                }

                printf("%d\n", sum);

                system("pause");
}

(해설) 여기서도 변수를 먼저 선언해주든, 사용자에게 값을 요구하는 printf문을 먼저 쓰든 상관없다. Int i =1 로시작해 i++(1씩 증가시켜가며) i<=n 까지의 합은 sum=0이라는 변수를 먼저 선언해주고 sum=sum+i로 표현 할 수 있다.

이러한 문제는 사실 등차수열의 합으로도 구할 수가 있는데 (n(1+n)/2) for문을 사용하면 수학적인 지식이 없어도 직관적으로 코드를 짤 수 있다.

 

 

<무한루프(infinite loop)>

 

- 무한루프란 종료조건 없이 한없이 반복되는 반복문을 말한다.

- 일부러 무한루프를 발생시키는 경우도 있지만 일반적인 경우 개발자의 실수로 발생한다.

 

for (초기화; 조건; 반복 끝 명령어){

                조건이 항상 참(True)인 경우에 무한루프 발생

}

 

(예제3) 무한루프

 

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main(void) {

        for (;;) {
                printf("Hello World\n");
        }

        system("pause");

        return 0;
}

(해설) printfprint로 써서 한참동안 어디가 에러났는지 고생했다. print 에러 떳었어서 어디가 문제야 대체 했는데!! print라고 쓴걸 아주 뒤늦게 보고야 말았다. ..암튼 이렇게 코드를 짜면 Hello World가 무한적으로 출력되는데, 강제종료를 시켜야한다. 컴퓨터는 for(;;)에 이렇게 초기화값이든 조건이든,반복 끝 명령어 든 안 써주고 그냥 넘겨버리면, True로 인식하여 무한루프를 돌려버린다.

 

(예제4) 무한루프-개발자 실수

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

 

int main(void) {

        for (int i = 0; i <= 100;i--) {

                printf("Hello World\n");

        }

        system("pause");

        return 0;

}

(해설) 이런식으로 Hello World100번 출력하는 for문을 작성한다고 하면 i++이 아니라 I--로 잘못 작성하게 되면 i값은 계속해서 음수값을 가지므로 영원히 조건을 만족시킴으로써 무한루프에 빠지게 된다. 반복 끝 명령어를 잘 확인 하자!

 

(예제5) 무한루프 ▷ -1이 입력될 때 까지 더하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

        int sum = 0;

        printf("숫자를 입력하세요");

        for (; 1;) {
                int x;
                scanf("%d", &x);
                if (x == -1) break;
                sum += x;
        }

        printf("%d\n",sum);

        system("pause");
        return 0;
}

(해설) sum=0 이라는 변수를 초기화 해주고 for(;1;)은 사실 for(;;)과 같은 구문이다. 1 True이기 때문에 이는 계속해서 도는 무한루프 구문이다. for(;;)로 써줘도 무방하다.

x라는 값을 사용자에게 받되 그게 -1이면 for문이 멈추고 sum값을 출력한다.이 때 sum값은 -1을 사용자가 치기 전 까지 계속해서 쳤던 수들의 합이다.(sum=sum+x sum+=x 로도 표현한다.).

또한 if문에서는 (x==-1)이라는 조건일 때 break이므로 if(x==-1){break;}로 해줘도 되지만 그냥 쭈욱 써주고 ;(세미콜론)으로 닫아줘도 된다.

 

 

<while문>

 

- while문의 조건에 부합하면 계속해서 특정한 구문을 실행한다(True면 계속 실행)

- 반복문을 탈출하고자 하는 위치에 break 구문을 삽입한다.

 

while (조건){

            반복적으로 실행할 구문

}

 

(예제6) 특정 문자 n번 출력하기

 

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main(void) {

        int n;
        char a;

        scanf(%d %c, &n,&a);

        while (n--) {
                printf("%c", a);
        }

        system("pause");
        return 0;
}

(해설) 아 지금 말하는건데 define 저거는 scanf()를 코드에 써줄 때 visualstudio에서는 써줘야한다. scanf를 안 써줘도 되는 코드면 저것도 안불러와도 된다

특정 숫자(=n)를 사용자에게 입력받고, 특정 문자(=a)를 입력 받아 그 특정문자가 특정숫자 횟수만큼 출력되게 하는 프로그램이다. while문을 보면 n을 계속해서 1씩 감소시키면서 반복문을 수행하고 있다.(n--). n이 마침내 0이 되버리면 false 이므로 while문이 수행되지않게 되는 것이다.

사실 while(n--)는 굉장히 많이 쓰이는 구문 중 하나이기 때문에 알아두면 좋다.

n번만큼 즉,n을 감소시키면서 반복을 시키는 이러한 구문을 기억해두자!

 

(예제7) 특정 숫자의 구구단 출력하기

 

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main(void) {

        int n;

        scanf("%d",&n);

        int i = 1;
        while (i <= 9) {
                printf("%d * %d = %d\n",n,i,n*i);
                i++;
        }
        
        system("pause");
        return 0;
}

(해설) 사용자에게 n을 입력받아 그 n에 대한 구구단을 출력하는 프로그램이다. While문이 i=1부터 i=9까지 진행되는데, i++를 보면 알 수 있다. i1씩 증가시키면서 i가 마침내 9까지 왔을 때 까지 while반복문을 수행한다.

 

<중첩된 반복문>

- 반복문 내부에 다른 반복문이 존재하는 형태의 반복문

- 반복문이 중첩되면 될수록 연산횟수는 제곱형태로 늘어난다.

 

(예제8)구구단 출력하기 while문

#include <stdio.h>

int main(void){

        int i = 1;
        while (i <= 9) {
                int j = 1;
                while (j <= 9) {
                        printf("%d * %d = % d\n", i, j, i * j);
                        j++;
                }
                
                printf("\n");
                i++;
        }

        system("pause");
        return 0;
}

(해설) i=1부터 출발해서 바깥의 while문을 수행하는 것이고(끝에 i++보이쥬?), i가 한번 반복 될 때 마다 j9번씩 반복 된다고 보면 된다. printf(\n)문은 각각의 단이 끝날 때마다 줄바꿈을 해주는 기능을 한다.

 

(예제 9)구구단 출력하기 for문

#include <stdio.h>

int main(void){

        int i = 1;
        while (i <= 9) {
        
                for (int j = 1; j <= 9; j++) {
                        printf("%d * %d = %d\n", i, j, i * j);
                }
                
                printf("\n");
                i++;

        }

        system("pause");
        return 0;
}

(해설) 사실 아까 while중첩문에서 안쪽의 while문만 for문으로 바꿔주면 그만이다. 안쪽 while문을 for문으로 바꿔줬다면 바깥쪽 while문도 for문으로 바꿔주면 그만아닌가? 해보면,

#include <stdio.h>

int main(void){

        for(int i=1;i<=9;i++){

                for (int j = 1; j <= 9; j++) {
                        printf("%d * %d = %d\n", i, j, i * j);
                }

                printf("\n");

        }

        system("pause");
        return 0;
}

이렇게 된다. 간단하다! 이렇듯 for문과 while문은 자유자재로 바꿀 수가 있다!

 

 

<for문과 while문의 관계>

 

- 모든 for문은 while문으로 변경할 수 있으며 모든 while문도 모든 for문으로 변경 할 수 있다.

- C언어 소스코드가 최적화 되면서(컴파일 처리 되면서) 어셈블리어 단(기계어)에서는 동일한 명령어로 동작하기 때문이다. 사실 for문과 while문은 내부적으로는 동일하게 동작한다고 볼 수 있다.

 

(정리)

1) 반복문의 종류로는 for문과 while문이 있으며 상호치환이 가능하다

2) 의도하지 않은 무한 반복이 발생하지 않도록 유의해야 한다.

3) 행렬, 그래프 등의 연산에 있어서 이중 반복문이 매우 많이 활용 된다!

반응형

'컴퓨터 공부 > © C' 카테고리의 다른 글

[C언어] 6. 배열  (0) 2021.01.28
[C언어] 5. 함수  (0) 2021.01.27
[C언어] 3. 조건문  (0) 2021.01.27
[C언어] 2. 연산자  (0) 2021.01.27
[C언어] 1. 기본 입출력  (0) 2021.01.27