c 표준 함수들

Program C/C++ 2011. 6. 24. 14:04 Posted by HisPark


1. 수학 함수

  • 표준 함수 : 함수의 신뢰성과 이식성을 위해 자주 사용되는 함수들을 미리 만들어서 컴파일러와 함께 배포하는 함수로써 이 함수들을 집합을 런타임 라이브러리(CRT)라고 함
     분류  함수
     입출력 함수  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

 

  • 삼각 함수
     함수  설명
     double sin(double x);  sin 기본 함수
     double cos(double x);  cos 기본 함수
     double tan(doueble x);  tan 기본 함수
     double asin(doueble x);  sin 역함수
     double acos(doueble x);  cos 역함수
     double atan(doueble x);  tan 역함수
     double sinh(doueble x);  sin 쌍곡선 함수
     double cosh(doueble x);  cos 쌍곡선 함수
     double tanh(doueble x);  tan 쌍곡선 함수
    • 수학 함수는 math.h 헤더 파일을 포함 시켜야 사용 가능
    • 실수형 호도(라디안)값을 인수로 받아 실수형 값을 리턴
    • 수학적 삼각 함수의 정의
      • 기하학적 정의 : 각C가 직각인 삼각형ABC에서 각A, B, C와 마주보는 변을 a, b, h라 할 때
        • 사인(Sine) 함수 : sin A = a/h
        • 코사인(Cosine) 함수 : cos A = b/h
        • 탄젠트(Tangent) 함수 : tan A = a/b
        • 코시컨트(Cosecant) 함수 : csc A = h/a = 1/sin A
        • 시컨트(Secant) 함수 : sec A = h/b = 1/cos A
        • 코탄젠트(Cotanget) 함수 : cot A = b/a = 1/tan A
      • 단위원 정의 : 좌표평면에서 원점을 중심으로 반지름의 길이가 1인 원을 단위원이라 하며, 이 단위원 위의 점(x, y)에 대해 x축과 점과 원점을 잇는 각을 라디안r 이라 할 때
        • 사인 함수 : sin r = y
        • 코사인 함수 : cos r = x
        • 탄젠트 함수 : tan r = sin r/cos r
        • 코시컨트 함수 : csc r = 1/sin r
        • 시컨트 함수 : sec r = 1/cos r
        • 코탄젠트 함수 : cot r = cos r/sin r

 

  • 지수 함수
     함수  설명
     double sqrt(double x);  x의 제곱근(√x)
     double pow(double x, double y);  x^y, x의 y승
     double log(double x);  자연 대수(밑이 자연로그 e)
     double log10(double x);  상용 대수(밑이 10)
     double exp(double x);  자연 대수 exp
     double hypot(double x, double y);  직삼각형의 사변 길이(√x^2+y^2)
    • 실수형 값을 인수로 받아 실수형 값을 리턴

 

  • 정수화 함수
     함수  설명
     double floor(double x);  인수보다 크지 않은 최대 정수
     double ceil(double x);  인수보다 작지 않은 최소 정수
    • 응용
      • 소수부 버리기 : 정수형 변수에 대입하면 하강 변환으로 소수부가 버려짐 ( 예 : int i=d;, int i=(int)d )
      • 반올림
        • 기본 : floor(x+0.5)
        • 반올림 자리수 설정 : floor(x*pow(10, dig)+0.5)/pow(10, dig);

 

  • 절대값 함수
     함수  설명
     int abs(int n);  정수형 절대값
     long labs(long n);  실수형 절대값
     double fabs(double x);  실수형 절대값
    • 응용
      • 삼항 조건 연산자를 이용한 절대값 구하기 : (a>0) ? a : -a
      • 어떤 값이 특정 범위에 있는지 검사하기
        • if((a==10) || (a==-10)) -> if(abs(a)==10)
        • if((a==10) || (a==20)) -> if(abs(15-a)==5)
        • if((a>10) && (a<50) -> if(abs(a-30)<20)

 

2. 난수 함수

  • 표준 난수 함수
     함수  설명
     int rand(void);  난수 생성
     void srand(usigned int seed);  난수 발생 시작점(Seed) 제어
    • 컴파일러에 따라 다르지만 일반적으로 0 - 32767 범위 내의 임의의 정수를 생성
    • 난수 함수는 일정한 순서로 난수를 생성
    • 시작점을 바꾸면 생성되는 난수도 바뀌지만, 같은 시작점으로 난수 함수를 연속 호출하면 일정한 순서로 난수를 생성
    • 응용
      • 예측 불가능한 난수 발생 시작점 만들기 : srand((unsigned)time(NULL));
      • 범위 내 난수 생성
        • 0 - 50 : rand() % 51
        • -10 - 10 : (rand() % 21) - 10
        • 0 - 100 사이의 짝수 : (rand() % (100/2)) * 2
        • 0 - 100 사이의 홀수 : (rand() % (100/2)) * 2 + 1
        • 0.0 - 10.0 사이의 실수 : (rand() % 100) / 10.0

 

3. 시간 함수

  • 시간 체계
    • 평균태양시 : 태양이 평균각속도적도상을 움직이는 평균태양을 가정하여 이 시각으로 나타내는 시각을 뜻함

     

    • GMT(Greenwich Mean Time, 그리니치 표준(평균)시)
      • 런던 교외의 그리니치에 설립한 그리니치 천문대를 지나는 자오선본초자오선으로 지정하고, 경도의 원점(기준점)으로 하는 평균태양시
      • 1925년 이전의 GMT는 정오를 0시로 하여 시간을 재기 시작하는 방식의 천문학용 평균태양시
      • 일상생활에서는 자정을 0시로 하여 시간을 재는 방식을 사용하며, 이를 GCT(Greenwich Civil Time, 그리니치 세계(상용)시)라고 함
      • 1925년 1월 1일 GMT를 12시간 앞당겨 GCT와 일치시켰으며, UT(Universal Time, 세계시)라고 하여 전세계 공통의 표준시로 사용
      • GMT와 GCT 모두 그리니치시 라고도 함

     

    • 윤초(Leap Second)
      • 세슘원자시계의 1초 길이와 평균태양시의 1초 길이가 달라 오차가 발생함
      • 오차를 0.9초 이내로 유지하기 위해 1초를 가감하는 것
      • 양의 윤초(Positive Leap Second) : 지구의 자전이 느려져 표준시에 1초를 더하는 것
      • 음의 윤초(Negative Leap Second) : 지구의 자전이 빨라져 표준시에서 1초를 빼는 것
      • 윤초 시행일
        • 지정일 0시 0분 0초 직전에 윤초를 실시하도록 지정된 일자
        • 제 1 우선일 : 1월 1일과 7월 1일에 윤초를 실시
        • 제 2 우선일 : 4월 1일과 10월 1일에 윤초를 실시

     

    • UTC(Universal Time Coordinated, 협정 세계시)
      • 1967년 세슘원자의 주기적인 원자진동이 오차가 3000년에 1초 정도로 매우 정확한 것을 이용하여 세슘원자시계를 국제표준시계로 채택
      • 1972년 1월 1일부터 윤초를 시행하여 세슘원자시계를 평균태양시에 맞춰 UTC로 사용함

     

    • 일광절약시간(Daylight Saving Time, 영국에서는 British Summer Time 또는 Summer Time)
      • 여름철에 표준시보다 1시간 시계를 앞당겨 놓는 제도
      • 일을 일찍 시작하고 일찍 잠에 들어 등화를 절약하고, 일광을 장시간 쪼이게 되어 건강도 증진하기 위한 취지에서 개발됨
      • 현재 한국에서는 실시하지 않고 있으며, 전 세계적으로 약 70여개국이 이 제도를 시행 중임

     

    • 지역 시간(Local Time)
      • 경도의 차이에 따라 GMT나 UTC에 시간을 가감하는 것과 일광절약시간의 시행 유무에 따른 시간차를 합한 각 나라의 시간
      • 한국은 UTC나 GMT에 9시간을 더하고 일광절약시간을 시행하지 않는 KST(Korea Standard Time, 한국 표준시)를 사용하고 있음

 

  • 시간 함수
    • 시간 함수는 time.h 헤더 파일을 포함 시켜야 사용 가능

 

  • time 함수
    • 함수 원형 : time_t time(time_t *timer);
    • 1970년 1월 1일 00시 00분 00초 이후 경과한 초를 조사하는 함수
    • 2038년 1월 18일까지 표현 가능하며, 64비트용 _time64 함수는 3000년 12월 31일까지 표현 가능
    • UTC 포맷으로 되어 있음
    • time_t형의 포인터를 인수로 받아 조사된 시간을 변수에 입력하거나 리턴함
    • time_t형은 시스템에 따라 달라지며 윈도우즈에서는 4바이트 정수형으로 정의되어 있음
    • 응용
      • 리턴값만 전달하여 변수에 조사된 시간을 입력 : time_t now; now=time(NULL);
      • 변수에 직접 조사된 시간을 입력 : time_t now; time(&now);

 

  • ctime 함수
    • 함수 원형 : char *ctime(const time_t *timer);
    • time_t형의 경과초를 문자열 형태로 변환하는 함수
    • 26문자 길이로 되어있으며 끝에 개행문자가 있음
    • UTC + Local Time 포맷으로 되어 있음
    • 버퍼 공유
      • 변환 결과를 저장하기 위해 라이브러리에서 미리 할당된 정적 메모리 영역(버퍼)를 사용함
      • asctime, gmtime, localtime 등의 함수들과 공유함
      • 다른 함수를 사용하게 되면 이전 변환 결과가 파괴됨
      • 버퍼 공유 설계는 C 라이브러리 함수를 만들 때 멀티 스레드가 없었기 때문에 문제가 됨

 

  • _strdate 함수
    • 함수 원형 : char *_strdate(char *datestr);
    • time_t형의 경과초에서 날짜를 MM/DD/YY 포맷으로 구하여 datestr 버퍼에 복사

 

  • _strtime 함수
    • 함수 원형 : char *_strtime(char *timestr);
    • time_t형의 경과초에서 시간을 HH:MM:SS 포맷으로 구하여 timestr 버퍼에 복사

 

  • 시간 구조체
     멤버  설명
     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  일광 절약 시간과의 차

 

  • gmtime 함수
    • 함수 원형 : struct tm *gmtime(const time_t *timer);
    • time_t형의 값을 UTC 포맷의 tm 구조체로 변환함

 

  • localtime 함수
    • 함수 원형 : struct tm *localtime(const time_t *timer);
    • time_t형의 값을 UTC+Local Time 포맷의 tm 구조체로 변환함

 

  • mktime 함수
    • 함수 원형 : time_t mktime(struct tm *timeptr);
    • tm 구조체의 값을 time_t형으로 변환함

 

  • asctime 함수
    • 함수 원형 : char *asctime(const struct tm *timeptr);
    • tm 구조체의 경과초를 문자열 형태로 변환하는 함수(ctime과 동일)
    • UTC 포맷 : time_t형의 값을 gmtime 함수로 tm 구조체로 변환
    • UTC+Local Time : time_t형의 값을 localtime 함수로 tm 구조체로 변환

 

  • strftime 함수
     인수  설명
     char *strDest  버퍼
     size_t maxsize  버퍼의 길이
     const char *format  포맷팅 방식
     const struct tm *timeptr  tm 구조체
    • 함수 원형 : size_t strftime(char *strDest, size_t maxsize, const char *format, const struct tm *timeptr);
    • 포맷팅 방식을 임의로 설정할 수 있음

[Flag - strftime Formatting Code]

 플래그  설명
 %a  Abbreviated weekday name
 %A  Full weekday name
 %b  Abbreviated month name
 %B  Full month name
 %c  Date and time representation appropriate for locale
 %d  Day of month as decimal number (01 – 31)
 %H  Hour in 24-hour format (00 – 23)
 %I  Hour in 12-hour format (01 – 12)
 %j  Day of year as decimal number (001 – 366)
 %m  Month as decimal number (01 – 12)
 %M  Minute as decimal number (00 – 59)
 %p  Current locale's A.M./P.M. indicator for 12-hour clock
 %s  Second as decimal number (00 – 59)
 %U  Week of year as decimal number, with Sunday as first day of week (00 – 53)
 %w  Weekday as decimal number (0 – 6; Sunday is 0)
 %W  Week of year as decimal number, with Monday as first day of week (00 – 53)
 %x  Date representation for current locale
 %X  Time representation for current locale
 %y  Year without century, as decimal number (00 – 99)
 %Y  Year with century, as decimal number
 %z

 the time-zone name or time zone abbreviation, depending on registry settings;

 no characters if time zone is unknown

 %Z

 the time-zone name or time zone abbreviation, depending on registry settings;

 no characters if time zone is unknown

 %%  Percent sign
# 플래그는 모든 포맷팅 코드 앞에 올 수 있으며, 기능은 아래와 같음
 포맷팅 코드  기능

 %#a, %#A, %#b, %#B, %#p, %#X, %#z, %#Z,

 %#%

 # flag is ignored
 %#c

 Long date and time representation, appropriate for current locale

 For example: "Tuesday, March 14, 1995, 12:41:29"

 %#x

 Long date representation, appropriate to current locale

 For example: "Tuesday, March 14, 1995"

 %#d, %#H, %#I, %#j, %#m, %#M, %#S, %#U,

 %#w, %#W, %#y, %#Y

 Remove leading zeros (if any)

 

  • clock 함수
    • 함수 원형 : clock_t clock(void);
    • 프로그램 실행 후의 경과초를 조사하는 함수

 

  • difftime 함수
    • 함수 원형 : double difftime(time_t timer1, time_t timer0);
    • 두 시간의 차이를 조사하는 함수

 

  • 실습
     TimeFunction

     #include <stdio.h>

     #include <time.h>
     //--------------------------------------------------
     //08-3-다.기타 시간 함수
     //각종 시간 함수 실습
     //--------------------------------------------------

     void TimeFunction()
     {
         time_t time1;
     
         //time 함수(UTC) : 리턴값만 전달하여 변수에 조사된 시간을 입력하는 방법
         time1=time(NULL);
         printf("1970년 1월 1일 00:00:00 이후 경과초 : %I64d초\n", time1);

     

         //time 함수(UTC) : 변수에 직접 조사된 시간을 입력하는 방법
         time(&time1);
         printf("1970년 1월 1일 00:00:00 이후 경과초 : %I64d초\n", time1);

     

         //time 함수(UTC) : 변수없이 조사된 시간을 출력하는 방법
         printf("1970년 1월 1일 00:00:00 이후 경과초 : %I64d초\n", time(NULL));

     

         //time 함수(UTC) : ctime 함수와의 차이를 알아보기 위해 경과초를 나눔
         printf("현재 : %I64d시 %I64d분 %I64d초\n", time1/60/60%24, time1/60%60, time1%60);

     

         //ctime 함수(UTC + Local Time) : 개행 문자 포함
         printf("현재 : %s", ctime(&time1));
     
         //_strdate 함수
         char date1[10];
         _strdate(date1);
         printf("현재 : %s\n", date1);

     

         //_strtime 함수(UTC + Local Time)
         char time2[10];
         _strtime(time2);
         printf("현재 : %s\n", time2);

     

         //gmtime 함수(UTC)
         tm *timeptr1;
         timeptr1=gmtime(&time1);
         printf("현재 : %d년 %d월 %d일 %d시 %d분 %d초\n",
              timeptr1->tm_year+1990,/*1990년 이후 경과년수이기 때문에 1990년을 더함*/
              timeptr1->tm_mon+1,/*0월~11월이기 때문에 1을 더함*/
              timeptr1->tm_mday,
              timeptr1->tm_hour,
              timeptr1->tm_min,
              timeptr1->tm_sec);

     

         //localtime 함수(UTC + Local Time)
         timeptr1=localtime(&time1);
         printf("현재 : %d년 %d월 %d일 %d시 %d분 %d초\n",
              timeptr1->tm_year+1990,/*1990년 이후 경과년수이기 때문에 1990년을 더함*/
              timeptr1->tm_mon+1,/*0월~11월이기 때문에 1을 더함*/
              timeptr1->tm_mday,
              timeptr1->tm_hour,
              timeptr1->tm_min,
              timeptr1->tm_sec);
     }

'Program C/C++' 카테고리의 다른 글

Class 내부 Thread basic...  (1) 2013.05.10
typedef...  (0) 2011.09.26
문자열 타입 변환 | C &amp; C++  (0) 2010.10.13
C++의 다양한 string 타입 | C &amp; C++  (0) 2010.01.30
About String  (0) 2005.08.05