학교복습용/객체1

(3) 함수(function)

브로콜리여사 2022. 12. 29. 10:22
라이브러리 함수

(1) <cmath>

abs(-8) = 8 //절댓값 출력

floor(12.78) = 12 // 소수점 버림

ceil (12.78) = 13 // 소수점 올림

log(100) = 4.605

log10(100) = 10

exp (5) = e의 5제곱

pow(2, 3) = 8 // 2의 3제곱

sqrt(100) = 10 // 루트 100

 

 

(2) <ctime>

time(0) : 진짜 난수를 생성하기 위해 필요하다!

 

(3) <cstdlib>

stdlib.h (cstdlib) C 표준 유틸리티 함수들을 모아놓은 헤더파일. 이 헤더파일에는 프로그래밍시에 범용적으로 사용되는 여러가지 함수들을 모아 놓고 있는데,

예를 들면 동적 할당 관련 함수, 난수 생성 함수, 정수의 연산 함수, 검색 및 정렬 함수 등 이다.

 

random number

#include <iostream>

#include <cstdlib>       // rand()함수를 사용하기 위해 필요하다.

using namespace std;

 

int main(){

unsigned int num = 0;

cout << "Enter num: ";

cin >> num;

srand(num);

 

for (int i = 1 ; i <= 10 ; i++){

    cout << setw(10) << (1 + rand() % 6) ;      // 뛰어쓰기 10칸 하고 1~6까지의 수 중 아무거나 출력~~

    if (i % 5 == 0) {

         cout << endl;    // 한 줄에 5개 씩만!

    }

}

 

}

 

 

#include <iostream>
#include <iomanip>
#include <ctime> // srand(time(0))을 사용하기 위해서
using namespace std;

int main() {
int low{5};
int high{ 15 };
int tryLimit = 5; // 최대 5번 까지 시도 가능!
int guess;

srand(time(0));     // 난수생성하는데 할 때마다 결과 다르게 나오게
int temp = rand(); //일단 난수 생성, 꼭 따로 따로 써야한다.
int num = temp % (high - low + 1) + low; // 숫자 범위는 최소값보단 크고, (5- 15 + 1 )로 나눈것 중에!

bool found = false; //못찾았으니깐 일단 false상태

for (int i = 1; i <= tryLimit && !found; i++) {
do {
cout << "5 - 15 사이의 숫자를 입력하세요 : ";
cin >> guess;
} while (guess < 5 || guess > 15);


if (num == guess) {
found = true;
}
else if (num > guess) {
cout << "더 작은 숫자 입니다." << endl;
}
else {
cout << "더 큰 숫자 입니다." << endl;
}
}

if (found) {
cout << "축하합니다. 추측에 성공했습니다."<< endl;
cout << "답 = " << num;
}
else {
cout << "아쉽게 추측에 실패했습니다. " << endl;
cout << "답 = " << num;
}
}

함수 (function)

: 하나의 특정 작업을 수행하기 위해 설계된 코드의 집합, 헤더와 문장(body)으로 구성

: 프로그램을 여러 기능적 요소로 분할할 수 있게 한다. (모듈화)

: 함수는 단 한 번 작성 됨. (프로그램의 여러 곳에서 여러 번 사용 가능, 다른 프로그램에서 재사용 가능)

 

int (리턴 자료형) sum (함수이름) (int sum1, int sum2) (매개변수리스트) {

return sum1 + sum2; (본문)

}

 

함수

1. 함수정의

// body를 포함하여 함수를 설계하는 것

2. 함수선언 (function prototype)

//헤더만 포함된 구문, 컴파일러에게 미리 함수의 형태를 알린다. int sum(int num1, int num2)

3. 함수호출

// int a = sum(5, 16)

 

함수의 장점 

1. 분할처리 , 2.디버그(오류잡기) , 3.코드 재사용

 

인자, 매개변수

인자를 매개변수에 넣어주는거! 인자로 초기화를 한다.

 

