C 언어 맛보기 #2 – 제어구조(if, while, for)
부산대학교 전기컴퓨터공학부 김종덕 ([email protected])
본 강의 자료는 문정욱 교수님의 강의 자료를 활용하여 작성하였습니다.
Intelligence Networking and Computing Lab.
강의의 목표
❖ if, if-else, while, for 등 C 언어의 대표적 제어 구조를 살펴 보고 기본 사용법을 익힌다.
▪ 제어 흐름(Flow of Control)이란 프로그램에서 실행되는 문장들의 실행 순서
▪ 특별히 지정하지 않으면, 프로그램의 실행은 첫 번째 문장에서 시작하여 한 번 에 한 문장씩 순차적으로 실행된다
▪ 제어 구조(Control Construct)란 프로그램에서 실행되는 문장들의 실행 순서를 제어하는 문장인데 이 장에서는 다음 두 가지 구조를 우선 살펴 본다.
▪ 조건문(conditional statement) 중 if 문, if-else 문
• if 문은 조건에 따라 실행할 문장을 선택한다.
▪ 반복문(repetition statement) 혹은 루프(loop) 중 while 문, for 문
• 루프는 특정 문장을 여러 번 반복해서 실행하게 한다
❖ 배열(Array)의 필요성과 기본 사용법을 익힌다.
2
if 문의 개념
❖ 무조건 문장 수행 ❖ 조건 문장 수행
#include <stdio.h>
int main(void) { int a;
scanf("%d", &a);
printf("a==one\n");
return 1;
}
#include <stdio.h>
int main(void) { int a;
scanf("%d", &a);
if (a==1)
printf("a==one\n");
return 1;
}
논리적 오류
if 문의 개념
❖ if-statement
▪ 조건을 만족하면 괄호 안의 조건 수 식(Expression)의 논리 값이 참이면
▪ 문장(Statement1)을 한 번 수행한다.
4
if-statement:
if (expression) statement1;
a statement (if-statement)
a statement
#include <stdio.h>
int main(void) { int a;
scanf("%d", &a);
if (a==1)
printf("a==one\n");
return 1;
}
if 문과 블록
❖ if-statement
▪ If는 한 개의 statement에만 관여함
▪ 그 뒤에 따로 오는 두 번째 문장에는 관 여하지 않음
int main(void) { int a;
scanf("%d", &a);
if (a==1)
printf("a==one\n");
printf("after if-stat\n");
return 1;
}
Always executedint main(void) { int a;
scanf("%d", &a);
if (a==1) {
printf("a==one\n");
printf("after if-stat\n");
}
return 1;
a block == a statement
관계/논리 연산자
❖ 연산의 결과가 Boolean 값
▪ 참(True:1) 또는 거짓(False:0)
❖ 관계(Relational) 연산자
6
int main(void) {
int a=1,b=2,c=3;
if (a+b == c) printf("a+b==c\n");
if (a != b+c) printf("a!=b+c");
if (a < b) printf("a<b\n");
if (a <= b) printf("a<=b\n");
if (c > b) printf("c>b\n");
if (c >=b) printf("c>=b\n");
return 1;
}
Relational Operation OperatorEqual ==
Not Equal !=
Less than <
Equal of Less than <=
Greater than >
Equal of Greater than >=
생성되는 실행 파일명의 변경
관계/논리 연산자
❖ 논리(logical) 연산자
❖ 연산자 우선 순위에 유의
▪ Ex) 7-4/2 vs. (7-4)/2
▪ 괄호를 활용하여 논리 오류를 방지
Logical Operation OperatorLogical And &&
Logical Or ||
Logical Not !
int main(void) {
int a=1,b=2,c=3;
if (a<b && c>b) printf("a<b && c>b\n");
if (a<b || c<b) printf("a<b || c<b\n");
if ( ! b>c ) printf("! b>c\n");
return 1;
}
test3
int main(void) {
int a=1,b=2,c=3;
if (a<b && c>b) printf("a<b && c>b\n");
if (a<b || c<b) printf("a<b || c<b\n");
if ( !(b>c) ) printf("!(b>c)\n");
return 1;
}
test2
if-else 문의 개념
❖ if-else statement
▪ 조건 수식 만족하면 statement1 수행, 만족하지 않으면 statement2 수행
8
if-else statement:
if (expression) statement1;
else statement2;
int main(void) {
int a;
scanf("%d",&a);
if (a==1)
printf("a == one\n");
else
printf("a == other\n");
return 1;
}
ifelse
if-else 문과 블록
❖ 블록을 활용하여 복합문장 (Compound Statement) 구성
▪ Python과 다름 !!!
❖ 블록을 사용하지 않을 경우 Syntax Error
▪ Syntax Error가 정확히 코드의 어느 부분에서 발생하며 그 이유가 무엇인지 설명해보라.
int main(void) {
int a;
scanf("%d",&a);
if (a==1) {
printf("a == one\n");
printf("a == 1\n");
} else
printf("a == other\n");
return 1;
}
ifelse2
int main(void) {
int a;
scanf("%d",&a);
if (a==1)
printf("a == one\n");
printf("a == 1\n");
else
printf("a == other\n");
return 1;
}
ifelse3
a if-else statement1
중첩 if문
10
int main(void) {
int a,b;
scanf("%d",&a);
scanf("%d",&b);
if (a==1) if (b==1)
printf("a == 1, b == 1\n");
else
printf("a == 1, b != 1\n");
else
printf("a != 1\n");
return 1;
}
nestedif
a if-else statement1
int main(void) {
int a,b;
scanf("%d",&a);
scanf("%d",&b);
if (a==1)
printf("a == 1\n");
else
if (b==1)
printf("a != 1, b == 1\n");
else
printf("a != 1, b != 1\n");
return 1;
}
nestedif2
a if-else statement2
while 문의 개념
❖ if에서 문장 수행 횟수 ❖ While에서 문장 수행 횟수
❖ while statement
▪ 조건 수식(cond_expression)을 만족할 동안에 loop_statement를 계속 수행
iftest
조건을 만족하면 1번 수행
int main(void) {
int a;
scanf("%d",&a);
if (a<5) {
printf("%d < 5\n", a);
a = a+1;
}
return 1;
}
whiletest
조건을 만족하면 계속 수행
int main(void) {
int a;
scanf("%d",&a);
while (a<5) {
printf("%d < 5\n", a);
a = a+1;
}
return 1;
}
while statement:
while (cond_expression) loop_statement;
while 문의 동작 순서
12
int main(void) {
int i;
i=1;
while (i<5) {
printf(“i = %d\n", i);
i = i+1;
}
return 1;
}
②
①
③④
⑤
i ← 1
i < 5
print i
i ← i+1
②
①
③
④
⑤ Yes No
i==1: ① → ② → ③ →
i==2: ④ → ② → ③ →
i==3: ④ → ② → ③ →
i==4:
④→
②→
③→
i==5:
④→
②→ ⑤
for 문의 개념
❖ for statement
▪ 조건 수식(cond_expression)을 만족할 동안에 loop_statement를 계속 수행
▪ init_clause
: 초기화 구문
▪ cond_expression
: 조건 수식
▪ iteration_expression
: loop_statement 수행 이후 다시 cond_expression 확인 전에 수행 되는 증감 수식
for statement:
for (init_clause;
cond_expression; iteration_expression) loop_statement;int main(void) {
int i;
for (i=1; i<5; i=i+1) {
printf(“i = %d\n", i);
}
return 1;
}
for 문의 동작 순서
14
int main(void) {
int i;
for (i=1; i<5; i=i+1) {
printf(“i = %d\n", i);
}
return 1;
}
① ②
③
④
⑤
i ← 1
i < 5
print i
i ← i+1
②
①
③
④
⑤ Yes No
i==1: ① → ② → ③ →
i==2: ④ → ② → ③ →
i==3: ④ → ② → ③ →
i==4:
④→
②→
③→
i==5:
④→
②→ ⑤
배열(Array)의 개념
❖ 동일한 자료형과 작업 수행이 필요한 많은 변수가 필요한 경우?
int main(void) {
int i;
int a0, a1, a2;
a0 = 0*0;
a1 = 1*1;
a2 = 2*2;
printf("%d\n", a0);
printf("%d\n", a1);
printf("%d\n", a2);
return 1;
}
int main(void) {
int i;
int a0, a1, a2, ..., a99;
a0 = 0*0;
a1 = 1*1;
a2 = 2*2;
...
a99 = 99*99;
printf("%d\n", a0);
printf("%d\n", a1);
printf("%d\n", a2);
...
printf("%d\n", a2);
return 1;
} 변수가 100개가 필요하다면?
배열(Array)의 개념 – 반복문 개념의 적용?
16
int main(void) {
int i;
int a0, a1, a2, ..., a99;
a0 = 0*0;
a1 = 1*1;
a2 = 2*2;
...
a99 = 99*99;
printf("%d\n", a0);
printf("%d\n", a1);
printf("%d\n", a2);
...
printf("%d\n", a2);
return 1;
}
int main(void) {
int i;
int a0~99;
for (i=0; i<=99; i=i+1) ai = i*i;
for (i=0; i<=99; i=i+1) printf("%d\n", ai);
return 1;
}
int main(void) {
int i;
int
a[100]
; //a[0]~a[99]for (i=0; i<=99; i=i+1)
a[i]
= i*i;for (i=0; i<=99; i=i+1) printf("%d\n",
a[i]
);return 1;
} Syntax Error!
배열(Array)의 개념
❖ 배열
▪ 같은 자료형(Type)의 연속된 변수들로 구성된 복합 변수 : Identifier[n]
▪ 길이(크기)는 정수 값 : n
▪ 색인(Index)의 범위는 0~n-1
▪ 색인 범위를 벗어나면 Run-Time Error 발생할 수 있음
❖ 배열의 메모리 구조
▪ 프로그래밍에서 널리 쓰이는 기초 자료 구조 (Data Structure), Sequential Memory
int main(void) {
int i;
int
a[3]
; //a[0],a[1],a[2]a[0] = 2;
a[1] = 9;
a[2] = 8;
for (i=0; i<3; i=i+1) printf("%d\n",a[i]);
return 1;
}
Address Memory Cell Array
0x2872
2 a[0]
0x2876
9 a[1]
0x287A
8 a[2]
0x287E