4장 제어문 선택문: if 문, if – else 문, switch 문 반복문: while 문, for 문, do – while 문 연산자: 관계 연산자와 논리 연산자, 증감연산자, 복합치환연산자, 컴마연산자 분기문: break, continue, goto
문장과 실행 순서 문장(statement) 문장의 실행 순서 단문(simple statement) 수식 ; (예) a = b + c; printf("Hello"); 제어문(control statement): 프로그램의 실행 순서를 제어함 선택문: if, if – else, switch 반복문: for, while, do – while 분기문: goto, break, continue 복합문(compound statement) { … 여러 개의 문장들로 이루어진 복합문은 문장; 문법적으로는 한 문장으로 취급. … 문장; } 문장의 실행 순서 기본적으로 순차적으로 수행 제어문을 사용하면 선택 실행 또는 반복 실행 가능 C 언어 프로그래밍
if 문 if 문 (예 4.1) 두 변수 중 큰 값 구하기 if (조건식) … 조건식이 참일 때만 문장 문장 실행 문장 문장 실행 if (score < 60) printf("You have failed.\n"); (예 4.1) 두 변수 중 큰 값 구하기 max = a; … a를 최대값 max라고 가정 if ( b > a ) … b가 a보다 크면 max = b; … b가 max가 된다. C 언어 프로그래밍
if 문 (2) 복합문을 사용한 if 문 예: 두 변수 a, b를 비교하여 큰 값을 a에 작은 값을 b에 넣기 문장 여러 개 이면 복합문 사용 문장 … } 예: 두 변수 a, b를 비교하여 큰 값을 a에 작은 값을 b에 넣기 if (a < b) { … a가 b보다 작으면 tmp = a; a와 b를 서로 교환함 a = b; b = tmp; a b tmp 1 2 3 C 언어 프로그래밍
관계 연산자 조건식과 연산자 관계 연산자 조건식은 대개 값들의 비교로 이루어짐 값의 비교에 관계 연산자와 논리 연산자가 주로 사용됨 관계 연산자 동등 연산자: ==, != C 언어 프로그래밍
C언어에서의 참, 거짓 C언어에서의 참, 거짓 관계 연산 수식의 값 조건식으로 임의의 수식을 사용할 수 있음 nonzero 수식 참 (True) zero 수식 거짓 (False) 관계 연산 수식의 값 참이면 1 거짓이면 0 printf("%d %d \n", 100 > 50, 100 < 50); … [출력] 1 0 조건식으로 임의의 수식을 사용할 수 있음 1. if ( a ) … a가 0이 아니면(참 이면) printf("non zero\n"); 출력 2. if (a = 5) … 수식 a=5의 값은 5이므로 항상 참 printf("a is five\n"); (잘못된 예: =는 ==으로 고쳐야 함) C 언어 프로그래밍
논리 연산자 논리 연산자 연산자 우선 순위 1. 괄호 2. 단항연산자 3. 곱셈, 나눗셈 4. 덧셈, 뺄셈 5. 관계연산자 > >= < <= 6. 동등연산자 == != 7. 논리곱 && 8. 논리합 | | 9. 치환연산자 C 언어 프로그래밍
예제 예제 (예 4.5) 문자 c가 영문자가 아니면 에러메시지 출력 a가 0이상, 100미만이다. a>=0 && a<100 a가 0미만이거나 100이상이다. a<0 || a>=100 x, y, z 중에서 x가 가장 작은 수이다. x <= y && x <= z a와 b의 합이 c와 d의 차보다 작다. a + b < c – d if (a >= 0 && a < 100) printf("a is between 0 and 100\n"); (예 4.5) 문자 c가 영문자가 아니면 에러메시지 출력 if ( ! ( c >= 'A' && c <= 'Z' | | c >= 'a' && c <= 'z' ) ) printf("c is not alphabet\n"); 또는 if ( ! ( c >= 'A' && c <= 'Z' ) && ! (c >= 'a' && c <= 'z' ) ) 드모르간 법칙 !(p && q) !p || !q !(p || q) !p && !q C 언어 프로그래밍
논리연산자의 단축 평가 * 논리 연산의 단축평가 나머지 수식의 결과에 관계없이 연산 결과를 알 수 있을 때에 나머지 수식의 평가를 하지 않는다. 수식1 && 수식2 수식1 이 거짓이면 연산결과가 거짓 (수식2를 평가하지 않음) 수식1 | | 수식2 수식1이 참이면 연산결과가 참 (수식2를 평가하지 않음) if ( a != 0 && b / a > 10 ) … a가 0이 아닐 때에만 계산함 C 언어 프로그래밍
if – else 문 if – else 문 (예 4.9) y를 x로 나눈 몫을 출력 if (조건식) 문장1 … 참일 때 수행 문장1 … 참일 때 수행 else 문장2 … 거짓일 때 수행 (예 4.9) y를 x로 나눈 몫을 출력 if (x == 0) printf("0으로 나눌 수 없습니다.\n"); printf("몫 = %d\n", y / x ); C 언어 프로그래밍
조건 연산자 조건 연산자: ? : 예: 두 수의 a, b의 최대값을 max에 저장 조건식 ? 수식1 : 수식2 조건 연산자: ? : 조건식 ? 수식1 : 수식2 3항 연산자: 피연산자가 3개 조건식: 참 수식값 = 수식1 조건식: 거짓 수식값 = 수식2 예: 두 수의 a, b의 최대값을 max에 저장 1. max = (a > b) ? a : b; 2. (a>b) ? (max=a) : (max=b); … 뒤의 두 괄호는 반드시 필요함 3. if ( a > b ) max = a; else max = b; C 언어 프로그래밍
예제 (연습 4.4-1) 연도를 입력 받아서 평년과 윤년을 판단하는 프로그램 윤년: (1) 4로 나누어지고 100으로 나누어지지 않는 연도 (2) 400으로 나누어지는 연도 flag 변수 사용: 이 프로그램은 조건식의 결과를 변수 isleap에 저장하고 if문의 조건식에 저장된 변수값을 사용함 C 언어 프로그래밍
중첩된 if문 중첩된 if 문 (예 4.11) 변수 a, b의 부호에 따라서 다음 표와 같이 출력 if와 else의 목표문으로 if 또는 if – else 문을 사용한 것 (예 4.11) 변수 a, b의 부호에 따라서 다음 표와 같이 출력 C 언어 프로그래밍
중첩된 if문 – 다단계 if문 다단계 if문 if (조건식1) 문장1 else if (조건식2) 문장2 … else if (조건식n) 문장n else 문장n+1 C 언어 프로그래밍
예제 (예 4.12) 점수에 따른 등급 부여 A: 90점이상, B: 80점대, C: 70점대, D: 60점대, F: 60점미만 int score; /* 점수 */ char grade; /* 등급 */ ... if (score >= 90) grade = 'A'; else if (score >= 80) grade = 'B'; else if (score >= 70) grade = 'C'; else if (score >= 60) grade = 'D'; else grade = 'F'; 위에서 80점대를 다음과 같이 작성하지 않도록 주의 else if (score >= 80 && score < 90) grade = 'B' score < 90 의미가 포함됨 C 언어 프로그래밍
switch 문 switch문 switch (정수식) { case 값1 : 문장1; … break; case 값n : 문장n; … break: switch문 종료 break; break가 없으면 다음 문장 실행 default : 문장n+1; … } 정수식 값에 해당하는 case의 문장부터 실행 해당하는 case가 없으면 default의 문장부터 실행 정수식? =값1 =값2 =값n 기타 문장들1 문장들2 문장들n 문장들 n+1 label C 언어 프로그래밍
예제 (예 4.14) 점수에 따른 등급 부여 switch ( score / 10 ) … 성적의 10자리를 얻는다. { case 10: … break가 없으므로 다음 문장을 실행 case 9: grade = 'A'; break; case 8: grade = 'B'; break; case 7: grade = 'C'; break; case 6: grade = 'D'; break; default: grade = 'F'; } C 언어 프로그래밍
예제 (예 4.43) 다음과 같이 소득에 따른 세금 계산 0 ~ 100 0.00 10 100 ~ 200 10.00 14 소득 (만원) 기본 세금 초과분에 대한 세율(%) 0 ~ 100 0.00 10 100 ~ 200 10.00 14 200 ~ 400 24.00 20 400 ~ 64.00 30 세금 계산식 소득(income) 세금(tax) 0 ~ 100 tax = income * 0.1 100 ~ 200 tax = 100*0.1 + (income-100)*0.14 200 ~ 400 tax = 100*0.1 + 100*0.14 + (income-200)*0.2 400 ~ tax = 100*0.1 + 100*0.14 + 200*0.2 + (income-400)*0.3 C 언어 프로그래밍
예제 C 언어 프로그래밍
while문 while문 (예 4.18) 음수 또는 0이 입력될 때까지의 입력된 정수의 합을 계산 문장 문장 반복 실행 while (조건식) { 문장 … } (예 4.18) 음수 또는 0이 입력될 때까지의 입력된 정수의 합을 계산 ... sum : 누계 C 언어 프로그래밍
반복제어 변수 (예 4.19) 1부터 10까지의 정수의 합 계산 sum = 1 + 2 + 3 + … + 10; sum = 0; sum = sum + 1; i=1~10 에 대해서 다음 문장 반복수행 sum = sum + 2; sum = sum + i … sum = sum + 10; sum = 0; … 합의 초기값은 0 i = 1; …초기화 while ( i <= 10 ) { …검사 sum = sum + i; i = i + 1; …갱신 } 변수 i가 반복제어변수 반복제어변수: - 반복할 때마다 값이 변화 - 변수 값에 따라서 반복수행 여부결정 C 언어 프로그래밍
예제 (예 4.21) 실수 r의 n제곱을 계산 (n은 정수) 곱의 초기값 = 1 (곱셈 항등원) 곱의 초기값 = 1 (곱셈 항등원) 반복제어: n을 초기값에서 시작하여 반복할 때마다 1씩 감소시켜서 n이 0이 될 때까지 반복하면 n의 초기값 횟수만큼 반복 수행 n번 반복하면 rn이 계산됨 C 언어 프로그래밍
for문 for문 예: N번 반복 실행 for (수식1; 수식2; 수식3) … 수식2가 참인 문장 동안 반복 문장 동안 반복 반복제어변수를 사용하는 경우에 적합 수식1: 초기화 수식2: 조건식 수식3: 갱신 예: N번 반복 실행 1. for (i = 1; i <=N; i = i+1 ) … 1부터 N까지 문장 2. for (i = 0; i < N; i = i+1 ) … 0부터 N-1까지 C 언어 프로그래밍
예제 (예 4.22) 1부터 10까지의 정수의 합 계산 (예 4.24-1) 수열 an = 2an-1 – 1 (a1=3)의 a10 구하기 (예 4.24-2) Fibonacci수열 Fn = Fn-2 + Fn-1 (F1=0, F2=1)의 F20 구하기 a b c 1 2 3 4 + = … a: Fn-2, b: Fn-1, c: Fn C 언어 프로그래밍
무한 루프와 공문 무한루프 공문(null statement): ; 만으로 이루어진 아무 동작도 하지 않는 문장 반복조건이 항상 참인 반복문 for ( ; ; ) … 수식2가 생략되면 참(true)으로 간주함 문장 while (1) … 조건식 1은 참(true)이다 무한 루프인 반복문은 내부에서 반복문을 종료할 수 있어야 함. break 공문(null statement): ; 만으로 이루어진 아무 동작도 하지 않는 문장 while (조건식) ; while(조건식) 무한 루프 발생 가능 ; C 언어 프로그래밍
반복문 설계 반복 자료 입력을 종료 시키는 방법 (예 4.26) EOF를 만날 때 까지 정수를 입력하여 평균 계산 입력 자료 수를 먼저 입력하여 이 횟수 만큼 반복 입력 정상적으로 사용되지 않는 자료(보초)를 마지막에 입력 입력 함수의 파일 끝(EOF) 반환 기능 이용 (Ctrl-Z 또는 Ctrl-D 입력) (예 4.26) EOF를 만날 때 까지 정수를 입력하여 평균 계산 C 언어 프로그래밍
예제 네제곱표 만들기 #include <stdio.h> main() 출력 { 1 1 int a; 3 81 5 625 for (a=1; a<=13; a = a+2) printf("%d %d \n",a, a*a*a*a); } 문제점: 각 열이 나란하게 출력되지 않음 해결책: 출력의 각 필드 폭을 일정하게 함 출력 1 1 3 81 5 625 7 2401 9 6561 11 14641 13 28561 C 언어 프로그래밍
잘못된 입력 처리하기 * scanf() 함수의 반환값 정수가 아닌 입력에 대해서 반복 종료 (예 4.26)의 반복문 에서 EOF를 1로 바꾸면 파일 끝뿐만 아니라 정수가 아닌 입력에 대해서도 반복을 종료함 정수가 아닌 입력을 무시하고 계속 입력* scanf("%*s") 를 사용하면 잘못된 입력을 무시하고 다음 자료 입력 C 언어 프로그래밍
형식지정출력 - 예제 (예 4.27) 네제곱표 만들기 출력 1 1 3 81 5 625 7 2401 9 6561 11 14641 문제점: 각 열이 나란하게 출력되지 않음 해결책: 출력의 각 필드 폭을 일정하게 함 1 1 3 81 5 625 7 2401 9 6561 11 14641 13 28561 출력 C 언어 프로그래밍
형식지정 출력 필드 폭과 정렬: printf 함수의 형식지정자 C 언어 프로그래밍
예제 네제곱표 연월일을 2003/04/05 형식으로 출력 화씨,섭씨온도 환산표 (0도부터 100도까지 5도간격) 출력 printf("%2d %6d\n",a, a*a*a*a); 연월일을 2003/04/05 형식으로 출력 yr = 2003; mo = 4; day = 5; printf("%4d/%02d/%02d\n", yr, mo, day); 화씨,섭씨온도 환산표 (0도부터 100도까지 5도간격) printf("%4s %6s\n", "화씨", "섭씨"); … 환산표 헤더 for (f = 0; f <= 100; f = f + 5) { c = (f - 32.0) * 5.0 / 9.0; printf("%4d %6.1f\n", f, c); } 1 1 3 81 5 625 7 2401 9 6561 11 14641 13 28561 C 언어 프로그래밍
증감 연산자 증감 연산자 증감 연산 수식의 값 증가연산자: i++ i = i+1 감소연산자: i-- i = i-1 (예) i = 5; a = ++i; i++; a = i; 결과: i=6, a=6 a = i++; a = i; i++; 결과: i=6, a=5 C 언어 프로그래밍
복합 치환 연산자 복합 치환 연산자 (예 4.30) var op= 수식 var = var op 수식 치환연산자 사용 복합치환연산자 사용 a = a + 2 a += 2 count = count – 1 count –= 1 sum = sum + j sum += j d = d / 12 d /= 12 n = n * (k+1) n *= k+1 … 괄호 불필요 C 언어 프로그래밍
예제 (예 4.31) 다음과 같은 수열의 20항까지 출력, 20항까지의 합 출력 1 2 4 7 11 16 … 1 2 4 7 11 16 … 증가량이 1, 2, 3, …과 같이 1씩 증가함 C 언어 프로그래밍
실습 문제 while 반복문을 사용하여 십진수를 입력하면 그것을 ASCII 값으로 하는 문자를 출력하는 프로그램을 작성하라. (단, 끝날때는 999를 입력한다고 하자.) 자료의 개수를 입력하고, 그 개수 만큼의 자료를 입력하면 합과 평균을 구하는 프로그램을 작성하라. C 언어 프로그래밍
do – while문 do-while문 (예 4.32) 정상적인 메뉴 입력이 들어올 때까지 반복 입력 do 문장 … 조건에 관계없이 문장이 while (조건식); 적어도 한번은 실행됨 do { 문장; … } while (조건식); … 세미콜론(;)으로 끝남에 주의 (예 4.32) 정상적인 메뉴 입력이 들어올 때까지 반복 입력 C 언어 프로그래밍
중첩된 반복문 (예 4.33) 다음과 같은 구구단 표 출력 중첩된 반복문 2*1= 2 2*2= 4 2*3= 6 ... 2*6=12 2*7=14 2*8=16 2*9=18 3*1= 3 3*2= 6 3*3= 9 ... 3*6=18 3*7=21 3*8=24 3*9=27 ... 안쪽 반복문의 반복 횟수가 고정됨 중첩된 반복문 반복문 안에 반복문이 포함된 것 바깥 반복문과 안쪽 반복문은 가능한 한 같은 반복제어변수를 사용하지 않아야 함. C 언어 프로그래밍
예제 (예 4.34) 오른쪽과 같이 10줄을 출력 * ** *** **** ***** i번째 줄은 i개의 *를 출력함 안쪽 반복문의 반복 횟수가 바깥 반복문의 반복제어 변수에 의해서 정해짐. * ** *** **** ***** C 언어 프로그래밍
연습 문제 1. 다음과 같이 10줄을 출력하는 프로그램을 작성하시오. * ** *** **** ***** 2. 반복문을 사용하여 15+25+…+105 을 계산하는 프로그램을 작성하시오. 단 5제곱을 계산할때도 반복문을 사용하시오. C 언어 프로그래밍
break문 break문 switch 또는 반복문(while, for, do-while)의 실행을 종료함. 문장; … if (조건식2) break; … 무한루프에서는 반드시 사용 } C 언어 프로그래밍
예제 (예 4.35) 양수가 입력되는 동안 입력의 합 계산 sum = 0; scanf("%d", &number); while (number > 0) { sum = sum + number; } /* 예 4.18 */ while (1) { /* 무한 루프 */ if (number <= 0) break; } break를 사용 C 언어 프로그래밍
continue문 continue문 반복문에서 반복 문장의 현재 단계의 수행을 종료하고 다음 반복 시도 while (조건식1) { 문장; … if (조건식2) continue; } for (수식1; 조건식1; 수식3) { if (조건식2) continue; … for문의 continue는 while문과 문장; … 동작에 차이가 있다. C 언어 프로그래밍
goto문 분기문 goto문 실행순서를 원하는 곳으로 이동 (예) break, continue, goto goto label; … label: 문장 사용을 권장하지 않음 중첩된 반복문에서 안쪽 반복문에서 한번에 바깥 반복문을 빠져 나올 때 유용 바깥 반복문 안쪽 반복문 goto end; break end: 문장 C 언어 프로그래밍
내장 치환 내장 치환(embedded assignment) (예 4.39) 한 줄의 문자를 입력하여 소문자를 대문자로 변환 치환연산자가 보통 수식에 포함되어 사용되는 것 z = (x=6) + 7; (a = b+c ) != 5; 조건식에 내장 치환을 사용하면 프로그램이 간결해질 수 있음 (예 4.39) 한 줄의 문자를 입력하여 소문자를 대문자로 변환 c = getchar(); while (c != '\n') { if (c >= 'a' && c <= 'z') /* 소문자이면 */ c = c - 'a' + 'A'; /* 대문자로 변환 */ putchar(c); /* 문자 출력 */ c = getchar(); /* 다시 문자 입력 */ } /* 예 4.17 */ while ( (c = getchar() ) != '\n') { if (c >= 'a' && c <= 'z') c = c - 'a' + 'A'; putchar(c); } 조건식에 내장 치환 사용 C 언어 프로그래밍
컴마 연산자 컴마(comma) 연산자 , (예 4.40) 두 개의 반복제어변수를 사용하는 반복문 여러 개의 수식을 묶어서 하나의 수식으로 만드는 역할 { }를 사용하여 여러 개의 문장을 하나로 묶는 복합문의 역할과 유사 i = 0, j = 0 … 하나의 수식 수식의 값: 컴마 연산자로 결합된 마지막 수식의 값 a = 10, b = a + 20 ... 수식의 값 = b의 값 = 30 수식 위치에 여러 개의 수식을 넣어야 하는 경우에 유용함 (예) for문의 수식, 반복문의 조건식 등. 가장 우선 순위가 낮은 연산자 (예 4.40) 두 개의 반복제어변수를 사용하는 반복문 for (i=0, j=0; i+j <= 50; i++, j += 2) printf(" (%d, %d)\n", i, j); C 언어 프로그래밍
예제 0 또는 음수가 입력될 때까지의 입력된 정수의 합을 계산 (예 4.41 참고) sum = 0; scanf("%d", &number); while (number > 0) { sum = sum + number; } /* 예 4.18 */ 마지막에 있는 조건식의 결과가 컴마 수식의 수식의 값 sum = 0; while (scanf("%d", &number), number > 0) sum = sum + number; C 언어 프로그래밍
실습 문제 (선택문) 2차 방정식 의 세 계수 a, b, c를 입력 받아서 근을 구하는 프로그램 작성 단, C 언어 프로그래밍
실습 문제 (반복문) 무리수 e는 다음의 무한 급수로 표현된다. 프로그램의 결과를 수학함수를 사용한 결과 exp(1.0)과 비교하시오. C 언어 프로그래밍