종류 

  • 매개변수가 없는 void 함수(void라는게 리턴값이 없다는 걸 함축하고 있다.

외부입력없이 함수 자체에서 기능 수행

  • 매개변수가 있는 void 함수

매개변수에 인자를 입력받아 사용, 출력부분에 많이 사용

 

#include <iostream>
using namespace std;

void pattern(int a);   // 함수 선언

int main() {
int a;

cout << "패턴의 크기를 입력하세요: ";
cin >> a; // 입력

pattern(a);  // pattern을 불러준다.
}

void pattern(int a) {
int col = 1;
for (int i = 1; i <= a; i++) {
for (int j = 1; j <= a; j++) {
cout << "8";
}
cout << endl;
}
}

  • 매개변수가 없지만 리턴값이 있는 함수

함수내부에서 입력을 받아 기능을 수행하고 결과를 리턴, 입력부분에 많이 사용

 

#include <iostream>
using namespace std;

int right(); //함수 호출

int main() {
int number = right();
cout << "가장 오른쪽 숫자 = " << number % 10 << endl;

}

int right() {

int a;
do {
cout << "양의 정수를 입력하세요: ";
cin >> a;    // 내부에서 입력받는다
} while (a <= 0);

return a; // 외부로 리턴해준다.
}

  • 매개변수도 있고 리턴값도 있는 함수

외부에서 입력받아 기능을 수행하고 결과를 리턴한다.

#include <iostream>
using namespace std;

int larger(int a, int b);

int main() {
int num1, num2;
cout << "첫 번째 숫자를 입력하세요 : ";
cin >> num1;
cout << "두 번째 숫자를 입력하세요 : ";
cin >> num2;


cout << "큰 숫자 = " << larger(num1,num2) << endl;

}

int larger(int a, int b) {

int larger;

if (a > b) {
larger = a;
}
else {
larger = b;
}

return larger;
}

 

함수 시그니처

컴파일러가 함수를 구분하는 기준

함수이름 + 매개변수목록 (매개변수의 타입 , 개수 , 순서)

리턴타입은 함수 시그니처에 포함되지 않음

double >> int

레퍼런스 타입

: 새로운 이름을 붙임(별칭)

const int c = 2;

const int& ref3 = c; //둘 다 const이여야한다.

 

pass by value (값만 복사)

: 인자의 값을 복사하여, 매개변수에 할당 , 원본 변수의 값은 변경 없다.  // void fun (int a)

pass by reference using reference type 

: 참조자 타입의 매개변수를 사용하여 함수 영역에 인자의 또 다른 이름을 생성, 매개변수의 값을 변경하면 원본 변수의 값도 동일하게 변경된다.    // void fun (int &a)

 

 

swap

void swap(int & a, int &b){

   int temp = a;

   a = b;

   b = temp;

}

 

 

리턴

함수의 결과를 함수를 호출한 위치로 전달

일반적으로 값을 복사하는 방식인 pass by value로 리턴을 진행

지역변수의 레퍼런스 리턴은 정의되지 않은 행동

 

 

변수

(1) 지역변수

함수내부에서 선언되는 변수 , 선언된 함수 내부에서만 접근 가능 , 선언된 블록안에서만 존재

(2) 전역변수

main 함수 외부, 모든 영역에서 접근 가능, 전역변수 사용금지!, 모든곳에 존재

(3) 정적지역변수

내부에서 선언, 초기화는 한번만, static int , 모든곳에 존재

 

 

int num = 5;

int main(){

int num = 25;

cout << ::num;  // ::은 전역변수 호출을 의미해서 5 출력

cout << num;    // 25출력

}

 

inline함수

:c++언어에서는 인라인 함수라는 것을 제공한다. 인라인이라는 의미는 코드 라인 자체가 안으로 들어간다는 뜻. 즉, 함수의 내용을 호출을 통해서 실행시키는 것이 아니라, 호출하는 코드 자체가 함수 내용의 코드가 되는 효과가 된다는 점이다.

 

inline double cube (const double side) {

return side*side*side;

}

int main() {

double sidevalue;

cout << cube(sidevalue) << endl;

}

사용이유 : 1. 입력값 수정 방지 , 2. pbr(또 다른 이름을 생성, 값은 동일)일때 인자로 r value를 갖기 위해

 

재귀

함수내부에서 함수자신을 다시 호출하는 함수

문제의 크기를 줄여서 같은 방식으로 정의할 수 있어야 함.

문제를 더 이상 줄이지 못하는, 풀기 시작하는 시점이 있어야 한다. (base case)