Download presentation
Presentation is loading. Please wait.
1
C++ Espresso 제2장 제어문과 함수
2
이번 장에서는 제어 구조와 함수에 대하여 살펴봅니다.
이번 장에서 학습할 내용 이번 장에서는 제어 구조와 함수에 대하여 살펴봅니다. 조건문 반복문 break, continue 함수 개념 함수 정의 함수 원형 매개 변수 순환 호출
3
제어문 조건에 따라서 여러 개의 실행 경로 가운데 하나를 선택 문장이 실행되는 순서에 영향을 주는 문장
조건에 따라서 여러 개의 같은 처리를 반복
4
if-else 문 if( 조건식 ) 문장1; else 문장2; 날씨가 좋은가? 테니스를 친다. 공부를 한다. 거짓 참
문장1; else 문장2; 조건식이 참이면 실행된다. 조건식이 거짓이면 실행된다.
5
If-else 문 if ( score >= 60 ) cout << "합격입니다.\n"; else
{ cout << "합격입니다.\n"; cout << "장학금도 받을 수 있습니다.\n"; } else cout << "불합격입니다.\n"; cout << "공부하세요.\n"; score가 60이상이면 실행 score가 60미만이면 실행
6
예제 #1 #include <iostream> using namespace std; int main() {
int x, y; cout << "x값을 입력하시오: "; // 입력 안내 출력 cin >> x; cout << "y값을 입력하시오: "; // 입력 안내 출력 cin >> y; if (x > y) cout << "x가 y보다 큽니다. " << endl; else cout << "y가 x보다 큽니다. " << endl; return 0; } x값을 입력하시오: 10 y값을 입력하시오: 20 y가 x보다 큽니다.
7
중첩 if-else 문 if 문에 다시 if 문이 포함 if( 조건식1 ) if( 조건식2 ) 문장;
8
If 문안의 문장자리에 if-else 문이 들어간 경우
if( score >= 80 ) if( score >= 90 ) cout << "당신의 학점은 A입니다.\n"; else cout << "당신의 학점은 B입니다.\n"; If 문안의 문장자리에 if-else 문이 들어간 경우
9
if와 else의 매칭 문제 else 절은 가장 가까운 if절과 매치된다. if(score >= 80)
cout << “당신의 학점은 A입니다\n”; else cout << “당신의 학점은 B입니다\n”; O X
10
만약 다른 if절과 else 절을 매치시키려면 중괄호를 사용하여 블록으로 묶는다.
if( score >= 80 ) { if( score >= 90 ) cout << "당신의 학점은 A입니다.\n"; } else cout << "당신의 학점은 A나 B가 아닙니다.\n"; 만약 다른 if절과 else 절을 매치시키려면 중괄호를 사용하여 블록으로 묶는다.
11
예제 #2 #include <iostream> using namespace std; int main() {
int age; // 나이 cout << "나이를 입력하시오: "; cin >> age; if (age<= 12) cout << "어린이입니다."<< endl; else if (age <= 19) cout << "청소년입니다."<< endl; else cout << "성인입니다."<< endl; return 0; } 나이를 입력하시오: 20 성인입니다.
12
참고사항 C++에서는 다음과 같이 if-else 문장 안에서 변수 선언도 가능하다.
if( int condition=get_status() ) { ... }
13
중간 점검 문제 1. 변수 n의 값이 100보다 크거나 같으면 “large", 100보다 작으면 ”small"을 출력하는 if-else 문을 작성하라. 2. k의 값이 각각 3, 0, -1인 경우에 다음의 코드에 의하여 생성되는 출력은 무엇인가? if( k != 0 ) cout <<"A"; else if( k > 3 ) cout <<"B"; else cout <<"C"; 3. 컵의 사이즈를 받아서 100ml미만은 small, 100ml이상 200ml미만은 medium, 200ml 이상은 large라고 출력하는 연속적인 if-else 문을 작성하시오.
14
switch 문 여러가지 경우 중에서 하나를 선택하는데 사용
15
예제 int main() { int number; cout << "정수를 입력하시오:";
cin >> number; switch(number) { case 0: cout << "없음\n"; break ; case 1: cout << "하나\n"; case 2: cout << "둘\n"; default: cout << "많음\n"; break; } } 정수를 입력하시오: 1 하나
16
예제
17
예제
18
중간 점검 문제 1. case 절에서 break 문을 생략하면 어떻게 되는가?
2. 변수 fruit의 값이 각각 1, 2, 5일 때, 다음의 코드의 출력을 쓰시오. switch(fruit) { case 1: cout <<"사과"; break; case 2: cout <<"배"; case 3: cout <<"바나나"; default: cout <<"과일"; }
19
반복문의 종류
20
while 문 주어진 조건이 만족되는 동안 문장들을 반복 실행한다. while( 조건식 ) 문장;
21
예제 // while 문을 이용한 구구단 출력 프로그램 #include <iostream>
using namespace std; int main() { int n; int i = 1; cout << "구구단 중에서 출력하고 싶은 단을 입력하시오: "; cin >> n; while (i <= 9){ cout << n << "*" << i << "=" << n * i << endl; i++; } return 0; 구구단 중에서 출력하고 싶은 단을 입력하시오: 9 9*1 = 9 9*2 = 18 9*3 = 27 .... 9*9 = 81
22
do...while문 반복 조건을 루프의 끝에서 검사 do 문장 while(조건)
23
예제 i의 값: 10 int main() { int i = 10; do {
cout <<"i의 값: " << i << endl; i++; } while (i <3); } i의 값: 10
24
게임 예제 // 반복을 이용한 게임 프로그램 #include <iostream>
// 반복을 이용한 게임 프로그램 #include <iostream> using namespace std; int main() { int answer =59; // 정답 int guess; int tries = 0; // 반복구조 do { cout << "정답을 추측하여 보시오: "; cin >> guess; tries++; if (guess >answer) // 사용자가 입력한 정수가 정답보다 높으면 cout <<"제시한 정수가 높습니다.\n"; if (guess <answer) // 사용자가 입력한 정수가 정답보다 낮으면 cout <<"제시한 정수가 낮습니다.\n"; } while (guess !=answer); cout << "축하합니다. 시도횟수=" << tries << endl; return 0; } 정답을 추측하여 보시오: 10 제시한 정수가 낮습니다. 정답을 추측하여 보시오: 30 정답을 추측하여 보시오: 60 제시한 정수가 높습니다. 정답을 추측하여 보시오: 59 축하합니다. 시도횟수=4
25
break 문과 continue 문 break 문은 반복 루프를 빠져 나오는데 사용된다.
26
예제
27
예제
28
중간 점검 문제 1. 다음 코드의 출력을 쓰시오. int n = 12; while (n > 0) { n = n - 2;
if( n == 6 ) break; cout << n << endl; }
29
for 문 정해진 횟수만큼 반복하는 구조
30
for 문의 구조 for ( 초기화; 조건식; 증감식) 문장; ① 초기화를 실행한다.
문장; ① 초기화를 실행한다. ② 반복 조건을 나타내는 조건식을 계산한다. ③ 수식의 값이 거짓이면 for 문의 실행이 종료된다. ④ 수식의 값이 참이면 문장이 실행된다. ⑤ 증감을 실행하고 ②로 돌아간다.
31
예제
32
예제 #include <iostream> using namespace std; int main() {
long fact = 1; int n; cout << "정수를 입력하시요:"; cin >> n; for (int i = 1; i <= n; i++) fact = fact * i; cout << n << "!은 " << fact << "입니다.\n"; return 0; } 정수를 입력하시요: 10 10!은 입니다.
33
중간 점검 문제 1. 다음 코드의 출력을 쓰시오. for(int i = 1; i < 5; i++)
cout << i << endl; 2. 다음 코드의 출력을 쓰시오. for(int i = 0; i < 3; i++) for(int j = 0; j < 3; j++) cout << i << " 곱하기 “ << j << " 은 ” << i*j << endl;
34
함수의 개념 함수(function): 특정한 작업을 수행하는 독립적인 부분
함수 호출(function call): 함수를 호출하여 사용하는 것 함수는 입력을 받으며 출력을 생성한다.
35
함수의 구조
36
반환형 C언어에서는 만약 반환형을 명시하지 않으면 int 형을 가정하였다.
만약 값을 반환하지 않는다면 void라고 표시한다. 반드시 반환형을 표시해야 함 get_max(int x, int y) { if( x > y ) return(x); else return(y); }
37
함수 정의 예제 함수를 프로그램을 이루는 부품이라고 가정하자. 입력을 받아서 작업한 후에 결과를 생성한다.
38
예제 #1 정수의 제곱값을 계산하는 함수 반환값: int 함수 이름: square 매개 변수: int n
{ return(n*n); }
39
예제 #2 두개의 정수중에서 큰 수를 계산하는 함수 반환값: int 함수 이름: get_max
매개 변수: int x, int y int get_max(int x, int y) { if( x > y ) return(x); else return(y); }
40
인수와 매개 변수 인수(argument): 실인수, 실매개 변수라고도 한다.
매개 변수(parameter): 형식 인수, 형식 매개 변수라고도 한다.
41
반환값 반환값(return value): 호출된 함수가 호출한 곳으로 작업의 결과값을 전달하는 것
인수는 여러 개가 가능하나 반환값은 하나만 가능 return 0; return(0); return x; return x+y; return x*x+2*x+1;
42
함수 원형 함수 원형(function prototyping): 컴파일러에게 함수에 대하여 미리 알리는 것 함수 원형
#include <iostream> using namespace std; int square(int n); // 함수 원형 int main() { int i, result; for(i = 0; i < 5; i++) result = square(i); // 함수 호출 cout << result << endl; } return 0; int square(int n) // 함수 정의 return(n * n); 함수 원형
43
중간 점검 문제 1. 함수 이름 앞에 void가 있다면 무슨 의미인가?
2. 함수가 작업을 수행하는데 필요한 데이터로서 외부에서 주어지는 것을 무엇이라고 하는가? 3. 함수 몸체는 어떤 기호로 둘러 싸여 있는가? 4. 두개의 정수의 곱을 반환하는 함수 mult(int x, int y)를 작성하여 보자.
44
중복 함수 중복 함수(overloading functions): 같은 이름을 가지는 함수를 여러 개 정의하는 것
// 정수값을 제곱하는 함수 int square(int i) { return i*i; } // 실수값을 제곱하는 함수 double square(double i)
45
예제
46
중복 함수의 장점 중복 함수를 사용하지 않은 경우: square_int(int int);
square_double(double int); square_short(short int); 중복 함수를 사용하는 경우 square(int int); square(double int); square(short int); 함수 이름의 재사용이 가능
47
주의할 점 int sub(int); int sub(int, int);// 중복 가능!
int sub(int, double);// 중복 가능! double sub(double);// 중복 가능! double sub(int);// 오류!! - 반환형이 다르더라도 중복 안됨! float sub(int, int);// 오류!! - 반환형이 다르더라도 중복 안됨!
48
예제
49
예제
50
디폴트 매개 변수 디폴트 매개 변수(default parameter): 인자를 전달하지 않아도 디폴트값을 대신 넣어주는 기능
void sub(double value = 1.0); // 함수 원형 정의시
51
주의할 점 디폴트 매개 변수는 뒤에서부터 앞쪽으로만 정의할 수 있다.
void sub(int p1, int p2, int p3=30);// OK! void sub(int p1, int p2=20, int p3=30);// OK! void sub(int p1=10, int p2=20, int p3=30);// OK! void sub(int p1, int p2=20, int p3);// 컴파일 오류! void sub(int p1=10, int p2, int p3=30);// 컴파일 오류!
52
예제 #include <iostream> using namespace std;
int calc_deposit(int salary=300, int month=12); int main() { cout << "0개의 디폴트 매개 변수 사용"<< endl; cout << calc_deposit(200, 6) << endl; cout << "1개의 디폴트 매개 변수 사용" << endl; cout << calc_deposit(200) << endl; cout << "2개의 디폴트 매개 변수 사용" << endl; cout << calc_deposit() << endl; return 0; } int calc_deposit(int salary, int month) return salary*month; 0개의 디폴트 매개 변수 사용 1200 1개의 디폴트 매개 변수 사용 2400 2개의 디폴트 매개 변수 사용 3600 계속하려면 아무 키나 누르십시오 . . .
53
인라인 함수 인라인 함수(inline function): 함수 호출을 하지 않고 코드를 복사하여서 넣는 것
54
예제 #include <iostream> using namespace std; // 실수값을 제곱하는 함수
inline double square(double i) { return i*i; } int main() cout << "2.0의 제곱은" << square(2.0) << endl; cout << "3.0의 제곱은" << square(3.0) << endl; return 0; 2.0의 제곱은 4 3.0의 제곱은 9 계속하려면 아무 키나 누르십시오 . . .
55
함수 매크로와의 차이점 함수 매크로는 기계적인 대치라서 잘못 사용될 수 있다. #define SQUARE(x) (x*x)
SQUARE(y++); //-> y++*y++로 확장되어서 y의 값이 2번 증가된다. 함수 매크로에서는 타입 검사를 할 수 없다.
56
중간 점검 문제 1. 다음의 함수 선언이 잘못된 이유를 설명하라.
int moveto(int x=0, int y, int z=0); 2. 다음과 같은 함수 선언을 가지는 함수 호출 중 잘못된 것은? int sub(int a, int b=100, int c=100); (a) sub(0, 0, 0); (b) sub(0); (c) sub() (d) sub(0, 0); 3. 다음은 중복 함수와 디폴트 매개 변수를 함께 사용한 함수 선언이다. 잠재적인 문제는 무엇인가? void print(char *s=NULL); void print(void);
57
변수의 범위 블록 안에서만 정의되는 변수는 지역 변수(local variable)
함수의 외부에서 선언되는 변수는 전역 변수(global variable)
58
지역 변수 지역 변수(local variable): 블록 안에서 선언되는 변수
59
어디서나 지역 변수 선언이 가능
60
전역 변수 전역 변수(global variable): 함수의 외부에 선언되는 변수
61
저장 유형 지정자 static #include <iostream> i: 1 s: 1
using namespace std; void sub(void) { int i = 0; static int s = 0; i++; s++; cout << "i: " << i << " s: " << s << endl; } int main() sub(); return 0; i: 1 s: 1 i: 1 s: 2 i: 1 s: 3 계속하려면 아무 키나 누르십시오 . . . static을 붙이면 지역 변수가 정적 변수로 된다.
62
중간 점검 문제 지역 변수를 블록의 중간에서 정의할 수 있는가?
똑같은 이름의 지역 변수가 서로 다른 함수 안에 정의될 수 있는가? 지역 변수가 선언된 블록이 종료되면 지역 변수는 어떻게 되는가? 지역 변수의 초기값은 얼마인가? 전역 변수는 어디에 선언되는가? 전역 변수의 생존 기간과 초기값은? 똑같은 이름의 전역 변수와 지역 변수가 동시에 존재하면 어떻게 되는가?
63
순환(recursion)이란? 알고리즘이나 함수가 수행 도중에 자기 자신을 다시 호출하여 문제를 해결하는 기법 팩토리얼의 정의
64
팩토리얼 예제 팩토리얼 프로그래밍 : 현재 작성중인 함수를 다시 호출하여 계산(순환 호출)
int factorial(int n) { if( n <= 1 ) return(1); else return (n * factorial(n-1) ); } 3!은? 3!를 계산하려면 3! = 3*2! 2!를 계산하려면 2! = 2*1! 1!은 1 3!는? 2!는? 1!는? 6 2 1
65
팩토리얼 구하기 #2 팩토리얼의 호출 순서 factorial(3) = 3 * factorial(2)
= 3 * 2 * 1 = 3 * 2 = 6 factorial(2) { if( 2 <= 1 ) return 1; else return (2 * factorial(2-1) ); } factorial(1) if( 1 <= 1 ) return 1; ..... ① ② ③ ④ factorial(3) if( 3 <= 1 ) return 1; else return (3 * factorial(3-1) );
66
순환 알고리즘의 구조 순환 알고리즘은 다음과 같은 부분들을 포함한다. 순환 호출을 하는 부분 순환 호출을 멈추는 부분
else return n * factorial(n-1); int factorial(int n) { 순환을 멈추는 부분 순환호출을 하는 부분 } if( n <= 1 ) return 1 만약 순환 호출을 멈추는 부분이 없다면?. 시스템 오류가 발생할 때까지 무한정 호출하게 된다.
67
Q & A
Similar presentations