혼자 연구하는 C/C++ 8장 정리(표준 함수)

2015. 3. 1. 21:07창고

728x90
728x90

1. 수학 함수

표준 함수

컴파일러 제작사들이 자주 사용되는 공통적인 함수들을 미리 만들어서 컴파일러와 함께 배포한 것이 표준함수.

표준 함수들의 집합을 런타임 라이브러리(CRT)라고 부른다.

우수한 프로그래머들이 공들여 작성한 것이므로 성능이 뛰어나고 신뢰성이 높다.


삼각 함수

수학 함수는 수학적인 계산을 하는 함수들이다. 모두 math.h에 선언되어 있다.

기본적인 수학의 sin, cos, tan와 사용방법이 같다.


삼각 함수들이 받아들이는 인수 x는 360분법의 각도가 아니라 호도(라디안)값이다.


지수 함수

지수 함수는 거듭승이나 제곱근, 로드 따위의 값을 구하는 함수들이다.

실수 차원에서 계산을 하므로 취하는 인수와 리턴값은 모두 정밀도가 높은 double 실수형이다.


정수화 함수

실수형 데이터에서 정수부만을 취하는, 즉 소수점 이하의 소수부를 잘라버리는 함수이다.

리턴값은 여전히 실수!

1
2
3
4
5
6
7
8
double floor( double x );
double ceil( double x);
 
floor(3.14); // 3.0
ceil(3.14);  // 4.0
 
floor(-3.14); //-4.0
ceil(-3.13);  //-3.0
cs


floor - 주어진 인수보다 크지 않은 최대 정수

ceil - 주어진 인수보다 작지 않은 최소 정수


실수 x를 반올림한 값 = floor(x + 0.5)

ex)

floor(1.4 + 0.5); // 1.0

floor(1.6 + 0.5); // 2.0


소숫점자리 반올림하기

1
#define banollim(x, dig) (floor((x)*pow(10.0,dig)+0.5)/pow(10.0,dig))
cs


10을 곱해 소숫점을 잠시 옮기고 반올림 후 다시 제자리로 옮긴다.


절대값 함수

인수의 부호를 강제로 양수로 바꾸는 함수이다.


int abs(int n);

long labs(long n);

double fabs(double x);


정수형, long형, 실수형에 대한 절대값을 구하는 함수들.


2. 난수 함수

표준 난수 함수

일반적인 함수들과는 다른 특이한 난수함수.

난수(Random Number)란 무작위로 만들어지는 알수 없는 값을 의미한다.

난수가 필요한 이유는 말 그대로 예측을 허용하지 않기 위해서이다.


int rand(void);

void srand(unsigned int seed);


rand 함수는 0~RAND_MAX 범위의 수 중에서 무작위로 한 수를 생성한다.

RAND_MAX는 컴파일러에 따라 다르지만 일반적으로 32767로 정의되어 있다.


하지만 rand 함수만으론 여러 번 실행해도 같은 난수를 발생하므로

제대로 된 난수라고 할 수 없다.


그래서 난수 생성 루틴의 규칙에 변화를 줄 수 있는 srand라는 함수가 필요하다!

srand는 난수 발생기에 난수를 발생시키는 시작점(seed)를 제공하며 난수 발생기는

이 시작점을 기준으로 난수를 발생시킨다!

srand(1234)나 srand(5678)같은 호출문을 삽입하면 발생되는 난수가 달라진다.


하지만 이렇게 해도 시작점이 동일하면 생성되는 난수에는 일정한 규칙이 존재할 수 밖에 없다.

그래서 난수 발생기가 실행될 시점의 시간을 예측할 수 없기 때문에 시간 값을 시작점으로 사용하면 완전한 난수를 만들 수 있다.


1
srand((unsigned)time(NULL));
cs


time 함수는 현재 시간을 나타내는 정수값을 리턴하는데 이 값을 시작점으로 사용하면

프로그램이 실행될 때마다 완전히 다른 난수를 만들 수 있다.


% 연산자를 통해 일정 범위안의 수로 바꿀 수 있다.


