제 3 장함수와문자열 1. 함수의기본적인개념을이해한다. 2. 인수와매개변수의개념을이해한다. 3. 함수의인수전달방법 2가지를이해한다 4. 중복함수를이해한다. 5. 디폴트매개변수를이해한다. 6. 문자열의구성을이해한다. 7. string 클래스의사용법을익힌다.
이번장에서만들어볼프로그램
함수란?
함수선언
함수호출
예제 #include <iostream> using namespace std; // 함수정의 int max(int x, int y) if (x>y) return x; else return y; int main() int n; n = max(2, 3); // 함수호출 cout << " 연산결과 = " << n << endl; return 0;
Lab: 함수만들기 정수의제곱값을구하는함수를만들어보자.
예제 #include <iostream> using namespace std; int square(int n) return(n*n); int main() int n; cout << " 제곱할정수를입력하시오 : "; cin >> n; cout << square(n) << endl; return 0;
함수원형정의 함수원형 (function prototype) 은함수의이름, 매개변수, 반환형을함수가정의되기전에미리한번써주는것이다. #include <stdio.h> int square(int n); int main() int result; result = square(5); printf("%d \n", result); int square(int n) return(n * n);
함수호출시인수전달방법 값으로호출하기 (call-by-value): 호출하는곳에서인수를전달할때인수의값이매개변수로복사되는방법이다. 참조로호출하기 (call-by-reference): 원본인수가함수에전달되는방법이다. 참조로호출하기 방식에서함수안에서매개변수는변경하면원본인수가변경된다.
값으로전달하기
참조로전달하기 참조자 (reference) 는변수의별명 int var = 10; int &ref = var;
Lab: swap() 함수만들기 swap(a, b) 와같이호출하면변수 a 와변수 b 의값을교환 int main() int a = 100, b = 200; printf("a=%d b=%d\n", a, b); swap(a, b); printf("a=%d b=%d\n", a, b); return 0;
Solution: #include <stdio.h> void swap(int& x, int& y) int tmp; tmp = x; x = y; y = tmp; int main() int a = 100, b = 200; printf("a=%d b=%d\n", a, b); swap(a, b); printf("a=%d b=%d\n", a, b); return 0;
중복함수 동일한이름의함수를여러개정의하는것을중복함수 (overloaded functions) 라고한다. // 정수값을제곱하는함수 int square(int i) return i*i; // 실수값을제곱하는함수 double square(double i) return i*i;
중복함수
예제 #include <iostream> using namespace std; int square(int i) cout << "square(int) 호출 " << endl; return i*i; double square(double i) cout << "square(double) 호출 " << endl; return i*i; int main() cout << square(10) << endl; cout << square(2.0) << endl; return 0;
Lab: 중복함수 정수, 실수, 문자를모두출력할수있는 print() 함수를중복함수로정의하고사용해보자.
예제 #include <iostream> using namespace std; void print(int i) cout << " 정수출력 : " << i << endl; void print(double f) cout << " 실수출력 : " << f << endl; void print(char c) cout << " 문자출력 : " << c << endl; int main() print(100); // 정수를출력하기위하여호출한다. print(3.14); // 정수를출력하기위하여호출한다. print('c'); // 문자를출력하기위하여호출한다. return 0;
디폴트인수 인수를전달하지않아도디폴트값을대신넣어주는기능을디폴트인수 (default argument) 라고한다. #include <iostream> using namespace std; // 문자 c 를 n 번반복하여화면에출력한다. void display(char c = '*', int n = 10) for (int i = 0; i < n; i++) cout << c; cout << endl;
#include <iostream> using namespace std; void display(char c = '*', int n = 10) for (int i = 0; i < n; i++) cout << c; cout << endl; int main() cout << " 아무런인수가전달되지않는경우 :\n"; display(); cout << "\n 첫번째인수만전달되는경우 :\n"; display('#'); cout << "\n 모든인수가전달되는경우 :\n"; display('#', 5); return 0;
실행결과
Lab: 디폴트매개변수실습하기 int main() cout << "sum(10, 15)=" << sum(10, 15) << endl; cout << "sum(10, 15, 25)=" << sum(10, 15, 25) << endl; cout << "sum(10, 15, 25, 30)=" << sum(10, 15, 25, 30) << endl; return 0;
예제 #include <iostream> using namespace std; int sum(int x, int y, int z = 0, int w = 0) return x + y + z + w; int main() cout << "sum(10, 15)=" << sum(10, 15) << endl; cout << "sum(10, 15, 25)=" << sum(10, 15, 25) << endl; cout << "sum(10, 15, 25, 30)=" << sum(10, 15, 25, 30) << endl; return 0;
인라인함수 함수이름앞에 inline 이붙으면컴파일러는함수를생성하지않고함수의코드를호출한곳에직접집어넣는다. // 실수값을제곱하는함수 inline double square(double i) return i*i;
문자열 string 클래스
string 객체 클래스와객체
string 클래스사용하기 #include <string> using namespace std; void main() string s; // string 객체 s 를생성한다. string s = "Hello World!"; // string 객체를생성하고초기화한다. string s "Hello World!" ; // string 객체를생성하고초기화한다.
문자열의결합 #include <string> using namespace std; void main() string subject = "Money"; string other = " has no value if it is not used"; string sentence = subject + other;
예제 #include <iostream> #include <string> using namespace std; int main() string s1 = "Slow", s2 = "steady"; string s3 = "the race."; string s4; s4 = s1 + " and " + s2 + " wins " + s3; cout << s4 << endl; return 0;
문자열의비교 #include <string> using namespace std; void main() string s1 = "Hello", s2 = "World"; if( s1 == s2 ) cout << " 동일한문자열입니다." << endl; else cout << " 동일한문자열이아닙니다." << endl; if( s1 > s2 ) cout << "s1 이앞이있습니다. " << endl; else cout << "s2 가앞이있습니다. " << endl;
예제 : 사용자로부터이름과주소를받아서친근하게인사하는프로그램을작성
예제 #include <iostream> #include <string> using namespace std; int main() string s1, addr; cout << " 이름을입력하시오 : "; cin >> s1; cin.ignore(); // 엔터키를없애기위하여필요하다. cout << " 주소를입력하시오 : "; getline(cin, addr); cout << addr << " 의 " << s1 << " 씨안녕하세요? " << endl; return 0;
string 클래스멤버함수사용
예제 문자열 "When in Rome, do as the Romans." 중에서 "Rome" 이몇번째위치에있는지를계산하는프로그램
예제 #include <iostream> #include <string> using namespace std; int main() string s="when in Rome, do as the Romans."; int index = s.find("rome"); cout << index << endl; return 0;
예제 사용자가입력한주민등록번호에서 - 문자를삭제하는프로그램을작성하여보자.
string 객체에서문자추출하기 #include <iostream> #include <string> using namespace std; int main() string s; cout << " 주민등록번호를입력하시오 : "; cin >> s; cout << "- 가제거된주민등록번호 : "; for (auto& c : s) if (c == '-') continue; cout << c; cout << endl; return 0;
문자열의배열 #include <iostream> #include <string> using namespace std; int main() string list[] = " 철수 ", " 영희 ", " 길동 " ; for (auto& x : list) cout << (x + " 야안녕!") << endl; return 0;
Lab: 해밍거리구하기 유전자를나타내는 2 개의문자열을받아서동일한위치에틀린글자가몇개나있는지를계산하는프로그램을작성해보자. 이것을해밍거리 (Hamming distance) 라고한다
#include <iostream> #include <string> using namespace std; string 객체에서문자추출하기 int main() string s1, s2; int count = 0; cout << "DNA1: "; cin >> s1; cout << "DNA2: "; cin >> s2; if (s1.length()!= s2.length()) cout << " 오류 : 길이가다름 " << endl; else for (int i = 0; i < s1.length(); i++) if (s1[i]!= s2[i]) count += 1; cout << " 해밍거리는 " << count << endl; return 0;
Lab: 행맨
solution #include <iostream> #include <string> using namespace std; int main() char ch; string solution; string list[] = "the", "c++", "programming", "language", ;
int n = rand() % 4; solution = list[n]; string 객체에서문자추출하기 string guess(solution.length(), '_'); while (true) cout << guess << endl; cout << " 글자를입력하시오 : "; cin >> ch; for (int i=0;i< solution.length();i++) if (ch == solution[i]) guess[i] = ch; if (solution == guess) cout << solution << endl; cout << " 성공하였습니다.!"; break; return 0;
Q & A