수학 함수 (math.h), 난수 생성 함수(랜덤 함수) rand - srand, seed, time(NULL)
- 수학 함수 (math.h)
⇒ abs 함수를 직접 구현해 보면
int abs(int x)
{
if(0>x)
{
x=x*-1;
}
return x;
}
라는 함수를 만들면 abs와 같은 결과를 낼 수 있다.
⇒ 수학함수는 프로그램의 속도를 느려지게 하므로 최적화를 위해서는 되도록 사용하지 않는 것이 속도에 유리하다.
※ linux 명령어
⇒ man abs → abs에 대한 manual을 볼 수 있다.
→ q 명령을 누르면 빠져나간다.
→ 명령은 (1), 함수는 (3)으로 표시되어 있다.
ex) LS(1), MKDIR(1), abs(3), PRINTF(1L)...
→ (3)은 programmer's manual
→ printf 같은 경우는 명령과 함수가 둘 다 있다. 그래서 man printf라고 입력하면 PRINTF(1L)이 나오며 이것은 명령어를 말한다.
→ 이럴 때, man 3 printf를 입력하면 함수 printf를 볼 수 있다. 여기서 3은 해당 섹션 번호이다.
→
- rand 함수 (random number)
⇒ 임의의 수를 생성할 때는 난수 생성함수 rand()를 이용한다.
⇒ rand()함수는 <stdlib.h> 헤더파일에 선언되어 있다.
⇒ rand() 함수는 0에서 32767(윈도우 기준, linux는 범위가 더 크다.) 사이의 정수를 반환한다. 문제는 rand()함수가 호출되면 매번 같은 난수가 반환되므로 매번 다른 난수를 생성하기 위해서 srand()함수에 종자 값(seed value)를 주는 방법을 사용한다.
⇒ 보통 종자값으로 time(NULL) 함수를 사용하는데 time()함수는 1970년 1월 1일부터 지금까지 경과된 시간을 초로 계산하여 반환한다.
// 난수를 발생하는 예
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int i;
long seed;
printf("1에서 1000사이의 난수 5개의 생성\n");
for(i=0;i<=5;++i)
{
printf("%7d",(rand()%1000)+1); /* +1은 0을 제외하고 1에서부터 난수를 생성하기 위해 더해준다. */
}
printf("\n");
printf("\nRandom Number Generation Using Seed Value\n");
seed=time(NULL);
srand(seed);
for(i=0;i<=5;++i)
{
printf("%7d",(rand()%1000)+1);
}
printf("\n");
return 0;
}
※ const → 상수
#include<stdio.h>
int main
{
int A=100;
int B=100;
const int *P = &A; // 포인터 P가 가리키고 있는 주소에 들어가 있는 값을 수정할 수 없다. 포인터가 가리키는 곳이 상수화 되었기 때문.
int *const P2 = &A; // P2가 가리키는 주소를 수정할 수 없다.
const int *const P3=&A;
//*P = 101;
//*P2 = &B;
*P3=100;
P3=&B;
printf("A = %d\n", A);
return 0;
}
⇒ test.c<11> : error C2166 : l-value(left-value) specifies const object (DOS)
→ 왼쪽이 상수 object 이다. 즉, 상수에 상수를 대입하려 했기 때문에 에러
⇒ const int * const P3=&A; → 출력은 가능하지만 수정은 불가능 하다.
※ printf("하이\n");
→ 여기서 " "안에는 실제로 const char *가 있다. 이것이 “ ” 안의 주소를 사용 가능하게 해 준다.
→ int printf(const char * format, ...);의 형식이다.
→ ... 를 가변인자라고 하는데, 이것은 인자의 수를 조절할 수 있게 해 준다. 사용하기 위해선 첫 번째는 반드시 인자가 필요하나 두 번째 부터는 가변인자를 사용해 인자의 수를 조절하게 해 준다.
→
int iNum;
iNum = printf("안녕하세요\n");
printf("%d=n",iNum);
※ visual studio의 매뉴얼을 보기 위해선 MSDN을 설치해야 한다.
test3.c(5) : warning C4047: '=' : 'int *' differs in levels of indirection from
'int (__cdecl *)()' → 여기서 _cdecl은 Visual studio에서 사용하는 예약어이므로 이 부분을 빼면
⇒ 'int ( *)()' → main의 형식임을 알 수 있다.
type |
name |
address |
int * |
P |
|
int(*)( ) |
main |
|
int(*)(const char*) |
printf |
|
'내장형 하드웨어 > C언어' 카테고리의 다른 글
구조체(typedef, struct), 연결리스트 (1) | 2011.05.12 |
---|---|
함수 포인터(function pointer), 배열 (0) | 2011.05.09 |
함수 전달의 3가지 - 참조(reference), 주소(address), 값(value), 재귀함수, touch, ifndef (0) | 2011.05.04 |
stack 구조, 어셈블리 (MASM, 코드 분석) (0) | 2011.04.29 |
visual studio 6.0 debug mode - stack (esp, sbp, eip) (0) | 2011.04.28 |