순환 문 이 란 특정 한 부분 을 반복 수행 하 도록 하 는 명령 으로써 for , while 문 이 있 다 . 1 . for 문 [ 형식 ] for ( 초기 식 ; 조건식 ; 반 복식 ) { 반복 할 부분 ;} 반복 할 부분 이 단문 이 라면 { } 생략 . 초기 식 은 for 문 이 처음 실행 될 때 단 한 번 실행 이 되 며 여러 개 의 식 을 , 로 구분 하 여 기술 할 수 가 있 다 . 조건식 은 루프 의 실행 중 매회 조사 를 하 며 , 단 한 개 의 문장 만 을 기술 할 수 있 으며 , 조건식 이 참 ( 1 ) 이 면 루프 를 반복 하 며 거짓 ( 0 ) 이 면 루프 를 빠져 나간다 . 반 복식 은 루프 의 다음 실행 을 준비 하 는 단계 로서 , 여러 개 의 식 을 , 로 구분 하 여 나열 할 수 가 있 다 . 위 에서 공부 한 제 어문 들 과 마찬가지 로 for ( ...) 다음 에 는 ; 를 붙이 지 않 는다 . for 문 의 블럭 에서 강제 로 빠져 나갈 때 는 switch 문 에서 와 같이 break 명령어 로 빠져 나간다 . ( goto 는 되 도록 쓰 지 말자 ) < 예제 6 > 1 부터 100 까지 의 합 을 구하 여 1 + 2 + 3 + . .. + 100 = 5050 를 출력 하 는 프로그램 작성 < 리스트 6 > 1 : # include 2 : main ( ) 3 : { 4 : int i , sum = 0 ; 5 : for ( i = 1 ; i <= 100 ; i ++) sum += i ; 6 : printf ( " 1 + 2 + 3 +...+ 100 = % 5 d \ n ", sum ) ; 7 : } for ( i = 1 ; i <= 100 ; i ++) sum += i ; # @ & * 1 ) # : 변수 i 에 초기 값 으로 1 을 대입 한다 . 2 ) @ : i 가 100 과 같 거나 작 으면 ( 현재 작 다 ) * 식 을 수행 한다 . 3 ) & : i 를 1 증가 시킨다 ( i ++ 는 i = i + 1 과 같 다 ) => 2 가 된다 . 4 ) @ => * => & 를 i 가 101 이 될 때 까지 반복 한다 . 5 ) @ : i 가 101 이 므로 조건식 은 거짓 이 되 어 * 를 실행 하 지 않 고 루프 를 빠져 나와 다음 문장 을 실행 하 게 된다 . 참고 로 무한 루프 의 형식 은 다음 과 같 다 . for ( ;;) printf ( " Loop \ n "); => Loop 를 영원히 찍 는다 . for ( ;;); => 영원히 아무것 도 안 한다 . 2 . while 문 ( do ~ while 문 ) [ 형식 1 ] while ( 조건식 ) { 반복 할 부분 ;}[ 형식 2 ] do { 반복 할 부분 ;} while ( 조건식 ) [ 형식 1 ] 은 조건식 의 결과 가 참 ( 1 ) 이 면 반복 할 부분 을 수행 하 고 , 거짓 이 면 블럭 을 빠져 나간다 . 그러므로 루프 안 에 조건식 의 결과 를 변화 시키 는 문장 이 있 어야 하 며 , 조건식 의 변수 를 변화 시켜 주 지 않 은 경우 엔 무한 루프 를 돌 게 된다 . while 문 의 블럭 에서 빠져 나갈 경우 에 도 break 문 을 사용 한다 . [ 형식 2 ] 의 경우 에 는 루프 를 먼저 실행 한 다음 에 while 다음 의 조건식 을 검사 하 는 차이 가 있 다 . [ 형식 1 ] 의 경우 에 조건식 이 바로 거짓 이 되 어 루프 를 실행 하 지 않 을 경우 가 있 으나 [ 형식 2 ] 에서 는 루프 를 반드시 한 번 은 실행 한다 . ( 이러 한 것 을 ' 판단 후 처리 형 의 구조 ' 와 ' 처리 후 판단 형 의 구조 ' 로 나누 어 부르 기 도 한다 ) < 예제 7 > < 예제 6 > 의 프로그램 을 while 문 을 이용 하 여 구하 라 . < 리스트 7 > # include main ( ) { int i = 0 , sum = 0 ; while ( i < 100 ) { i ++ ; sum += i ; } printf ( " 1 + 2 + 3 +...+ 100 = % 5 d \ n ", sum ) ;}< 리스트 6 > 의 for 안 에 는 i <= 100 이지만 여기 서 는 i < 100 이 다 . 왜 그런지는 곰곰히 생각 해 보 면 알 게 될 것 이 다 . 그리고 , < 리스트 4 > 와 < 리스트 5 > 에서 goto 문 을 남발 하 였 는데 이제 순환 문 을 배울 만큼 배웠으니 , goto 을 쓰 지 말 고 for 나 while 문 을 사용 하 여 반드시 작성 해 보 길 바란다 . 자신 이 직접 프로그램 을 짜 보 고 오류 를 찾아보 는 것 이 가장 좋 은 방법 이 다 . 3 . 중첩 된 루프 ( nested loop ) 와 루프 예제 들 중첩 된 루프 란 다른 루프 내 에 포함 된 루프 를 말 한다 . < 예제 8 > 구구단 을 출력 시키 는 프로그램 을 작성 하 라 . # include # include main ( ) { int i , j ; for ( i = 2 ; i <= 9 ; i ++) { printf ( " === % d 단 ===\ n ", i ) ; for ( j = 1 ; j <= 9 ; j ++) printf ( "% 3 d * % 3 d = % 3 d \ n ", i , j , ( i * j ) ) ; puts ( " 아무 키나 누르 시 오 . ."); getch ( ) ; }}< 예제 9 > 입력 된 어떤 수 까지 그 이내 에 들 어 있 는 모든 소수 를 찾 는 프로그램 을 작성 하 라 . 소수 란 1 과 자신 으로 만 나누 어 지 는 수 를 말 한다 . 1 : /* 소수 추출 프로그램 ( C Primer Plus 에서 발췌 ) */ 2 : # include 3 : 4 : main ( ) 5 : { 6 : int number , divisor , limit ; 7 : int count = 0 ; 8 : 9 : printf ( " 상한 값 을 입력 하 라 . ( 2 보다 커야 함 ) : "); 10 : scanf ( "% d ",& limit ) ; 11 : 12 : while ( limit < 2 ) { / * 입력 오류 검사 */ 13 : printf ( " 다시 입력 하 라 : "); 14 : scanf ( "% d ",& limit ) ; 15 : } 16 : printf ( " 1 에서 % d 까지 의 소수 들 은 . .\ n ", limit ) ; 17 : 18 : for ( number = 2 ; number <= limit ; number ++) { 19 : for ( divisor = 2 ; number % divisor ! = 0 ; divisor ++) 20 : ; 21 : if ( divisor == number ) { 22 : printf ( "% 5 d ", number ) ; 23 : count ++; 24 : if ( count % 10 == 0 ) / * 한 줄 에 10 개 의 소수 출력 */ 25 : printf ( "\ n "); 26 : } 27 : } 28 : getch ( ) ; 29 : } 위 프로그램 은 프로그램 다운 골격 을 어느 정도 갖추 었 다 . 6 , 7 행 에서 보 듯이 변수 명 에 의미 를 부여 하 면 , 프로그램 의 판독 도 쉽 고 보 기 도 좋 아 진다 . 또한 , 12 - 15 행 에서 처럼 입력 오류 를 검사 하 는 루틴 도 가지 고 있 다 . 프로그램 중간 중간 에 주석 문 을 넣 어 줌 으로서 판독 이 쉽 게 하 였 다 . 이렇 한 주 석문 들 은 프로그램 의 오류 ( 버그 ) 를 수정 하 기 쉽 게 한다 ( 이러 한 것 을 디버깅 이 라고 한다 ) . 18 행 에서 27 행 까지 의 루프 는 2 에서부터 limit 까지 의 숫자 를 차례 로 검사 하 는 루프 이 다 . 19 , 20 행은 number 와 중간 에 나누 어 떨어지 는 수 가 하나 라도 있 으면 21 행 으로 가 라는 의미 이 다 . 중간 에 나누 어 떨어지 는 수 가 없 으면 결국 number 는 자신 으로 나누 어 떨어져 ( number 와 divisor 이 같아져 결국 은 소수 이 다 ) , 21 행의 조건 을 만족 시키 므로 화면 에 출력 되 는 것 이 다 . count 는 한 줄 에 소수 를 10 개 씩 찍 기 위하 여 만들 어 놓 은 변수 이 다 . 20 행의 ; 는 반드시 있 어야 한다 . 만일 없 으면 if 블럭 이 for 루프 안 에 속하 게 되 어 예기 치 않 은 결과 가 발생 하 게 된다 . 조건식 ( number % divisor ! = 0 ) 이 참 이 면 계속 19 , 20 행 을 돌 게 된다 .