Posted by 살레시오
,
Posted by 살레시오
,
Posted by 살레시오
,

'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

6장 연습문제 풀이 동영상  (1) 2016.06.04
5장 연습문제 풀이 동영상  (0) 2016.06.04
4장 연습문제 풀이 동영상  (0) 2016.05.31
7.13.3 stdlib.h  (0) 2016.05.30
7.13.2 문자열 관련 함수 string.h  (0) 2016.05.30
Posted by 살레시오
,

'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

5장 연습문제 풀이 동영상  (0) 2016.06.04
7장 연습문제 풀이 동영상  (0) 2016.06.04
7.13.3 stdlib.h  (0) 2016.05.30
7.13.2 문자열 관련 함수 string.h  (0) 2016.05.30
7.13.1 수학함수 math.h  (0) 2016.05.30
Posted by 살레시오
,

7.13.3 stdlib.h     [gdoc]     [smts]

 헤더파일 stdlib.h에는 동적 메모리 할당, 난수 발생 및 문자열 변환 등을 수행하는 함수들이 포함되어 있다.


함수 선언

기능

void * malloc ( size_t size )

size 바이트의 메모리를 힙에서 할당하여 포인터를 반환

void * calloc ( size_t num, size_t size )

(num * size) 바이트의 메모리를 힙에서 할당하여 포인터를 반환한다.

void * realloc ( void * ptr, size_t size )

ptr이 가리키는 메모리를 size 바이트만큼 힙에서 재할당

void free ( void * ptr )

ptr이 가리키는 메모리를 해제한다.

void srand ( unsigned int seed )

의사 난수 발생기를 seed로 초기화한다. 보통 seed는 time(NULL)로 설정된다.

int rand ( void );

0부터 RAND_MAX 사이의 의사 난수를 반환한다.

int atoi ( const char * str );

str을 int로 변환한다.

long int atol ( const char * str );

str을 long으로 변환한다.

double atof ( const char * str );

str을 double으로 변환한다.

int abs ( int n )
long int labs ( long int n )

n의 절대값(absolute value)를 구한다.

void abort ( void );

현재 프로세스를 비정상적으로 종료한다.

void exit ( int status );

현재 프로세스를 정상적으로 종료한다.


이 중에서 malloc(), calloc(), free()함수는 6장에서 설명할 바가 있다.


 난수(random number)란 ‘특정한 생성 규칙이 없는 임의의 수’이며 난수를 발생하는 함수 rand()가 stdlib.h 에 포함되어 있다. rand 함수는 0부터 RAND_MAX (gcc의 경우 32,767로 정의되어 있다.) 사이의 임의의 정수를 반환하는 함수이다. 다음은 10개의 난수를 연속으로 생성하는 간단한 예제이다.


071203-01.c

#include <stdio.h>
#include <stdlib.h>

int main() {
   for(int i=0;i<10;i++){
       printf("%d, ", rand());
   }
}

D:\OneDrive\proj_c>cc 071203-01.c & a
41, 18467, 6334, 26500, 19169, 15724, 11478, 29358, 26962, 24464,
D:\OneDrive\proj_c>a
41, 18467, 6334, 26500, 19169, 15724, 11478, 29358, 26962, 24464,
D:\OneDrive\proj_c>a
41, 18467, 6334, 26500, 19169, 15724, 11478, 29358, 26962, 24464,
D:\OneDrive\proj_c>a
41, 18467, 6334, 26500, 19169, 15724, 11478, 29358, 26962, 24464,
D:\OneDrive\proj_c>cc 071203-01.c & a
41, 18467, 6334, 26500, 19169, 15724, 11478, 29358, 26962, 24464,
D:\OneDrive\proj_c>a
41, 18467, 6334, 26500, 19169, 15724, 11478, 29358, 26962, 24464,


그런데 실행을 시킬때마다 같은 난수가 발생함을 알 수 있는데 이러면 난수를 사용하는 의미가 없다. 만약 rand()함수를 이용해서 주사위 숫자를 만들었는데 계속 같은 패턴이 나온다면 쓸모가 없을 것이다. 실행시킬 때마다 다른 난수를 발생시키려면  srand()함수로 초기화 시켜야 실행할 때마다 다른 난수가 발생하게 된다. 보통 srand()함수는 다음과 같이 time()함수를 이용하여 호출한다.


srand(time(NULL));

