Transcript 다운받기
C++ Espresso
제2장 제어문과 함수
© 2009 인피니티북스 All rights reserved
이번 장에서 학습할 내용
•조건문
•반복문
•break, continue
•함수 개념
•함수 정의
•함수 원형
•매개 변수
•순환 호출
© 2010 인피니티북스 All rights reserved
이번 장에서는
제어 구조와
함수에 대하여
살펴봅니다.
제어문
조건에
따라서
여러 개의
실행 경로
가운데
하나를
선택
문장이
실행되는
순서에
영향을
주는 문장
조건에
따라서
여러 개의
같은
처리를
반복
© 2010 인피니티북스 All rights reserved
if-else 문
날씨가 좋은가?
거짓
참
테니스를 친다.
if( 조건식 )
문장1;
else
문장2;
© 2010 인피니티북스 All rights reserved
공부를 한다.
조건식이 참이면 실행된다.
조건식이 거짓이면 실행된다.
If-else 문
if ( score >= 60 )
cout << "합격입니다.\n";
else
cout << "불합격입니다.\n";
if ( score >= 60 )
{
cout << "합격입니다.\n";
cout << "장학금도 받을 수 있습니다.\n";
}
else
{
cout << "불합격입니다.\n";
cout << "공부하세요.\n";
}
© 2010 인피니티북스 All rights reserved
score가 60이상이면 실행
score가 60미만이면 실행
score가 60이상이면 실행
score가 60미만이면 실행
예제 #1
#include <iostream>
using namespace std;
int main() {
int x, y;
cout << "x값을 입력하시오: "; // 입력 안내 출력
cin >> x;
cout << "y값을 입력하시오: "; // 입력 안내 출력
cin >> y;
if (x > y)
else
}
return 0;
cout << "x가 y보다 큽니다. " << endl;
cout << "y가 x보다 큽니다. " << endl;
x값을 입력하시오: 10
y값을 입력하시오: 20
y가 x보다 큽니다.
© 2010 인피니티북스 All rights reserved
중첩 if-else 문
if 문에 다시 if 문이 포함
if( 조건식1 )
if( 조건식2 )
문장;
© 2010 인피니티북스 All rights reserved
중첩 if-else 문
if( score >= 80 )
if( score >= 90 )
cout << "당신의 학점은 A입니다.\n";
else
cout << "당신의 학점은 B입니다.\n";
If 문안의 문장자리에 if-else
문이 들어간 경우
© 2010 인피니티북스 All rights reserved
if와 else의 매칭 문제
else 절은 가장 가까
운 if절과 매치된다.
if(score >= 80)
if( score >= 90)
cout << “당신의 학점은 A입니다\n”;
O
X
else
cout << “당신의 학점은 B입니다\n”;
프로그래밍 지침:
애매하면 { … } 로 묶어서 명확하게 처리
© 2010 인피니티북스 All rights reserved
if와 else의 매칭 문제
만약 다른 if절과 else
if( score >= 80 )
절을 매치시키려면
{
중괄호를 사용하여
블록으로 묶는다.
if( score >= 90 )
cout << "당신의 학점은 A입니다.\n";
}
else
cout << "당신의 학점은 A나 B가 아닙니다.\n";
© 2010 인피니티북스 All rights reserved
예제 #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
성인입니다.
© 2010 인피니티북스 All rights reserved
참고사항
C++에서는 다음과 같이 if-else 문장 안에서 변수 선언도 가능하다.
if( int condition=get_status() ) { ... }
프로그래밍 지침:
가능하면 이해하기 쉬운 방법으로 표현
© 2010 인피니티북스 All rights reserved
switch 문
여러가지 경우 중에서 하나를 선택하는데 사용
0
number
1
2
기타
© 2010 인피니티북스 All rights reserved
예제
int main()
{
int number;
cout << "정수를 입력하시오:";
cin >> number;
switch(number)
{
case 0:
cout << "없음\n";
break ;
case 1:
cout << "하나\n";
break ;
case 2:
cout << "둘\n";
break ;
default:
cout << "많음\n";
break;
}
© }2010 인피니티북스 All rights reserved
정수를 입력하시오: 1
하나
예제
© 2010 인피니티북스 All rights reserved
예제
© 2010 인피니티북스 All rights reserved
반복문의 종류
© 2010 인피니티북스 All rights reserved
while 문
주어진 조건이 만족되는 동안 문장들을 반복 실행한다.
while( 조건식 )
문장;
© 2010 인피니티북스 All rights reserved
예제
// 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;
}
© 2010 인피니티북스 All rights reserved
구구단 중에서 출력하고 싶은 단을 입력하시오: 9
9*1 = 9
9*2 = 18
9*3 = 27
....
9*9 = 81
do...while문
반복 조건을 루프의 끝에서 검사
do
문장
while(조건)
© 2010 인피니티북스 All rights reserved
예제
int main()
{
int i = 10;
do {
cout <<"i의 값: " << i << endl;
i++;
} while (i <3);
}
i의 값: 10
© 2010 인피니티북스 All rights reserved
게임 예제
// 반복을 이용한 게임 프로그램
#include <iostream>
using namespace std;
int main()
{
정답을 추측하여 보시오: 10
제시한 정수가 낮습니다.
정답을 추측하여 보시오: 30
제시한 정수가 낮습니다.
// 정답 정답을 추측하여 보시오: 60
제시한 정수가 높습니다.
정답을 추측하여 보시오: 59
축하합니다. 시도횟수=4
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;
© 2010 인피니티북스 All rights reserved
break 문과 continue 문
break 문은 반복 루프를 빠져 나오는데 사용된다. (switch 문에도)
continue 문은 현재 수행하고 있는 반복 과정의 나머지를 건너뛰고
다음 반복 과정을 강제적으로 시작
© 2010 인피니티북스 All rights reserved
예제
© 2010 인피니티북스 All rights reserved
예제
© 2010 인피니티북스 All rights reserved
for 문
정해진 횟수만큼 반복하는 구조
© 2010 인피니티북스 All rights reserved
for 문의 구조
for ( 초기화; 조건식; 증감식)
문장;
① 초기화를 실행한다.
② 반복 조건을 나타내는 조건식을 계산한다.
③ 수식의 값이 거짓이면 for 문의 실행이 종
료된다.
④ 수식의 값이 참이면 문장이 실행된다.
⑤ 증감을 실행하고 ②로 돌아간다.
© 2010 인피니티북스 All rights reserved
예제
© 2010 인피니티북스 All rights reserved
예제
#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!은
3628800입니다.
© 2010
인피니티북스
All rights reserved
함수의 개념
함수(function): 특정한 작업을 수행하는 독립적인 부분
함수 호출(function call): 함수를 호출하여 사용하는 것
함수는 입력을 받으며 출력을 생성한다.
© 2010 인피니티북스 All rights reserved
함수의 구조
© 2010 인피니티북스 All rights reserved
반환형
C언어에서는 만약 반환형을 명시하지 않으면 int 형을 가정하였다.
하지만 C++에서는 반드시 반환형을 명시하여야 한다.
만약 값을 반환하지 않는다면 void라고 표시한다.
반드시 반환형을
표시해야 함
get_max(int x, int y)
{
if( x > y ) return(x);
else return(y);
}
© 2010 인피니티북스 All rights reserved
함수 정의 예제
함수를 프로그램을 이루는 부품이라고 가정하자.
입력을 받아서 작업한 후에 결과를 생성한다.
© 2010 인피니티북스 All rights reserved
예제 #1
정수의 제곱값을 계산하는 함수
반환값: int
함수 이름: square
매개 변수: int n
int square(int n)
{
return(n*n);
}
© 2010 인피니티북스 All rights reserved
예제 #2
두개의 정수중에서 큰 수를 계산하는 함수
반환값: int
함수 이름: get_max
매개 변수: int x, int y
int get_max(int x, int y)
{
if( x > y ) return(x);
else return(y);
}
© 2010 인피니티북스 All rights reserved
인수와 매개 변수
인수(argument): 실인수, 실매개 변수라고도 한다.
매개 변수(parameter): 형식 인수, 형식 매개 변수라고도 한다.
© 2010 인피니티북스 All rights reserved
반환값
반환값(return value): 호출된 함수가 호출한 곳으로 작업의 결과값
을 전달하는 것
인수는 여러 개가 가능하나 반환값은 하나만 가능
return 0;
return(0);
return x;
return x+y;
return x*x+2*x+1;
© 2010 인피니티북스 All rights reserved
함수 원형
함수 원형(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);
} 2010 인피니티북스 All rights reserved
©
// 함수 원형
함수 원형
// 함수 호출
// 함수 정의
중복 함수
중복 함수(overloading functions):
같은 이름을 가지는 함수를 여러 개 정의하는 것
// 정수값을 제곱하는 함수
int square(int i)
{
return i*i;
}
// 실수값을 제곱하는 함수
double square(double i)
{
return i*i;
}
프로그래밍 지침:
꼭 필요한 경우가 아니면 이름을 달리한다.
© 2010 인피니티북스 All rights reserved
예제
© 2010 인피니티북스 All rights reserved
중복 함수의 장점
중복 함수를 사용하지 않은 경우:
square_int(int int);
square_double(double int);
square_short(short int);
중복 함수를 사용하는 경우
square(int int);
square(double int);
square(short int);
© 2010 인피니티북스 All rights reserved
함수 이름의 재사용이 가능
주의할 점
int sub(int);
int sub(int, int);// 중복 가능!
int sub(int, double);// 중복 가능!
double sub(double);// 중복 가능!
double sub(int);// 오류!! - 반환형이 다르더라도 중복 안됨!
float sub(int, int);// 오류!! - 반환형이 다르더라도 중복 안됨!
Signature가 다르면 중복 가능
Signature: 매개변수의 “형, 개수, 순서”로 구별
동일 signature: 동일한 개수의 매개변수가 동일한 순서로 형이 지정
된 경우
© 2010 인피니티북스 All rights reserved
예제
© 2010 인피니티북스 All rights reserved
예제
© 2010 인피니티북스 All rights reserved
디폴트 매개 변수
디폴트 매개 변수(default parameter): 인자를 전달하지 않아도 디폴
트값을 대신 넣어주는 기능
void sub(double value = 1.0);
© 2010 인피니티북스 All rights reserved
// 함수 원형 정의시
주의할 점
디폴트 매개 변수는 뒤에서부터 앞쪽으로만 정의할 수 있다.
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);// 컴파일 오류!
sub(88, 99) sub(10, 88, 99) / sub(88, 99, 30) ???
© 2010 인피니티북스 All rights reserved
예제
#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;
}
© 2010 인피니티북스 All rights reserved
0개의 디폴트 매개 변수 사용
1200
1개의 디폴트 매개 변수 사용
2400
2개의 디폴트 매개 변수 사용
3600
계속하려면 아무 키나 누르십시오 . . .
인라인 함수
인라인 함수(inline function):
함수 호출을 하지 않고 코드를 복사하여서 넣는 것
© 2010 인피니티북스 All rights reserved
예제
#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
계속하려면 아무 키나 누르십시오 . . .
© 2010 인피니티북스 All rights reserved
함수 매크로와의 차이점
함수 매크로는 기계적인 대치라서 잘못 사용될 수 있다.
#define SQUARE(x) (x*x)
SQUARE(y++); //-> y++*y++로 확장되어서 y의 값이 2번 증가된다.
함수 매크로에서는 타입 검사를 할 수 없다.
© 2010 인피니티북스 All rights reserved
변수의 범위
블록 안에서만 정의되는 변수는 지역 변수(local variable)
함수의 외부에서 선언되는 변수는 전역 변수(global variable)
© 2010 인피니티북스 All rights reserved
지역 변수
지역 변수(local variable): 블록 안에서 선언되는 변수
© 2010 인피니티북스 All rights reserved
어디서나 지역 변수 선언이 가능
© 2010 인피니티북스 All rights reserved
전역 변수
전역 변수(global variable): 함수의 외부에 선언되는 변수
© 2010 인피니티북스 All rights reserved
저장 유형 지정자 static
#include <iostream>
using namespace std;
void sub(void)
{
int i = 0;
static int s = 0;
}
int main()
{
}
i: 1 s: 1
i: 1 s: 2
i: 1 s: 3
계속하려면 아무 키나 누르십시오 .
i++;
s++;
cout << "i: " << i << " s: " << s << endl;
sub();
sub();
sub();
return 0;
© 2010 인피니티북스 All rights reserved
static을 붙이면 지역 변수가
정적 변수로 된다.
순환(recursion)이란?
알고리즘이나 함수가 수행 도중에 자기 자신을 다시 호출하여 문제를 해
결하는 기법
팩토리얼의 정의
1
n!
n * (n 1)!
© 2010 인피니티북스 All rights reserved
n 1
n2
팩토리얼 예제
팩토리얼 프로그래밍 : 현재 작성중인 함수를 다시 호출하여 계산(순환
호출)
int factorial(int n)
{
if( n <= 1 ) return(1);
else return (n * factorial(n-1) );
}
3!은?
2!를
계산하려
면
2! = 2*1!
3!를
계산하려면
3! = 3*2!
3!는?
2!는?
6
2
© 2010 인피니티북스 All rights reserved
1!는?
1
1!은
1
팩토리얼 구하기 #2
팩토리얼의 호출 순서
factorial(3) = 3 * factorial(2)
= 3 * 2 * factorial(1)
=3*2*1
=3*2
=6
④
③
factorial(3)
{
if( 3 <= 1 ) return 1;
else return (3 * factorial(3-1) );
}
factorial(2)
{
if( 2 <= 1 ) return 1;
else return (2 * factorial(2-1) );
}
factorial(1)
{
if( 1 <= 1 ) return 1;
.....
}
© 2010 인피니티북스 All rights reserved
①
②
순환 알고리즘의 구조
순환 알고리즘은 다음과 같은 부분들을 포함한다.
순환 호출을 하는 부분
순환 호출을 멈추는 부분
int factorial(int n)
{
if( n <= 1 )
return 1
else return n * factorial(n-1);
순환을 멈추는 부분
순환호출을 하는 부분
}
만약 순환 호출을 멈추는 부분이 없다면?.
시스템 오류가 발생할 때까지 무한정 호출하게 된다.
© 2010 인피니티북스 All rights reserved