1
rand() % 45 // 0~ 45 사이의 난수
cs


매크로 함수로도 사용한다.


1
2
#define randomize() srand((unsigned)time(NULL))
#define random(n) (rand() % (n))
cs


난수의 생성

random 함수 자체는 간단하지만 응용하기에 따라서는 아주 다양한 유형의 난수를 만들 수 있다.

유형을 알아보자.

- 0~n 사이의 난수는 random(n)으로 생성한다. 제일 큰 난수는 n-1

random(10) // 0~9까지의 난수

- random 함수가 만들어내는 난수의 최소값은 항상 0으로 고정되어 있다.

a~b사이(b 제외)의 정수 난수를 구할 때 : random(b-a)+a;

a~b까지(b 포함)의 정수 난수를 구할 때 : random(b-a+1)+a;

- 난수 사이의 간격은 난수를 구한 후 곱을 사용한다.

1
random(100/2)*2// 0~49까지 구하고 *2를 해서 짝수만 구할 수 있다.
cs

- 실수 난수가 필요하면 먼저 충분한 크기의 정수 난수를 구하고 필요한 유효자리수만큼 10의 거듭승으로 나눈다.

1
random(100)/10.0
cs

- 분리된 범위의 난수도 원한다면 생성할 수 있다.

1
random(100/2)*2// 0~49까지 구하고 *2를 해서 짝수만 구할 수 있다.
cs

- 전혀 연관성이 없는 수들 중 하나를 난수로 선택할 수도 있다.

1
2
3
4
do
{
    i=random(16);
}while(i!=3 && i!=7 && i!=12 && i!=15);
cs


3. 시간 함수

time

모든 시간 함수의 원형은 time.h 헤더 파일에 선언되어 있다.

시간과 관련된 가장 기본적인 함수는 시간 구하는 time 함수!

1
2
3
time_t time( time_t* timer );
char* ctime( const time_t *timer );
 
cs


time_t형은 4바이트 정수(typedef long teim_t;)로 정의 되어 있다.

최대 2038년 1월 18일까지 날짜를 표현할 수 있다.

_time64 함수는 3000년 12월 31일까지 표현 가능하다.


ctime 함수는 time_t형의 경과초를 출력하기 편리한 문자열 형태로 바꾸며 UTC로 된 시간을 지역 설정에 맞게 조정해 준다.

ctime이 변환 결과를 저장하기 위해 사용하는 버퍼는 라이브러리에서 미리 할당해 놓은 정적 메모리 영역이며

이 영역은 asctime, gmtime, localtime 등의 함수들이 공유한다.


1
2
3
4
5
char Date[10];
char Time[10];
 
_strdate(Date);
_strtime(Time);
cs


날짜는 HH/DD/YY 포맷으로 리턴, 시간은 HH:MM:SS로 리턴


시간 구조체

time 함수를 사용하면 현재 시간을 쉽게 구할 수 있고 ctime을 사용하면 이 시간을 문자열로도 바꿀 수 있다.

하지만 포맷팅을 마음대로 할 수 없어 무척 불편하다.

시간 포맷을 자유롭게 변경하기 위해서 time_t형의 값을 tm 구조체로 변환해서 사용할 수 있다.


1
2
3
struct tm* gmtime(const time_t *timer);
struct tm* localtime(const time_t *timer);
time_t mktime(struct tm* timeptr);
cs


gmtime, localtime 함수는 둘 다 time_t형의 값을 tm 구조체로 변환하는데 

gmtime은 세계 표준시로 변환하며 localtime은 지역시간으로 변환.


기타 시간 함수

시간은 여러모로 쓸 데가 많은 정보이다. 다음 함수는 프로그램이 실행을 시작한 후의 경과된 시간(Process Time)을 조사한다.

1
clock_t clock(void);
cs


clock_t 타입은 long형으로 정의되어 있으며 이 함수가 조사한 값을 

CLOCKS_PER_SEC으로 나누면 프로그램 실행 후의 경과 초를 알 수 있다.

1
2
typedef long clock_t;
#define CLOCKS_PER_SEC 1000
cs


728x90
반응형