금오공과대학교 C++ 프로그래밍 jhhwang@kumoh.ac.kr 컴퓨터공학과 황준하
4 강. 함수와라이브러리함수목차 함수오버로딩 디폴트매개변수 라이브러리함수 clock 함수 난수발생 비버퍼형문자입력 커서이동 프로그래밍문제 1 /21
4 강. 함수와라이브러리함수함수오버로딩 2 /21 함수오버로딩 동일한이름의함수를여러개만들수있음 함수프로파일이달라야함 함수프로파일 = 함수명 + 매개변수의개수 + 매개변수의타입 int Sum(int x, int y) cout << "int Sum" << endl; int z = x + y; return z; double Sum(double x, double y) cout << "double Sum" << endl; double z = x + y; return z; void main(void) cout << Sum(3, 4) << endl; cout << Sum(1.1, 2.2) << endl;
4 강. 함수와라이브러리함수함수오버로딩 사각형의면적, 원의면적을구하는함수 GetArea를각각만들고 main 함수와같이테스트해보라. 사각형의입력값 : 가로, 세로 원의입력각 : 반지름 모두 double 값으로처리하라. void main(void) cout << " 사각형면적 : " << GetArea(3, 4) << endl; cout << " 원면적 : " << GetArea(5) << endl; 3 /21
4 강. 함수와라이브러리함수함수오버로딩 프로그램확인 double GetArea(double Garo, double Sero) return (Garo * Sero); double GetArea(double Radius) return (3.14 * Radius * Radius); 4 /21
4 강. 함수와라이브러리함수디폴트매개변수 디폴트매개변수 대응되는매개변수의값이입력되지않을경우디폴트값 배정 마지막매개변수부터순차적으로디폴트값배정가능 int Sum(int Num1, int Num2, int Num3 = 1, int Num4 = 2, int Num5 = 3); void main(void) 값이넘어오지않을경우디폴트값 cout << Sum(1, 2) << endl; cout << Sum(1, 2, 3) << endl; cout << Sum(1, 2, 3, 4) << endl; cout << Sum(1, 2, 3, 4, 5) << endl; int Sum(int Num1, int Num2, int Num3, int Num4, int Num5) return (Num1 + Num2 + Num3 + Num4 + Num5); 5 /21
4 강. 함수와라이브러리함수디폴트매개변수 정수값 x의 y승을구하는 power 함수를만들어보라. 단, y 값이전달되지않을경우 x의 2승을반환하라. 디폴트매개변수를사용하여하나의함수만작성하라. void main(void) cout << "3의 2승 : " << power(3) << endl; cout << "3 의 4 승 : " << power(3, 4) << endl; 6 /21
4 강. 함수와라이브러리함수디폴트매개변수 프로그램확인 int power(int x, int y = 2) int result = 1; for (int i = 0; i < y; i++) result *= x; return result; 7 /21
4 강. 함수와라이브러리함수라이브러리함수 라이브러리 미리만들어놓은함수, 클래스의집합 C++ 프로그램제작 본인이직접함수와클래스작성 : 50% 미리준비되어있는라이브러리활용 : 50% C++ 표준라이브러리 C++ 표준에서기술되어있는라이브러리의집합 함수 클래스 템플릿등 8 /21
4 강. 함수와라이브러리함수라이브러리함수 여기서소개할라이브러리함수 함수명헤더파일용도 표준 / 비표준 clock <ctime> clock 기준경과시간표준 rand <cstdlib> 임의의난수발생표준 getch <conio.h> 비버퍼형문자입력비표준 SetConsoleCurs orposition <windows.h> 실행도스창의커서위치변경 비표준 9 /21
4 강. 함수와라이브러리함수라이브러리함수 clock 함수 프로그램실행시내부적인 clock 값이 0으로초기화됨 이값은초당일정횟수만큼 (CLOCKS_PER_SEC, 1000) 증가 특정시각사이의경과시간을알아오는활용 연습문제 1 부터 1 억까지의합을구하되계산소요시간을구해서출 력해보라. 합산시작시 clock 값 합산종료시 clock 값 10 /21
4 강. 함수와라이브러리함수라이브러리함수 프로그램확인 #include <iostream> #include <ctime> using namespace std; void main(void) clock_t time1 = clock(); cout << "time1 : " << time1 << endl; 현재 clock 수는 clock_t 타입 변수에저장 clock_t 는 int 와동일 int Sum = 0; for (int i = 1; i <= 100000000; i++) Sum += i; cout << " 합 : " << Sum << endl; 초단위시간간격구하기 11 /21 clock_t time2 = clock(); cout << "time2 : " << time2 << endl; cout << " 시간간격 : " << (double) (time2 - time1) / CLOCKS_PER_SEC << endl;
4 강. 함수와라이브러리함수라이브러리함수 rand 함수 : 임의의난수발생 난수의범위 : 0 ~ RAND_MAX (0x7FFF) srand 함수를통해난수발생기를초기화해야함 srand( 정수값 ) : 정수값이동일하면매번생성되는난수순서동일 정수값 : time(null) 함수사용 프로그램실행시마다다름 #include <iostream> #include <ctime> #include <cstdlib> using namespace std; void main(void) srand(time(null)); // time 함수 // srand, rand 함수 12 /21 for (int i = 0; i < 5; i++) cout << rand() << endl;
4 강. 함수와라이브러리함수라이브러리함수 가위, 바위, 보게임을만든다. 사용자는가위, 바위, 보중하나를선택하도록하고 컴퓨터는 rand 함수를사용하여무작위로내도록한다. 매번결과가다르도록 srand 함수를사용하라. 13 /21
4강. 함수와라이브러리함수 void main(void) srand(time(null)); int Com, Human; 라이브러리함수 프로그램확인 cout << " 가위 (0), 바위 (1), 보 (2) 입력 : "; cin >> Human; 14 /21 Com = rand() % 3; cout << " 저는 " << Com << " 을냈습니다." << endl; switch (Com) case 0 : if (Human == 0) cout << " 비겼습니다." << endl; else if (Human == 1) cout << " 당신이이겼습니다." << endl; else cout << " 제가이겼습니다." << endl; break; case 1 : // 생략 case 2 : // 생략
4 강. 함수와라이브러리함수라이브러리함수 getch 함수 : 비버퍼형문자입력 cin >> ch : 입력문자가화면에나타남. Enter 입력후실제실 행 ch = getch() : 입력문자가화면에나타나지않음. 바로실행 #include <iostream> #include <conio.h> using namespace std; void main(void) int ch; // getch 함수 while ((ch = getch())!= 'q') cout << (char) ch; 15 /21
4 강. 함수와라이브러리함수라이브러리함수 방향키를비롯하여현재입력한키가무엇인지알아내는함수 GetKey를만들기 게임프로그램제작시유용 void main(void) int ch; while ((ch = GetKey())!= KEY_ESC) switch (ch) case KEY_RIGHT : cout << "Key Right" << endl; break; case KEY_LEFT : cout << "Key Left" << endl; break; case KEY_UP : cout << "Key Up" << endl; break; case KEY_DOWN : cout << "Key Down" << endl; break; 16 /21
4 강. 함수와라이브러리함수라이브러리함수 방향키등특수키에해당하는키값을문자열상수로정의 ( 편의성 ) UP Key의경우키값이 72지만 72 값을갖는 H 문자와의혼동을피하기위해 256을더함 #include <iostream> #include <conio.h> // getch 함수 using namespace std; #define KEY_ESC 27 #define KEY_UP (256 + 72) #define KEY_DOWN (256 + 80) #define KEY_LEFT (256 + 75) #define KEY_RIGHT (256 + 77) int GetKey(void) int ch = getch(); 17 /21 방향키의경우 0 또는 224 라는값이 먼저입력된후해당방향키값이 입력됨 (2 자입력 ) if (ch == 0 ch == 224) ch = 256 + getch(); return ch;
4 강. 함수와라이브러리함수라이브러리함수 SetConsoleCursorPosition 함수 실행도스창의커서위치이동 디폴트크기 : (80, 25) 게임등동적인프로그램제작시유용 (0, 0) x #include <iostream> #include <windows.h> using namespace std; void main(void) 좌표를나타내는구조체 COORD Pos = 40, 12 ; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos); y (79, 24) cout << "*"; 모니터핸들 18 /21
4 강. 함수와라이브러리함수프로그래밍문제 0.5 초간격으로화면내의 ((0, 0)~(79, 24)) 임의의위 치에 * 가나타나도록만들어보라. 이전에있던 * 는삭제되어야한다. 19 /21
4 강. 함수와라이브러리함수프로그래밍문제 프로그램확인 #include <iostream> #include <cstdlib> #include <ctime> #include <windows.h> using namespace std; void GotoXY(int x, int y) // 커서위치이동 COORD Pos = x, y ; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos); 20 /21
4강. 함수와라이브러리함수프로그래밍문제 void main(void) srand(time(null)); clock_t time1 = clock(); clock_t time2; int x = -1, y = -1; 프로그램확인 while (true) time2 = clock(); if (((double) (time2 - time1) / CLOCKS_PER_SEC) > 0.5) if (x >= 0) // 현재위치삭제 GotoXY(x, y); cout << " "; x = rand() % 80; y = rand() % 25; GotoXY(x, y); 21 /21 cout << "*"; time1 = clock(); // 기준시간초기화