반복문(Repetitive Statement)이란 지정한 작업을 반복해서 수행하는 문법이다.
반복 작업을 하기 위해 필요한 세가지 요소가 포함되어 있다.
반복을 시작하기 위한 '시작조건'
반복을 계속 진행할 것인지를 판단하는 '종결조건'
반복의 조건을 바꾸기 위해 '조건 변화 수식'이 있어야 반복 작업을 제대로 수행할 수 있다.
for 반복문은 반복의 3요소를 제일 단순하고 정확하게 표현한 반복문이다.
#include <stdio.h>
void main()
{
int sum = 0, num;
for(num = 1 ; num <= 5 ; num++){
printf("num(%d) + sum(%d) = ", num, sum);
sum = sum + num;
printf("%d\n", sum);
}
printf("\nResult : num = %d sum = %d\n", num, sum);
}
무한 반복문(Infinite loop)은 말 그대로 무한히 반복하는 형태의 반복문을 의미합니다.
'무한히 반복한다'는 뜻은 종결 조건이 없거나 항상 참(1)인 경우를 의미합니다.
for 반복문에 for( ; ; )와 같이 반복의 3요소를 모두 안 적는 경우도 있는데 이렇게 사용하면 무한루프가 됩니다.
#include <stdio.h>
void main(){
int sum = 0;
int num = 1; /* 시작 조건 */
for( ; ; ){ /* 무한루프를 만드는 for 반복문 */
printf("num(%d) + sum(%d) = ", num, sum);
sum = sum + num;
printf("%d\n", sum);
num++; /* 조건 변화 수식 */
if(num > 5) break; /* 종결 조건 num > 5가 참이면 반복문 종료 */
}
printf("\nResult : num = %d sum = %d\n", num, sum);
}
보통 무한 루프는 시작과 종결을 수치로 결정할 수 없는 상황에 사용한다.
ex) 사용자가 키보드를 이용하여 특정 키를 누르면 반복을 종료하게 한다거나 파일이나 외부 장치에서 들어오는 값을 체크하여 반복을 중단할 때
#include <stdio.h>
void main(){
int i;
for(i = 1 ; i <= 9 ; i++){
printf(" 2 * %d = %d\n", i, 2*i);
}
}
for 반복문이 정규화된 형식을 가지고 있다면 while 반복문은 '종결 조건'만 형식으로 가지고 나머지는 프로그래머가 적절하게 사용할 수 있는 문법이다.
while(종결 조건){
명령문1;
명령문2;
}
while문은 명령문을 반복하는 문법이다.
#include <stdio.h>
void main(){
int sum = 0;
int num = 1; /* 시작 조건 */
while(num <= 5){ /* 종결 조건 */
printf("num(%d) + sum(%d) = ", num, sum);
sum = sum + num;
printf("%d\n", sum);
num++; /* 조건 변화 수식 */
}
printf("\nResult : num = %d sum = %d\n", num, sum);
}
while문으로 무한 루프 형식을 만들고 싶다면 괄호 안에 참을 의미하는 1을 적어서 사용한다.
break문을 이용하면 무한 루프를 벗어날 수 있다.
while(1){
/* 생략 */
}
do ~ while 반복문은 '종결 조건'을 명령문을 실행하기 전이 아니라 후에 체크한다.
do{
명령문;
명령문;
}while(종결 조건);
#include <stdio.h>
void main(){
int sum = 0;
int num = 1;
do{
printf("num(%d) + sum(%d) = ", num, sum);
sum = sum + num;
printf("%d\n", sum);
num++;
} while(num <= 5);
printf("\nResult : num = %d sum = %d\n", num, sum);
}
for 반복문을 사용한 중첩 반복문 예제
#include <stdio.h>
void main(){
int m,n;
for(m = 5 ; m < 7 ; m++){
for(n = 0 ; n < 3 ; n++){
printf("m(%d) - n(%d)\n", m, n);
}
}
}
#include <stdio.h>
void main(){
int step, i;
for(step = 2 ; step <= 9 ; step++){
for(i = 1 ; i <= 9 ; i++){
printf("%d * %d = %d\n, step, i, step * i);
}
}
}
break문은 자신이 포함된 반복문을 종료시키는 기능을 가지고 있음.
반복 작업을 하다가 예외 상황이 발생하여 반복문을 종료시켜야 한다면 break문을 사용함.
break문으로 반복문을 종료하는 효과는 하나의 반복문에만 미치기 때문에, 중첩된 반복문에서도 하나의 반복문에만 적용된다.
#include <stdio.h>
void main(){
int m, n;
for(m = 5 ; m < 7 ; m++){
for(n = 0 ; n < 3 ; n++){
if(m == 5 && n == 1) break;
printf("m(%d) - n(%d)\n", m, n);
}
}
}
#include <stdio.h>
void main(){
int m, n;
for(m = 5 ; m < 7 ; m++){
for(n = 0 ; n < 3 ; n++){
if(m == 5 && n == 1) break;
printf("m(%d) - n(%d)\n", m, n);
}
if(m == 5 && n == 1) break;
}
}
break문은 반복문을 종료시키지만 continue문은 1회성 취소를 사용한다.
반복문이 명령을 실행하다가 continue문을 만나면 이후 명령들을 실행하지 않고 '조건 변화 수식'으로 돌아간다. 그리고 나서 '종결 조건'을 체크한 뒤 다시 정상적으로 반복을 진행한다.