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