일정 조건을 만족하는 동안 같은 실행문을 반복하는 것이 반복문이다. 따라서 반복문에는 항상 반복의 조건을 정의하는 조건식과 조건을 만족했을 때 실행하는 문장이 있으며, 조건식의 위치에 따라 크게 3가지의 반복문으로 구분할 수 있다.
- while문은 조건식을 먼저 물어보고 만족하는 동안 실행문을 실행한다.
- for문은 초깃값 최초설정, 조건식을 보고, 실행문을 실행한 다음, 증감식을 실행하고, 다시 조건을 확인한다.
- do ~ 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문 처럼 실행문이 한 문장이면 중괄호를 생략하여 쓸 수 있다. 들여쓰기가 되어 있다고 반복문의 일부가 되는 것은 아니다.
while 문과 비슷하게 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문을 while문으로 바꿔쓸 수도 있지만 초기식, 조건식, 증감식을 한 곳에 모아 놓으면 반복 횟수를 쉽게 알 수 있다. 따라서 반복 횟수가 정해진 경우라면 for문을 사용하는 것이 좋다.
while문, for문은 조건식을 먼저 확인하는 반면, 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;
}
조건식과 상관없이 반복할 문장을 최소 한 번은 실행한다.
반복 안에 다시 반복이 이루어진 것을 중첩 반복문 또는 다중 반복문 이라고 한다.
중첩 반복문은 반복문 안에 실행할 문장으로 반복문이 포함된 것입니다.
#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은 반복문 안에서 반복을 즉시 끝낼 때 사용한다. 모든 반복문은 조건식이 거짓일 때 반복이 끝난다. while문이나 for문은 반복문은 반복문 위에서 반복이 끝나고 do while은 반복문 밑에서 반복이 끝난다. 그런데 예외적으로 반복문 중간에서 임의로 반복을 끝내고 싶을 때는 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를 사용해 모든 반복문을 한 번에 벗어날 수 없다. 또한 반복문 이외의 블록에서 사용하면 그 블록을 포함한 반복문을 벗어난다.
while (조건)
{
for (조건)
{
if (조건) break; // for문만 벗어난다
}
}
=============================================
while (조건)
{
if (조건)
{
break; // 반복문 전체 while 문을 벗어난다.
}
}
반복문의 조건식이 항상 참이면 무한 반복문이 된다.
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를 사용하면 다음 실행 위치가 반복문의 블록 끝이 된다. 블록을 탈출 하는 것은 아니다. 따라서 조건에 따라 반복문의 일부를 제외하고 반복할 수 있다.
#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;
}
' * ' 로 이루어진 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부터 입력한 수까지의 모든 소수를 출력합니다. 단, 한 줄에 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칸 띄우고 오른쪽 정렬로 출력된다는 것. 이것들을 잘 몰라서 이번 문제가 좀 힘들었다고 생각한다. 힘내자