C언어 3일차-3

정혜창·2024년 12월 15일

독학

목록 보기
9/28
post-thumbnail

반복문

while문, for문, do ~ while문

일정 조건을 만족하는 동안 같은 실행문을 반복하는 것이 반복문이다. 따라서 반복문에는 항상 반복의 조건을 정의하는 조건식과 조건을 만족했을 때 실행하는 문장이 있으며, 조건식의 위치에 따라 크게 3가지의 반복문으로 구분할 수 있다.

  • while문은 조건식을 먼저 물어보고 만족하는 동안 실행문을 실행한다.
  • for문은 초깃값 최초설정, 조건식을 보고, 실행문을 실행한 다음, 증감식을 실행하고, 다시 조건을 확인한다.
  • do ~ while문은 실행문을 먼저 실행하고, 조건을 확인한 후 다시 실행문을 실행하러 간다.

while문

while문은 조건식을 먼저 검사하고 조건식이 참인 동안 실행문을 반복한다.

  • while문을 사용한 반복문
#include <stdio.h>

int main(void)
{
	int a = 1;				// 변수를 선언하고 곱셈을 하기 위해 1로 초기화
    
    while (a < 10) {		// a가 10보다 작으므로 조건식은 참
    
    	a *= 2;				// a에 2를 곱해 a에 다시 저장
        
    }
    printf("a : %d\n", a);	// a 값 출력 (a : 16)
   
    return 0;
}

계속해서 2가 곱해지고 결과가 16이 되었을 때, 마침내 조건식이 거짓이 되면서 while 문을 끝내고 이후의 문장을 실행한다.

중괄호의 사용법과 들여쓰기

모든 반복문은 실행문을 중괄호로 묶어 반복할 부분을 표시한다. 하지만 if문 처럼 실행문이 한 문장이면 중괄호를 생략하여 쓸 수 있다. 들여쓰기가 되어 있다고 반복문의 일부가 되는 것은 아니다.

for문

while 문과 비슷하게 for문도 반복문이다. 다만, for문은 샐행문을 원하는 횟수만큼 반복할 때 사용한다.

  • for문을 사용한 반복문
#include <stdio.h>

int main(void)
{
	int a = 1;					// 변수를 선언하고 1로 초기화
    int i;						// 반복 횟수를 세기 위한 변수
    
    for (i = 0; i < 3; i++) {
    
    	a *= 2;
        
    }
   	printf("a : %d\n", a);
    
    return 0;
}

a = 8 이 출력된다.

for문 사용 시 주의점

  • 초기식, 조건식, 증감식은 반복 횟수를 알기 쉽게 작성한다.
  • 반복 횟수를 세는 변수를 반복문 안에서 바꾸지 않는 것이 좋다.

for문을 while문으로 바꿔쓸 수도 있지만 초기식, 조건식, 증감식을 한 곳에 모아 놓으면 반복 횟수를 쉽게 알 수 있다. 따라서 반복 횟수가 정해진 경우라면 for문을 사용하는 것이 좋다.

do ~ while문

while문, for문은 조건식을 먼저 확인하는 반면, do ~ while문은 일단 반복할 문장을 수행한 후에 조건을 검사한다.

  • do ~ while문을 사용한 반복문
#include <stdio.h>

int main(void)
{
	int a = 1;
    
    do {
    
    	a *= 2;
        
    } while (a < 10);		// do while 문의 끝에 ; 을 빠뜨리지 않게 조심!
    
    printf("a : %d\n", a);
    
    return 0;
}

do ~ while문의 특징

조건식과 상관없이 반복할 문장을 최소 한 번은 실행한다.

반복문의 활용

반복 안에 다시 반복이 이루어진 것을 중첩 반복문 또는 다중 반복문 이라고 한다.

중첩 반복문

중첩 반복문은 반복문 안에 실행할 문장으로 반복문이 포함된 것입니다.

  • 중첩 반복문을 사용한 별 출력
#include <stdio.h>

int main(void)
{
	int i, j;					// 반복 횟수를 세기 위한 제어 변수
    
    for(i = 0; i < 3; i++)		// i가 0부터 2까지 증가하면서 3번 반복
    {
    	for(j = 0; j < 5; j++)	// j가 0부터 4까지 증가하면서 5번 반복
        {
        	printf("*");		// 별 출력
        }
    	printf("\n");			// 다섯번 출력후 줄 바꿈
    }
    
    return 0;
}

i 값이 바뀔 때마다 안쪽 for문의 초기식에 의해 j값이 다시 0부터 시작됨을 기억하자.

중첩 반복문 사용 시 주의점

각 반복문이 서로 독립적인 제어 변수를 사용해야 각각 원하는 횟수를 반복할 수 있다.

중첩 반복문으로 구구단을 출력하는 프로그램

#include <stdio.h>

int main(void)
{
	int i, j;
    int res;
    
    for (i = 2; i <= 9; i++)
    {
    	for (j = 1; j <= 9; j++)
        {
        	res = i * j;
        	printf("%d * %d = %d\n", i, j, res);
        }
    }
    
    return 0;
}

break와 continue 분기문

break과 continue는 반목문 안에서 사용하는 제어문이다.
break은 반복문 안에서 반복을 즉시 끝낼 때 사용한다. 모든 반복문은 조건식이 거짓일 때 반복이 끝난다. while문이나 for문은 반복문은 반복문 위에서 반복이 끝나고 do while은 반복문 밑에서 반복이 끝난다. 그런데 예외적으로 반복문 중간에서 임의로 반복을 끝내고 싶을 때는 break르 사용한다.

  • break를 사용한 반복문 종료(예제)

