🥞 BE
home

4. 함수

Date
2022/04/19
Category
Programming Language
Tag
C++
Detail
함수란?
어떤 작업을 하기 위해 설계된 엔티티를 말함.
분할 처리디버깅의 효율성을 높이기 위해 사용됨.
함수 라이브러리를 통한 재사용으로 다양한 프로그램에서 활용 가능.
정의 구문
리턴_자료형 함수_이름 (매개변수_리스트) {
본문
}
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++
복사