•
함수란?
어떤 작업을 하기 위해 설계된 엔티티를 말함.
분할 처리와 디버깅의 효율성을 높이기 위해 사용됨.
함수 라이브러리를 통한 재사용으로 다양한 프로그램에서 활용 가능.
•
정의 구문
리턴_자료형 함수_이름 (매개변수_리스트) {
본문
}
•
argument와 parameter
parameter는 함수 정의에 있는 변수 선언을 뜻함.
argument는 함수 호출에서 매개변수를 초기화하는 값을 뜻함.
•
함수 사용 예제
#include <iostream>
using namespace std;
// 함수 정의
int larger(int first, int second) { // first, second - parameter
int temp;
if (first > second) {
temp = first;
}
else {
temp = second;
}
return temp;
}
int main() {
// 함수 호출
cout << larger(3, 13) << endl; // 3, 13 - argument
cout << larger(10, 12) << endl;
cout << larger(2, 12) << endl;
return 0;
}
C++
복사
•
숫자 관련 함수
#include <iostream>
#include <cmath>
using namespace std;
int main(){
// 절대값 abs
cout << "abs (8) = " << abs(8) << endl;
cout << "abs (-8) = " << abs(-8) << endl;
// 가장 가까운 floor, ceil
cout << "floor (12.78) = " << floor(12.78) << endl;
cout << "ceil (12.78) = " << ceil(12.78) << endl;
// log, log10
cout << "log (100) = " << log(100) << endl;
cout << "log10 (100) = " << log10(100) << endl;
// exp, pow
cout << "exp (5) = " << exp(5) << endl;
cout << "pow (2, 3) = " << pow(2, 3) << endl;
// x의 루트 sqrt
cout << "sqrt (100) = " << sqrt(100) << endl;
return 0;
}
C++
복사
•
문자 관련 함수
#include <iostream>
#include <cctype>
using namespace std;
int main(){
// 변수 선언
char ch;
int count = 0;
// 입력, 처리
while (cin >> noskipws >> ch) {
if (isalpha(ch)) {
count++;
}
ch = toupper(ch);
cout << ch;
}
// 글자 개수 출력
cout << "알파벳의 문자의 개수 = " << count;
return 0;
}
C++
복사
•
시간 함수
#include <iostream>
#include <ctime>
using namespace std;
int main(){
// 경과한 초 단위 시간과 현재 초 찾기
long elapsedSeconds = time(0);
int currentSecond = elapsedSeconds % 60;
// 경과한 분 단위 시간과 현재 분 찾기
long elapsedMinutes = elapsedSeconds / 60;
int currentMinute = elapsedMinutes % 60;
// 경과한 시간과 시 단위 시간 찾기
long elapsedHours = elapsedMinutes / 60;
int currentHour = elapsedHours % 24;
// 현재 시간을 출력
cout << "현재 시간: " << currentHour << " : " << currentMinute << " : " << currentSecond << endl;
return 0;
}
C++
복사
•
숫자 추측 게임
랜덤 시드를 주고, 정해진 횟수와 범위 내에서 숫자를 추측하는 업다운 게임.
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main(){
// 선언과 초기화
int low = 5;
int high = 15;
int tryLimit = 5;
int guess;
// 랜덤 숫자 생성
srand(time(0));
int temp = rand();
int num = temp % (high - low + 1) + low; // 범위 확대, 축소
// 추측을 위한 반복
int counter = 1;
bool found = false;
while (counter <= tryLimit && !found) {
do {
cout << "1~15 사이의 정수를 입력하세요: ";
cin >> guess;
} while (guess < 1 || guess > 15);
if (guess == num) {
found = true;
}
else if (guess > num) {
cout << "더 작은 숫자입니다." << endl;
}
else {
cout << "더 큰 숫자입니다." << endl;
}
counter++;
}
// 추측에 성공한 경우
if (found) {
cout << "축하합니다. 추측에 성공했습니다." << endl;
cout << "답 = " << num;
}
// 추측에 실패한 경우
else {
cout << "아쉽게 추측에 실패했습니다." << endl;
cout << "답 = " << num;
}
return 0;
}
C++
복사
•
사용자 정의 함수
(a) 매개변수가 없는 void 함수
(b) 매개변수가 있는 void 함수
(c) 매개변수가 없지만 리턴 값이 있는 함수
(d) 매개변수와 리턴 값이 있는 함수
•
매개변수가 있는 void 함수
#include <iostream>
using namespace std;
void pattern(int size) {
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
cout << "*";
}
cout << endl;
}
return;
}
int main(){
int patternsize;
do {
cout << "패턴의 크기를 입력: ";
cin >> patternsize;
} while (patternsize <= 0);
pattern(patternsize);
return 0;
}
C++
복사
•
매개변수가 없지만 리턴 값이 있는 함수
#include <iostream>
using namespace std;
void pattern(int size) {
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
cout << "*";
}
cout << endl;
}
return;
}
int main(){
int patternsize;
do {
cout << "패턴의 크기를 입력: ";
cin >> patternsize;
} while (patternsize <= 0);
pattern(patternsize);
return 0;
}
C++
복사
•
매개변수와 리턴 값이 있는 함수
#include <iostream>
using namespace std;
int larger(int fst, int snd) {
int max;
if (fst > snd) {
max = fst;
}
else {
max = snd;
}
return max;
}
int main() {
int first, second;
do {
cout << "첫 번째 숫자를 입력하세요: ";
cin >> first;
cout << "두 번째 숫자를 입력하세요: ";
cin >> second;
} while (first <= 0 || second <= 0);
cout << "larger = " << larger(first, second) << endl;
return 0;
}
C++
복사
•
윤년인지 확인하기
#include <iostream>
using namespace std;
// 함수 정의 (prototypes)
int input();
bool process(int year);
void output(int year, bool result);
int main() {
int year = input();
bool result = process(year);
output(year, result);
}
// 입력 함수
int input() {
int year;
do {
cout << "1582년 이후의 년도를 입력 : ";
cin >> year;
} while (year <= 1582);
return year;
}
// 처리 함수
bool process(int year) {
bool criteria1 = (year % 4 == 0);
bool criteria2 = (year % 100 != 0) || (year % 400 == 0);
return (criteria1) && (criteria2);
}
// 출력 함수
void output(int year, bool result) {
if (result) {
cout << year << " 년은 윤년입니다." << endl;
}
else {
cout << year << " 년은 윤년이 아닙니다." << endl;
}
return;
}
C++
복사
•
자료 전달
(a) 값으로 전달 (pass-by-value)
(b) 참조로 전달 (pass-by-reference)
(c) 포인터로 전달 (pass-by-pointer)
•
pass-by-value
#include <iostream>
using namespace std;
void fun(int y);
int main() {
int x = 10;
fun(x);
cout << "Value of x in main: " << x << endl;
return 0;
}
void fun(int y) {
y++;
cout << "Value of y in fun: " << y << endl;
return;
}
C++
복사
•
pass-by-reference
#include <iostream>
using namespace std;
void fun(int& y);
int main() {
int x = 10;
fun(x);
cout << "Value of x in main: " << x << endl;
return 0;
}
void fun(int& y) {
y++;
cout << "Value of y in fun: " << y << endl;
return;
}
C++
복사
•
변수 스왑
자주 사용되는 temp로 교환하는 방식.
#include <iostream>
using namespace std;
void swap(int& a, int& b);
int main() {
int n1, n2;
cout << "n1 입력: ";
cin >> n1;
cout << "n2 입력: ";
cin >> n2;
swap(n1, n2);
cout << "--- 스왑 결과 ---" << endl;
cout << "Value of n1 = " << n1 << endl;
cout << "Value of n2 = " << n2 << endl;
return 0;
}
void swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
return;
}
C++
복사
•
자료 리턴
(a) 값으로 리턴 (return-by-value)
(b) 참조로 리턴 (return-by-reference)
(c) 포인터로 리턴 (return-by-pointer)
•
점수를 기반으로 등급 계산
#include <iostream>
using namespace std;
int getScore();
char findGrade(int score);
void printResult(int score, char grade);
int main() {
int score;
char grade;
score = getScore();
grade = findGrade(score);
printResult(score, grade);
return 0;
}
int getScore() {
int score;
do {
cout << "0~100 사이의 값 입력: ";
cin >> score;
} while (score < 0 || score>100);
return score;
}
char findGrade(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';
}
return grade;
}
void printResult(int score, char grade) {
cout << "시험 결과." << endl << "점수: 100점 중 " << score << "점" << endl << "등급: " << grade;
}
C++
복사
•
함수 오버 로딩
매개변수(매개변수의 자료형, 개수, 순서) 가 다르다면 이름이 같은 함수를 2개 정의할 수 있음.
이를 함수 오버 로딩(function overloading)이라 함.
프로그램이 같은 이름의 함수를 사용할 때, 함수들을 구분하기 위해 사용하는 기준을 함수 시그니처라고 부름. 함수 시그니처는 매개변수들의 자료형과 조합. (자료형과 이름 모두 같아야 함)
•
스코프
스코프는 어떤 엔티티(상수, 변수, 객체, 함수 등)를 사용할 수 있는 범위를 나타냄.
지역 스코프, 전역 스코프가 있음.
•
범위 해결 연산자 (Scope Resolution Operator)
지역 엔티티가 전역 객체를 가리는 셰도잉을 무시하고, 전역 엔티티에 접근해야 하는 경우도 있음.
(a) 피연산자가 하나인 경우 -> :: 이름
(b) 피연산자가 두 개인 경우 -> 스코프 :: 이름
•
정기 예금의 미래 가치 찾기
미래 가치 = 투자한 가치 * (1 + 이율)기간
이때, 이율(rate)은 한 주기의 이율이고, 기간(term)은 그 기간의 반복 횟수를 나타냄.
요소기간은 기간만큼 흐른 뒤의 가치. 경제학 용어로 승수(multiplier)라고 부름.
정리하면,
요소 = (1 + 이율)
승수 = 요소기간
미래 가치 = 투자한 가치 * 승수
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
// invest:투자한 가치 , rate:한 주기의 이율, term:그 기간의 반복 횟수
// multiplier:요소기간(승수), futureValue:미래가치
// top-level 함수 정의
void input(double& invest, double& rate, double& term);
void process(double invest, double rate, double term, double& multiplier, double& futureValue);
void output(double invest, double rate, double term, double multiplier, double futureValue);
// low-level 함수 정의
double getInput(string message);
double findMultiplier(double rate, double period);
void printData(double invest, double rate, double term);
void printResult(double multiplier, double value);
int main() {
// 변수 선언
double invest, rate, term; // input을 위한 변수
double multiplier, futureValue; // 결과를 위한 변수
// 첫번째 레벨 함수 호출
input(invest, rate, term);
process(invest, rate, term, multiplier, futureValue);
output(invest, rate, term, multiplier, futureValue);
return 0;
}
void input(double& invest, double& rate, double& term) {
invest = getInput("Enter the value of investment: ");
rate = getInput("Enter the interest rate per year: ");
term = getInput("Enter the term (number of years): ");
}
void process(double invest, double rate, double term, double& multiplier, double& futureValue) {
multiplier = findMultiplier(rate, term);
futureValue = multiplier * invest;
}
void output(double invest, double rate, double term, double multiplier, double futureValue) {
printData(invest, rate, term);
printResult(multiplier, futureValue);
}
double getInput(string message) {
double input;
do {
cout << message;
cin >> input;
} while (input < 0.0);
return input;
}
double findMultiplier(double rate, double term) {
double factor = 1 + rate / 100;
return pow(factor, term);
}
void printData(double invest, double rate, double term) {
cout << endl << "Information about investment" << endl;
cout << "Investment: " << fixed << setprecision(2) << invest << endl;
cout << "Interest rate: " << rate << fixed << setprecision(2);
cout << " percent per year" << endl;
cout << "Term: " << term << " years" << endl << endl;
}
void printResult(double multiplier, double futureValue) {
cout << "Investment is multilied by: " << fixed << setprecision(8);
cout << multiplier << endl;
cout << "Future value: " << fixed << setprecision(2);
cout << futureValue << endl;
}
C++
복사
•
정기 적금의 미래 가치 찾기
매 주기 특정 일에 금액을 계속해서 넣고, 만기 때에 원금과 이자를 받는 정기 적금.
투자금을 넣었을 때부터 넣은 만큼만 복리로 불어난다고 가정함.
승수 = (1+인수)n + (1+인수)n-1 + ... + (1+인수)1
위와 같이 이전 프로그램에서 승수를 변경하기만 하면, 정기 적금의 미래 가치를 구할 수 있음.
#include <iostream>
#include <iomanip>
#include <cmath>
#include <string>
using namespace std;
// invest:투자한 가치 , rate:한 주기의 이율, term:그 기간의 반복 횟수
// multiplier:요소기간(승수), futureValue:미래가치
// top-level 함수 정의
void input(double& invest, double& rate, double& term);
void process(double invest, double rate, double term, double& multiplier, double& futureValue);
void output(double invest, double rate, double term, double multiplier, double futureValue);
// low-level 함수 정의
double getInput(string message);
double findMultiplier(double rate, double period);
void printData(double invest, double rate, double term);
void printResult(double multiplier, double value);
int main() {
// 변수 선언
double invest, rate, term; // input을 위한 변수
double multiplier, futureValue; // 결과를 위한 변수
// 첫번째 레벨 함수 호출
input(invest, rate, term);
process(invest, rate, term, multiplier, futureValue);
output(invest, rate, term, multiplier, futureValue);
return 0;
}
void input(double& invest, double& rate, double& term) {
invest = getInput("Enter the value of periodic investment: ");
rate = getInput("Enter the interest rate per year: ");
term = getInput("Enter the term (number of years): ");
}
void process(double invest, double rate, double term, double& multiplier, double& futureValue) {
multiplier = findMultiplier(rate, term);
futureValue = multiplier * invest;
}
void output(double invest, double rate, double term, double multiplier, double futureValue) {
printData(invest, rate, term);
printResult(multiplier, futureValue);
}
double getInput(string message) {
double input;
do {
cout << message;
cin >> input;
} while (input < 0.0);
return input;
}
double findMultiplier(double rate, double term) {
double multiplier = 0;
double factor = 1 + rate / 100;
for (int i = term; i > 0; i--) {
multiplier += pow(factor, i);
}
return multiplier;
}
void printData(double invest, double rate, double term) {
cout << endl << "Information about period investment" << endl;
cout << "Periodic Investment: " << fixed << setprecision(2) << invest << endl;
cout << "Interest rate: " << rate << fixed << setprecision(2);
cout << " percent per year" << endl;
cout << "Term: " << term << " years" << endl << endl;
}
void printResult(double multiplier, double futureValue) {
cout << "Result of investment" << endl;
cout << "Investment is multilied by: " << fixed << setprecision(8);
cout << multiplier << endl;
cout << "Future value: " << fixed << setprecision(2);
cout << futureValue << endl;
}
C++
복사