교육용프로그래밍언어 C 언어 제어문 ( 조건문, 반복문 ) 강사 : 김희진 1
Contents 프로그램의실행흐름을제어하는제어문을살펴본다. 조건문의종류, 특성, 기능에대해살펴본다.. if 문, switch 문 반복문의종류, 특성, 기능에대해살펴본다.. for 문, while 문, do~while 문 기타제어문에대해살펴본다. break 문, continue 문, goto 문
5.0 개요 실행흐름의제어가필요한경우 조건에따라실행할문장이달라질때 ( 예 ) 성적이 70 점이상이면 합격 을, 70 점미만이면 불합격 을출력하는문제 특정내용을반복실행하고자할때 ( 예 ) 학생 1,000 명에대해다섯과목의평균과순위를구하는문제 제어문의종류 조건문 : if 문 반복문 : for 문, while 문 기타제어문 : break 문, continue 문, goto 문 3
제어문의필요성 입력된정수의짝수 / 홀수여부출력하기 두가지경우를모두처리하려면 if문으로해결할수있다. 짝수라면! printf(" 정수를입력하시오 : "); scanf("%d", &num); printf(" 입력한수 %d 는 ( 은 ) ", num); printf(" 짝수입니다.\n"); return 0; 홀수라면! printf(" 정수를입력하시오 : "); scanf("%d", &num); printf(" 정수를입력하시오 : "); scanf("%d", &num); printf(" 입력한수 %d 는 ( 은 ) ", num); if (num % 2 == 0) printf(" 짝수입니다.\n"); else printf( 홀수입니다.\n"); return 0; printf(" 입력한수 %d 는 ( 은 ) ", num); printf(" 홀수입니다.\n"); return 0; 4
5.1.1 if 문 단순 if 문 주어진조건을만족할경우에만처리할내용이있을때사용 예 ) 성적이 90점이상일때만 우수 출력하기 점수가평균보다작을때만평균미만자의수를 1 증가시키기 자격증이있을때만가산점주기 5
단순 if 문 단순 if 문형식 if ( 조건식 ) 다음문장 ; 종속문장 1; if ( 조건식 ) { 종속문장 1; 종속문장 2; 종속문장 n; } 복합문 (compound statement) - {} 로묶은여러문장 - 초기엔한문장일때도 {} 를쓰는것을권장 다음문장 ; 6
단순 if 문 예 score 가 70 이상일때만통과자수 pass 를 1 증가시키기 if (score >= 70) pass++; score가 70 이상이면통과자수 pass를 1 증가시키고 sum에점수 score를누적하기 if (score >=70) { pass++; sum = sum + score; } 7
단순 if 문 예 점수 score 가 90 이상일때만점수출력전에 ' 우수!' 출력하기 scanf( %d, &score); if (score >= 90) printf(" 우수!\n"); printf( 점수 : %d \n", score); 정수 n 이홀수일때만홀수임을출력하기 수치를논리값으로취급하기 if (n % 2) // if (n%2!= 0), if (n%2 == 1) printf("%d 는홀수입니다.\n", n); x 값이 5 와 10 사이인지 if ((5 <= x) && (x <= 10)) printf("5 와 10 사이의수입니다.\n"); 8
단순 if 문 if~else 문 조건의참과거짓에따라둘중하나를선택해처리할때사용 if ( 조건식 ) 종속문장 1; else 종속문장 2; 다음문장 ; 예 ) 70 이상이면 ' 합격!', 아니면 ' 불합격!' 출력하기 if (score >= 70) printf(" 합격!\n"); else printf(" 불합격!\n"); 10
if~else 문 [ 프로그램 5-3] 입력받은정수의홀수 / 짝수여부출력 사용자가입력한값에따라이자리가 홀수입니다. 또는 짝수입니다. 둘중하나가되게 사용자가입력한값에따라이자리가 홀수입니다. 또는 짝수입니다. 둘중하나가되게 10 printf(" 입력한수 %d 는 ( 은 ) ", num); 11 12 if (num % 2 == 0) 13 printf(" 짝수입니다.\n"); 14 else 15 printf(" 홀수입니다.\n"); 16 17 return 0; 18 11
if~else 문 p. 163 주의 쓸데없이 ; 을붙이지않아야한다. if (age >= 20) ; adult++; else ; child++; 바로뒤에 ; 을붙이면컴파일러는조건식이참일때처리할내용이없는빈문장인 ; 으로해석함 else 없는 if 문이끝난것으로해석되어뒤의 else 가나타나에러가됨 else 뒤에조건식을단독으로사용불가 if (age >= 20) adult++; else (age < 20) child++; if (age < 20) 는가능하나여기서는굳이 if 가새로필요하지않음 12
5.1.1 중첩된 if 문 중첩된 if 문 if문안에또다른 if문을사용 여러선택사항중한가지를골라처리할때사용 [ 프로그램 5-3] 입력된정수 num에대해 양의짝수, 양의홀수, 음의짝수, 음의홀수중해당사항을출력하기 팁 ) 복잡한조건을양자택일이되는조건으로나누어 if를중첩하면코딩하기가편함 바깥 if문 양수 음수 짝수홀수짝수홀수 if 문 if 문 13
5-3 입력받은정수가짝수인지홀수인지출력하기 7 printf(" 정수를입력하시오 : "); 8 scanf("%d", &num); 9 10 printf(" 입력한수 %d는( 은 ) ", num); 11 12 if (num >= 0) // num이양수면 13 { 14 if (num % 2 == 0) 15 printf(" 양의짝수입니다.\n"); 16 else 17 printf(" 양의홀수입니다.\n"); 18 } 19 else // num이음수면 20 { 21 if (num % 2 == 0) 22 printf(" 음의짝수입니다.\n"); 23 else 24 printf(" 음의홀수입니다.\n"); 25 } 26 27 return 0; 14
5.1.1 중첩된 if 문 n 개조건에따라처리할내용이 n 가지있을때 15
5.1.1 중첩된 if 문 주의 if 와 else 의매칭 5 행의 else 는어느 if 와짝일까? 1 scanf("%d", &x); 2 if (x > 0) 3 if (x % 2 == 0) 4 printf(" 양의짝수입니다.\n"); 5 else 6 printf(" 음수입니다.\n"); else 와 if 짝을명확히하기위해 { } 를사용하기 1 scanf("%d", &x); 2 if (x > 0) 3 { 4 if (x % 2 == 0) 5 printf(" 양의짝수입니다.\n"); 6 } 7 else 8 printf(" 음수입니다.\n"); 16
프로그램 5-4 입력받은점수의학점출력하기 17
5.2.1 if~else 문을이용한간단한성적처리프로그램 문제 입력 국어, 음악, 미술점수 출력 평균 평균이 70점이상이면 통과, 70점미만이면 탈락 출력해결과정 1. 점수를 kor, music, art에입력받기 2. 세점수를합한후 3으로나누어 avg에평균을구하기 3. 학생의점수세개와평균을출력하기 4. if~else문을이용 avg가 70점이상인지아닌지에따라 통과 또는 탈락 출력하기 18
5-5 세과목의평균을구한후합격여부를출력하기 5 int kor, music, art; 6 double avg; 7 8 printf(" 국어음악미술점수는?"); 9 scanf("%d %d %d", &kor, &music, &art); 10 11 avg = (double)(kor + music + art)/3; 12 13 printf("===================================== \n"); 14 printf("\n \n국어 \t음악 \t미술 \t평균 \t결과\n"); 15 printf("------------------------------------- \n"); 16 printf("%3d \t%3d \t%3d \t%6.1lf ", kor, music, art, avg); 17 if (avg >= 70) 18 printf("\t통과 \n"); 19 else 20 printf("\t탈락 \n"); 21 printf("===================================== \n"); 19
5.2.2 중첩 if 문을이용한간단한산술계산기 문제 입력 : 수식 3 * 25 출력 : 입력된수식계산결과값 분석 int 형피연산자두개, char 형연산자한개입력 연산자종류 8가지 (+, -, *, /, %, &,, ^) 로한정 그외의연산자는잘못된입력으로간주하여안내문출력 8가지계산방법중하나를선택해야함 중첩된 if문사용 20
5-6 if~else 문을이용한산술계산기 6 int x, y, result; 7 char op; // 연산자저장할변수 8 9 printf(" 수식을입력하시오.\n"); 10 printf(" 연산자의종류 : + - * / %% & ^\n"); 11 printf(" 입력예 : 2 + 3\n\n입력 >> "); 12 scanf("%d %c %d", &x, &op, &y); 13 14 if (op == '+') 16 result = x + y; 17 else if (op == '-') 18 result = x - y; 19 : 29 else if (op == '^') 30 result = x ^ y; 31 else 32 { 33 printf(" 잘못된연산자입니다.\n"); 34 exit(0); // 프로그램실행종료 35 } 36 37 printf("\n결과 >> %d %c %d = %d\n", x, op, y, result); % 앞뒤로빈칸필요 [ 참고 ] 프로그램 5-8: [ 프로그램 5-6] 을 switch문으로수정한것 21
5.3 반복문 (for 문 ) 반복문 : 루프 (loop) 동일한내용을특정횟수만큼반복처리할때사용 데이터하나를처리하는코드가 10 행일때데이터 1,000 개를 1,000*10 행의코드로처리하는경우 프로그램길이도문제지만프로그램을수정하는것도문제 반복문사용시 일정코드를지정한횟수만큼자동으로반복실행가능 반복횟수에상관없이일정한길이의코드 프로그램길이단축 단순하고명확한코드 유지관리용이 22
5.3.1 반복문의필요성 다음처럼비슷한내용이반복될때반복횟수가매우커진다면? printf("c Language \n"); printf("c Language \n"); printf("c Language \n"); printf("c Language \n"); printf("c Language \n"); printf("1 번 \n"); printf("2 번 \n"); printf("3 번 \n"); printf("4 번 \n"); printf("5 번 \n"); sum = 1 + 2 + 3 + 4 + 5; printf("1~5 의합은 %d \n", sum); 23
5.3.2 for 문형식 for 문형식 for ( 초기식 ; 조건식 ; 증감식 ) 다음문장 ; 반복할문장 ; for ( 초기식 ; 조건식 ; 증감식 ) { 여러문장 ; } 다음문장 ; 24
5.3.2 for 문형식 for 문실행과정 for (i=1; i<=5; i++ ) printf( 1 번 \n ); 표 5-1 for 문실행과정 i 값 i<=5 반복할문장 ----------------------------------------------------------------- 1 참 printf("1 번 \n"); 2 참 printf("1 번 \n"); 3 참 printf("1 번 \n"); 4 참 printf("1 번 \n"); 5 참 printf("1 번 \n"); 6 거짓 for 문을끝냄 for (i=1; i<=5; i++) i 를 1 부터 5 까지 1 씩증가시키며반복 하기로해석하면헤더를작성하고이해하기편함 25
5.3.2 for 문형식 1 번 에서 5 번 까지차례대로출력하기 팁 ) 반복내용중고정이아니라변하는것은 for 문의제어변수를활용하자!!! 1 for (i=1; i<=5; i++) 2 printf("%d 번 \n", i); ); 제어변수를활용 26
5.3.2 for 문형식 1 에서 5 까지의합구하기 : 방법 1 1 sum = 0; 2 sum += 1; 3 sum += 2; 4 sum += 3; 5 sum += 4; 6 sum += 5; 7 8 printf(" 결과 : %d", sum); 1 sum = 0 ; 2 for (i=1; i<=5; i++) 3 sum += i; 4 5 printf(" 결과 : %d", sum); 반복동안변하는값은제어변수를활용 27
5.3.2 for 문형식 p.182 주의 1 for (i=1; i<=5; i++) ; 2 printf("c Language \n"); for (i=1, i<=5, i++) 28
5.3.2 for 문형식 다양한 for문의헤더 p.184 // 1에서 100까지의합구하기 for (sum=0, i=1; i<=100; i++) sum += i; // 1 과 100 사이에있는 3 의배수합구하기 for (sum=0, i=0; i<=100; i+=3) sum += i; // 100 에서 1 까지거꾸로출력하기 for (i=100; i>=1; i--) printf("%3d \n", i); 주의 초기식, 조건식, 증감식은모두생략가능하나 ; 은생략불가능 for ( ; ; ) 29
5.3.2 for 문형식 다양한 for 문의헤더 : 무한루프 조건식생략시무조건본체실행 무한반복이되는무한루프가됨 무한루프는일반적으로본체안에서 for 문을탈출하는방법이포함된다. break 를많이사용 Q) 조건식을사용하도록수정한다면? 30
5.3.3 중첩된 for 문 중첩된 for 문 for 문안에또다른 for 문이포함된것 1 2 3 1 2 3 for (j=1; j<=3; j++) printf( %d \n, j); for (j=1; j<=3; j++) printf( %d \n, j); for (i=1; i<=2; i++) for (j=1; j<=3; j++) printf( %d \n, j); 31
5.3.3 중첩된 for 문 이중중첩 for문예 1 for (i=1; i<=2; i++) 2 { 3 printf("i=%d일때 : ", i); 4 5 for (j=1; j<=3; j++) 6 printf("j=%d ", j); 7 8 printf("\n"); 9 } 10 32
중첩된 for 문에서제어변수의활용 [ 프로그램 5-10] ***** 를 5 행출력하는중첩 for 문 5 int line, star; 6 7 for (line=1; line<=5; line++) 8 { 9 for (star=1; star<=5; star++) 10 printf("*"); 11 printf("\n"); // 행바꾸기 12 } 33
중첩된 for 문에서제어변수의활용 [ 프로그램 5-11] 중첩 for 문과제어변수를활용해 n 행에 * 을 n 개출력하기 5 int line, star; 6 바깥 for문의제어변수활용 7 for (line=1; line<=5; line++) 8 { 9 for (star=1; star<= line ; star++) 10 printf("*"); 11 printf("\n"); // 행바꾸기 12 } 34
5.4.7 중첩된 for 문을이용해알파벳출력하기 [ 프로그램 5-19] 알파벳출력하기 (ch5-19.cpp) 5 char start, ch; 6 7 for (start='z'; start>='a'; start--) 8 { 9 // 행시작부분의연속된빈칸출력 10 for (ch='a'; ch<start; ch++) 11 printf(" "); 12 13 // 빈칸뒤에 start 부터 'z' 까지출력 14 for (ch=start; ch<='z'; ch++) 15 printf("%c", ch); 16 17 printf("\n"); 18 } 실행결과 z yz xyz wxyz vwxyz uvwxyz tuvwxyz : bcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxy z 35
5.5 반복문 (while 문 ) 5.5.1 while 문 반복횟수는모르지만어떤조건을만족하는동안은계속반복할때유용 예 ) 음수가입력된다면계속입력받기 합이 1000을넘지않는한계속더하기 게임을계속하고싶어하는한다시게임하기 올바른비밀번호를찾을때까지계속입력하고찾기 36
5.5.1 while 문 while 문형식 while ( 조건식 ) 다음문장 ; 반복할문장 ; while ( 조건식 ) { 반복할여러문장 ; } 다음문장 ; 37
5.5.1 while 문 예 ) 1~n 의합이처음으로 100 을넘게되는 n 구하기 2 sum = 0, i = 0; 3 while (sum <= 100) 4 { 5 i++; 6 sum = sum + i; 7 } 8 printf("1~%d까지의합 : %d \n", i, sum); 38
5.5.1 while 문 while 문과 for 문의비교 문제에따라 for 문과 while 문을선택해서사용 반복횟수를정확히알때는 for 문이편리 39
5.5.1 while 문 while 문과무한루프 1 // 1~n의합이처음으로 100을넘게되는 n 구하기 2 sum = 0, i = 1; 3 4 while (1) 5 { 6 sum = sum + i; 7 if (sum > 100) 무한루프의탈출 8 break; 9 i++; 10 } 11 printf("1~%d까지의합 : %d \n", i, sum); 40
5.5.1 while 문 while 문과무한루프 // 사용자가양수를입력할때까지입력받기 while (1) { printf(" 양수를입력하세요."); scanf("%d", &n); 무한루프의탈출 if (n > 0) break; } 41
5.6 기타제어문 ` 5.6.1 break 문 switch 문, for 문, while 문, do~while 문을실행하는중간에완전히탈출할때 사용 무한루프를벗어날때매우유용 42
5.6.1 break 문 주의 중첩된루프인경우안쪽루프에서 break문을사용하면 break문이속한안쪽루프만빠져나온다. 그러므로맨안쪽루프에서가장바깥루프까지빠져나오려면 break문이루프개수만큼필요하다. 43
5.6.1 break 문 주의 break문은반복문과 switch문에만해당 if문탈출에사용불가 do { 1~9 행의 if 문이아닌 do_while 을벗어남 } while(reply = Y ); 44