8.1 수학 함수
8.1.1 표준 함수
분류 |
함수 |
입출력 함수 |
printf, scanf, gets, puts, getch, putch |
수학 함수 |
sin, cos, tan, pow, floor, ceil, hypot |
문자열 함수 |
strcpy, strlen, strcat, strstr, strchr |
시간 함수 |
time, asctime, clock |
파일 입출력 함수 |
fopen, fclose, fseek, fread, fwrite |
프로그램 제어 |
exit, abort, system |
메모리 할당 |
malloc, free, realloc, calloc |
기타 |
rand, delay |
8.1.2 삼각 함수
수학적인 계산을 하는 삼수 #include <math.h>
- 예제 sin
#include <stdio.h> #include <math.h>
void main(void) { int r;
for( r=0; r<=90; r+=10) { printf("sin(%d도)=%f\n",r,sin(r*3.1416/180)); } } |
8.1.3 지수 함수
거듭승이나 제곱근, 로그 따위으 값을 구하는 함수들
함수 |
설명 |
double sqrt(double x); |
x의 제곱근 |
double pow(double x, double y); |
xy. x의 y승 |
double log(double x); |
자연 대수 |
double log10Idouble x); |
상용 대수 |
double exp(double x); |
자연 대수 exp |
double hypot(double x, double y); |
직각삼각형의 사변 길이 |
8.1.4 정수화 함수
실수형 데이터에서 정수부만 취하는 즉 소수점 이하의 소수부를 잘라 버리는 함수
- floor : 주어진 인수보다 크지 않은 최대 정수
-
ceil : 주어진 인수보다 작지 않은 최소 정수
- 예제 floor
#include <stdio.h> #include <math.h>
void main(void) { printf("floor(3.14)=%f\n", floor(3.14)); printf("ceil(3.14)=%f\n", ceil(3.14)); printf("floor(-3.14)=%f\n", floor(-3.14)); printf("ceil(-3.14)=%f\n", ceil(-3.14)); } |
- 예제 round
#include <stdio.h> #include <math.h>
#define banollim(x,dig) (floor((x)*pow(10.0,dig)+0.5)/pow(10.0,dig))
void main(void) { double x=123.456789; int i;
for(i=-2; i<5; i++) { printf("%f의 %d자리 반올림 = %f\n",x,i,banollim(x,i)); }
} |
8.1.5 절대값 함수
인수의 부호를 강제로 양수로 바꿈
- 예제 abs
#include <stdio.h> #include <math.h>
void main(void) { int i=3, j=-3;
printf("%d의 절대값 = %d\n",i, abs(i)); printf("%d의 절대값 = %d\n",j, abs(j)); } |
자주 사용한다면 매크로를 만들어 사용하는 것이 속도상으로나 프로그램 크기로 보나 유리하다.
#define Myabs(a) (a>0) ? (a):(-a))
8.2 난수 함수
8.2.1 표준 난수 함수
-
난수(Random Number)
무작위로 만들어지는 알 수 없는 값
int rand(void);
void srand(unsigned int seed);
- 예제 Random
#include <stdio.h>
void main(void) { int i; for( i=0; i<10; i++ ) { printf("%d ", rand()); } } |
rand 함수만 썼을 경우 여러 번 실행해보면 똑같은 값이 계속 나온다.
그래서 난수 생성 루틴의 규칙에 변화를 줄 수 있는 srand 함수가 필요하다.
srand((unsigned)time(NULL));
rand함수는 0~32767 사이의 임의 정수값 하나를 구하는데 난수는 보통 일정한 범위에 속해 있어야 의미가 있다.
rand() % 48; // 0~47 사이의 난수
rand() % 6 // 0~5 사이의 난수
다음과 같이 매크로 함수로 사용 하면 편리하다.
#define radomize() srand((unsigned)time(NULL))
#define random(n) (rand() % (n))
8.2.2 난수의 생성
-
0 ~ n-1 사이의 난수 생성 방법
rand() % 10 // 0~9까지의 난수
-
n값을 조정하며 범위의 시작값 조정 방법
rand() % 10+1 // 1~10까지의 난수
a ~ b 사이(b제외)의 정수 난수를 구할 때 : rand()%(b-a)+a
a ~ b 사이(b포함)의 정수 난수를 구할 때 : rand()%(b-a)+a+1
-
0~100 미만의 짝수 중 하나 생성
rand() %(100/2)*2
-
소수점 한자리까지 유효한 0.0~9.9 사이의 난수
rand()%100/10.0
-
0~4, 14~18 사이의 두 범위에 있는 수중 하나를 선택
(rand()%(5+5)*rand()%2==1 ? 1:-1)+9
8.3 시간 함수
8.3.1 time
시간 함수 사용 #include <time.h>
- 예제 time
#include <stdio.h> #include <time.h>
void main(void) { time_t t;
time(&t); printf("현재 시간은 %s입니다.\n",ctime(&t)); } |
- 예제 strdate
#include <stdio.h> #include <time.h>
void main(void) { char date[10]; char time[10];
_strdate(date); _strtime(time);
printf("날짜 : %s, 시간 : %s\n",date,time); } |
8.3.2 시간 구조체
멤버 |
설명 |
tm_sec |
초(0~59) |
tm_min |
분(0~59) |
tm_hour |
시간(0~23) |
tm_mday |
날짜(1~31) |
tm_mon |
월(0~11) |
tm_year |
1990년 이후 경과 년수 |
tm_wday |
요일(0~6). 0요일 일요일 |
tm_yday |
년중 날짜(0~365) |
tm_isdst |
일괄 절약 시간과의 차 |
8.3.3 기타 시간 함수
프로그램이 실행을 시작한 후의 경과된 시간을 조사
clock_t clock(void);
- 예제 clock
#include <stdio.h> #include <time.h>
void main() { clock_t t1,t2; int count=0;
t1=clock();
for(;;) { printf("기다리십시요. %d\n", count++); t2=clock(); if(t2-t1 > 3*CLOCKS_PER_SEC) { break; } } printf("끝났음.\n"); } |