time(NULL)은 1970년 1월1일 0시부터 현재까지의 경과 시간을 초 단위로 반환해 주는 함수로서 time.h 헤더 파일에 포함되어 있다. 이렇게 하면 난수를 발생시킬 때마다 다른 패턴으로 생성된다. 이것을 이용하여 주사위를 10번 던지는 프로그램을 작성하면 다음과 같다.


071203-02.c

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
   srand(time(NULL));
   for(int i=0; i<10; i++) {
       unsigned char dice = rand()%6+1;
       printf("%d, ", dice);
   }
}

실행 결과

D:\OneDrive\proj_c>cc 071203-02.c & a
6, 4, 4, 4, 6, 2, 2, 3, 1, 1,
D:\OneDrive\proj_c>a
3, 3, 1, 4, 5, 2, 4, 1, 1, 6,
D:\OneDrive\proj_c>a
4, 2, 3, 2, 6, 1, 1, 2, 5, 6,
D:\OneDrive\proj_c>a
1, 3, 5, 4, 5, 4, 5, 3, 4, 2,
D:\OneDrive\proj_c>a
4, 5, 5, 5, 6, 1, 4, 4, 2, 4,

주사위 수인 1부터 6까지 발생시키기 위해서 rand() 를 6으로 나눈 나머지에 1을 더했음을 눈여겨 보기 바란다. 이렇게 하면 [1, 6] 범위의 정수가 임의로 생성된다. 또한 srand()함수를 사용하였으므로 실행 시킬때 마다 다른 패턴이 생성된다.



'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

7장 연습문제 풀이 동영상  (0) 2016.06.04
4장 연습문제 풀이 동영상  (0) 2016.05.31
7.13.2 문자열 관련 함수 string.h  (0) 2016.05.30
7.13.1 수학함수 math.h  (0) 2016.05.30
7.13 표준함수  (0) 2016.05.30
Posted by 살레시오
,

7.13.2 문자열 관련 함수 string.h     [gdoc]     [smts]

 문자열은 사용빈도가 높은 편에 속하기 때문에 C언어에서는 문자열을 제어하는 많은 함수를 지원하고 있다. 이러한 문자열을 제어하는 함수는 string.h 헤더화일에 포함되어 선언되어 있다. 자주 사용되는 함수를 다음 표에 정리하였다.


[표 5.7.1] string.h함수의 자주 사용되는 표준 함수들

함수

기능

반환값

strlen(ptr)

문자열의 길이를 반환한다.

size_t

strcpy(pDest, pSrc)

문자열을 복사한다.

char *

strcat(pDest, pSrc)

문자열을 결합한다.

char *

strcmp(ptr1, ptr2)

두 문자열을 비교한다.(같다면 0을 반환)

int


 문자열의 길이를 반환하는 함수는 strlen()이다.


0507-01.c

#include <stdio.h>
#include <string.h>

int main() {
   char s[] = "ABCDE";
   int len = strlen(s);
   printf("%d", len);
}

실행 결과

5


 문자열을 복사하는 함수는 strcpy()이다. 첫 번째 포인터에 두 번째 문자열을 복사한다. strcat()함수는 두 문자열을 병합하는데 병합된 결과는 첫 번째 포인터에 저장된다.


0507-02.c

#include <stdio.h>
#include <string.h>

int main() {
   char str1[20];
   strcpy(str1, "Hello ");
       
   char str2[] = "world!";
   char str3[10];
   strcpy(str3, str2);

   strcat(str1, str3); // str1과 str3를 합해서 str1에 저장
   printf("%s", str1);
}

실행 결과

Hello world!

 문자열 간 비교를 위해서는 strcmp()함수를 이용한다. 이 함수는 두 개의 문자열을 인자로 받아서 같다면 0을 반환하고 다를 경우에는 ASCII 코드를 비교하여 -1 혹은 +1을 반환한다. 그렇지만 주로 두 문자열이 같은지 다른지를 비교할 경우가 많다.


0507-03.c

#include <stdio.h>
#include <string.h>

int main() {
   char str1[] = "abc";
   char str2[] = "bcd";
   char str3[] = "bcd";

   int ia = strcmp(str1, str2);
   int ib = strcmp(str2, str3);
   int ic = strcmp(str3, str1);

   printf("%d, %d, %d", ia, ib, ic);
}

실행 결과

-1, 0, 1


이와 같이 표준 함수를 이용하면 문자열을 손쉽게 조작할 수 있다.



'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

4장 연습문제 풀이 동영상  (0) 2016.05.31
7.13.3 stdlib.h  (0) 2016.05.30
7.13.1 수학함수 math.h  (0) 2016.05.30
7.13 표준함수  (0) 2016.05.30
7.10 지역배열과 전역배열  (0) 2016.05.30
Posted by 살레시오
,