#include <stdio.h>

int main(void)
{
	int i;
    int sum = 0;
    
    for (i = 1; i <= 10; i++)
    {
    	sum += i;
        if (sum > 30) break;
    }
    
    printf("누적한 값 : %d\n", sum);			// 누적한 값 : 36
    printf("마지막으로 더한 값 : %d\n", i);	// 마지막으로 더한 값 : 8
    
    return 0;
}

break 사용 시 주의점

break은 자신을 포함하는 반복문 하나만 벗어난다는 것이다. 반복문이 중첩된 경우 가장 안쪽에서 break를 사용해 모든 반복문을 한 번에 벗어날 수 없다. 또한 반복문 이외의 블록에서 사용하면 그 블록을 포함한 반복문을 벗어난다.

while (조건)									
{
	for (조건)
    {
		if (조건) break; // for문만 벗어난다
    }
}

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

while (조건)
{
	if (조건)
    {
    	break;			// 반복문 전체 while 문을 벗어난다.
    }
}

break로 무한 반복문 빠져나오기

반복문의 조건식이 항상 참이면 무한 반복문이 된다.
while(1), for( ; ; )

  • 무한 반복문 빠져나오기(예제)
#include <stdio.h>

int main(void)
{
	int count = 0;
    
    while(1)
    {
    	printf("be happy\n");
        count++;
        if(count == 5) break;
    }
    
    return 0;
}

여기서 잠깐

if문과 달리 switch ~ case문의 블록안에서 break를 사용하면 switch ~ case 블록만 벗어난다.

continue

continue는 반복문의 일부를 건너뛴다. 반복문 안에서 continue를 사용하면 다음 실행 위치가 반복문의 블록 끝이 된다. 블록을 탈출 하는 것은 아니다. 따라서 조건에 따라 반복문의 일부를 제외하고 반복할 수 있다.

  • 3의 배수를 빼고 1부터 100까지의 합을 구하자(예제)
#include <stdio.h>

int main(void)
{
	int i;
    int sum = 0;
    
    for (i = 1; i <= 100; i++)
    {
    	if((i % 3) == 0) continue;
        sum += i;
    }
    
    printf("3의 배수를 뺀 1부터 100까지의 합은 : %d\n", sum);
    
    return 0;
}

문제. 1

' * ' 로 이루어진 X 모양을 출력하는 프로그램을 작성하시오

#include <stdio.h>

int main(void)
{
	int i, j;
    
    for (i = 0; i < 5; i++)
    {
    	for (j = 0; j < 5; j++)
        {
        	if(i == j)
            {
            	printf("*");
            } else if (i + j == 4) {
            	printf("*");
            } else {
            	printf(" ");
            }
        }
        printf("\n");
    }
    
    return 0;
}

문제. 2

소수 출력 프로그램

2 이상의 정수를 입력해 2부터 입력한 수까지의 모든 소수를 출력합니다. 단, 한 줄에 5개씩 5칸 간격으로 출력합니다. 하나의 정수가 소수인지를 판단해서 출력하는 과정은 다음과 같습니다.
1. 일단 소수라고 가정한다.
2. 2부터 그 정수보다 하나 작은 수까지 하나라도 나누어 떨어지면 가정을 취소한다.
3. 1의 가정이 2에서 바뀌지 않았으면 그 정수를 출력한다.
위의 1~3 까지의 과정은 하나의 정수에 대해서 소수를 판별하는 과정이고 어떤 수까지의 모든 수를 판별하기 위해서는 1~3까지의 과정을 다시 반복한다.

#include <stdio.h>

int main(void)
{
    int i, j;
    int en;
    int count = 0; // 줄바꿈을 위한 변수

    printf("2 이상의 정수를 입력하세요 : ");
    scanf_s("%d", &en);

    int pn; // prime number (소수 판별을 위해 넣은 변수)

    for (i = 2; i <= en; i++)
    {
        pn = 1;  //	일단 소수라고 가정 (참의 값)
        for (j = 2; j < i; j++)
        {
            if ((i % j) == 0)
            {
                pn = 0; 	// 나누어지면 소수가 아니므로 pn = 0 (거짓)
                break;
            }
        }
        
        if (pn == 1)
        {
            printf("%5d", i);  //5칸 띄우고 오른쪽 정렬해서 출력
            count++;
            if ((count % 5) == 0) // 5개 출력후 줄바꿈
            {
                printf("\n");
            }
        }
    }

    return 0;
}

회고

문제 .2는 여태 했던 코딩 중에 가장 어려웠다.. 벌써 어려우면 어쩌자는 건지 다시 복습하며 익숙해지면서 와야겠다. 우선 이 문제에서 가장 신기하고 애먹었던건 pn 이라는 변수를 생성하는 것이였다. 앞으로 판별을 위한 변수를 넣는 것도 생각을 해봐야겠다. 또 5개 출력 후 줄바꿈의 기법, 그리고 %5d 하면 5칸 띄우고 오른쪽 정렬로 출력된다는 것. 이것들을 잘 몰라서 이번 문제가 좀 힘들었다고 생각한다. 힘내자

profile
Unreal 1기

0개의 댓글