7.13.1 수학함수의 모임 math.h     [doc]     [smts]

 다양한 수학 함수 값을 구하기 위한 함수들이 math.h에 정의되어 있다.



함수/상수

기능

비고

double sin(double x)

sin(x)


double cos(double x)

cos(x)


double tan(double x)

tan(x)


double asin(double x)

sin-1(x)


double asin(double x)

cos-1(x)


double asin(double x)

tan-1(x)


double asin2(double y, double x)

tan-1(y/x) x가 0인 경우도 구해짐


double sinh(double x)

sinh(x)


double cosh(double x)

cosh(x)


double tanh(double x)

tanh(x)


double exp(double x)

ex


double log(double x)

ln x(= logex)


double log10(double x)

log10x


double pow(double x, double y)

xy


double sqrt(double x)

x의 제곱근(=x1/2)


double abs(double x)

x의 절대값


double floor(double x)

x보다 크지 않은 가장 큰 정수


double ceil(double x)

x보다 작지 않은 가장 큰 정수


(주의 : ANSI C에서 정의되었던 M_PI, M_E와 같은 상수들은 C99에서 삭제되었다.)


예를 들어 0~π/2 범위의 sin(x)값 테이블을 출력하는 프로그램은 다음과 같다.


0712-01.c

#include <stdio.h>
#include <math.h>
#define PI 3.14

int main() {
   for(double x=0; x<=PI/2; x+=0.01) {
       printf("sin(%.2f)=%lf\n", x, sin(x));
   }
}

실행 결과

sin(0.00)=0.000000
sin(0.01)=0.010000
sin(0.02)=0.019999
sin(1.53)=0.999168
sin(1.54)=0.999526
sin(1.55)=0.999784
sin(1.56)=0.999942

 이차 방정식의 두 근을 구하는 예제는 다음과 같다.


0712-02.c

#include <stdio.h>
#include <math.h>

int main() {
   double da, db, dc;

   printf("input a, b, c of ax^2+bx+c=0 :");
   scanf("%lf,%lf,%lf", &da,&db,&dc);
   double dd = db*db-4*da*dc; //판별식

   if (dd>0) { // 서로 다른 두 실근
       double dr1, dr2;
       dr1 = (-db+sqrt(dd))/(2*da);
       dr2 = (-db-sqrt(dd))/(2*da);
       printf("two different real roots:%lf, %lf\n", dr1, dr2);
   } else if (dd<0) { //허근
       double real, imag;
       real = -db/(2*da);
       imag = sqrt(-dd)/(2*da);
       printf("complex roots:%lf+j%lf, %lf-j%lf\n", real, imag, real, imag);
   } else { //중근
       double r = -db/(2*da);
       printf("double root:%lf\n", r);
   }
}

실행 결과

input a, b, c of ax^2+bx+c=0 :1,4,4
double root:-2.000000

이차 방정식의 근은 판별식의 조건에 따라 종류가 달라지므로 if ~ else if ~else 구문을 사용하여 각각을 처리하였다.


'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

7.13.3 stdlib.h  (0) 2016.05.30
7.13.2 문자열 관련 함수 string.h  (0) 2016.05.30
7.13 표준함수  (0) 2016.05.30
7.10 지역배열과 전역배열  (0) 2016.05.30
6장 연습문제  (0) 2016.05.30
Posted by 살레시오
,

7.13 표준함수     [doc]     [smts]

 표준함수(standard function)은 그 기능과 사용법이 C 언어의 표준으로 정의되어 있으며 라이브러리로서 포함되어 사용자가 불러서 쓸 수 있는 함수를 의미한다. 이들 표준 함수에 관한 정보는 각종 헤더 화일 (header file)에 수록되어 있으며 표준 함수를 사용하려면 미리 #include문을 사용하여 해당 헤더 화일을 편입해 주어야 한다. 예를 들어 printf() 함수를 쓰려고 하면 printf()함수가 정의되어 있는 헤더파일은 <stdio.h>파일을 인클루드하면 된다.

사용 빈도가 높은 표준함수의 종류를 나열하면 다음 표와  같다. (모든 리스트는 http://en.wikipedia.org/wiki/C_standard_library 참조)


헤더파일

표준함수

설명

stdio.h

printf, scanf, putchar, getchar, puts, gets, ...

입출력에 관련된 함수

stdlib.h

atoi, itoa, qsort, random...

수치변환, 난수함수

string.h

strcat, strcmp, strcpy, ...

문자열에 관련된 함수

ctype.h

isalnum, isalpha, isdigit, ...

문자 판별, 변환 함수

math.h

sin, cos, tan, sqrt, ...

수학함수

complex.h

creal, cimag, cabs, ...

복소수 관련 함수들

stdbool.h


부울형 관련 매크로들

...




수백여 개에 달하는 표준 함수들을 이와 같이 기능이 관련된 함수끼리 묶어서 각각 원형을 선언해 놓은 것이 바로 헤더 화일이다. 사용자는 자신이 사용하고자 하는 표준 함수가 포함된 헤더 화일을 찾아 프로그램에 포함시켜주기만 하면 그 표준 함수를 사용할 수 있다. 사용하고자 하는 표준 함수가 어느 헤더 화일에 있는지는 메뉴얼을 참조하면 된다. (부록 참조)


 만약 프로그램을 작성할 때마다 모든 헤더 화일을 프로그램 선두에 편입시켜 둔다면 궂이 표준 함수를 찾을 필요가 없다고 생각할 지도 모른다. 하지만 이렇게 작성하면 몇 줄 되지도 않는 간단한 프로그램도 모든 표준 함수를 다 포함하기 때문에 컴파일에 시간이 많이 걸릴 뿐만 아니라 프로그램의 크기도 불필요하게 커지게 되므로 꼭 필요한 함수를 포함하는 헤더 파일만 포함시켜주는 것이 바람직하다.


'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

7.13.2 문자열 관련 함수 string.h  (0) 2016.05.30
7.13.1 수학함수 math.h  (0) 2016.05.30
7.10 지역배열과 전역배열  (0) 2016.05.30
6장 연습문제  (0) 2016.05.30
3장 연습문제 풀이 동영상  (0) 2016.04.18
Posted by 살레시오
,

7.10 지역배열과 전역배열 (선택 가능)    [doc]    [smts]

 변수가 전역변수, 정적변수, 지역변수로 나뉘듯이 배열도 전역배열, 정적배열, 지역배열로 구분할 수 있다. 한 가지 주의할 차이점은 전역배열과 정적배열은 자동으로 초기화가 되고 지역배열은 컴파일러에 따라서 그렇지 않을 수도 있다는 점이다. 즉, 초기화되지 않은 전역/정적배열은 자동으로 0으로 초기화 되지만 지역배열은 초기화되지 않으면 쓰레기값으로 채워진다고 봐야한다.


 다음 예제를 보면 초기화하지 않은 전역배열의 모든 요소의 합은 0이지만, 초기화하지 않은 지역배열의 모든 요소의 합은 엉뚱한 값이 나옴을 확인할 수 있다. 단 첫 요소만이라도 초기화가 된 경우는 나머지 요소들은 자동으로 0으로 채워진다는 것은 전 절에서 설명한 바가 있다.


0502-01.c
#include <stdio.h>
typedef unsigned char uchar;
uchar ucaExt[10];  //전역배열
int main(void) {
   uchar uca1[10];  //지역 배열
   uchar uca2[10] = {1}; // 지역배열. 나머지는 0으로 채워진다.
   short sSum1 = 0, sSum2 = 0, sSum3=0;

   for (short sN=0; sN<10; sN++) {
       sSum1 += ucaExt[sN];
       sSum2 += uca1[sN];
       sSum3 += uca2[sN];
   }

   printf("sSum1:%d, sSum2:%d, sSum3:%d\n", sSum1, sSum2, sSum3);
}

 만약 다음처럼 전역배열이 두 가지 있다고 하자.


int iaExt1[] = {1, 2, 3, 4};
int iaExt2[5] = {1, 2, 3};

전 절에서 [..]안에 배열의 크기를 생략하면 뒤의 초기화 값의 개수에 따라 배열의 크기가 결정된다고 설명한 바 있다. 따라서 iaExt1의 배열의 크기는 4가 되지만 iaExt2의 크기는 5라고 못 박았기 때문에 초기값이 지정되지 않은 4번째와 5번째 요소는 0으로 초기화된다.



'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

7.13.1 수학함수 math.h  (0) 2016.05.30
7.13 표준함수  (0) 2016.05.30
6장 연습문제  (0) 2016.05.30
3장 연습문제 풀이 동영상  (0) 2016.04.18
8.6 구조체 포인터 변수  (0) 2016.04.15
Posted by 살레시오
,