본문 바로가기

C언어_VisualStudio_실습

[C 언어] 표준함수 사용해보기 : 수학함수, 랜덤함수, 외부 프로그램 실행

표준 함수 사용

 

오늘은 C의 표준 함수 몇 개를 사용해보려고 한다. :-)

 

함수의 대한 기본 설명은 다음 글을 참고하면 된다.

https://cwithvisual.tistory.com/entry/%ED%91%9C%EC%A4%80-%ED%95%A8%EC%88%98-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A0%95%EC%9D%98-%ED%95%A8%EC%88%98

 

#8 C / C++ 함수 기본 / 표준 함수 / 사용자 정의 함수

오늘은 함수에 대해서 간단하게 정리하고, 그에 따라 표준 함수와 사용자 정의 함수도 간단하게 다뤄보려고 한다. :-) 함수의 정의 및 종류 C에서 기본적인 구성 요소 중의 하나이다. 코드의 묶음

cwithvisual.tistory.com

 

 

수학 함수

수학 함수의 몇몇 사용법을 익혀보자.

수학 함수를 사용할 때는 반드시 #include <math.h>를 적어주어야 한다.

전달하는 값의 형태는 소수형이다.

  • sqrt 함수
  • 삼각함수: sin, cos, tan
  • exp함수
  • log함수
  • pow함수
  • fabs 함수
  • ceil 함수
  • floor 함수

 

 

 

  • sqrt 함수 : 제곱근 함수, 전달하는 값의 형태는 소수형이다.
#include <stdio.h>
#include <math.h>

int main(void) {
	printf("%lf\n", sqrt(25.0));
	return 0;
}

 

 

  • 삼각함수: sin, cos, tan <- 이때, 각도는 라디안으로 처리

    전달하는 값의 형태는 소수형이다.

    참고( π=180° <-> 1 라디안 = π/180° )

 

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

int main(void) {
	double PI = 3.141592;
	printf("sin(PI) = %.lf\n", sin(PI));  // 정수값만 출력되기 위해서 %.lf사용
	printf("cos(PI) = %.lf\n", cos(PI));  // 정수값만 출력되기 위해서 %.lf사용
	printf("tan(PI) = %.lf\n", tan(PI));  // 정수값만 출력되기 위해서 %.lf사용
	return 0;
}

 

sin, cos, tan

 

 

  • exp함수 : 자연상수 e를 밑으로 하는 지수값 계산 (ex. e^(1)=2.718282...)

    전달하는 값의 형태는 소수형이다.

 

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

int main(void) {
	printf("exp(1.0)=%lf\n", exp(1.0));  // e^(1.0)
	printf("exp(2.0)=%lf\n", exp(2.0));  // e^(2.0)
	printf("exp(3.0)=%lf\n", exp(3.0));  // e^(3.0)
	return 0;
}

 

exp함수

 

 

  • log함수 : 자연상수 e를 밑으로 하는 자연로그 값을 계산
  • log10 함수: 10을 밑으로 하는 상용로그 값을 계산
  • log_함수: _을 밑으로 하는 로그 값을 계산 

    전달하는 값의 형태는 소수형이다.

 

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

int main(void) {
	printf("log(2.0)=%f\n", log(2.0));  // 밑이 e <- 자연로그
	printf("log10(2.0)=%f\n", log10(2.0));  // 밑이 10 <- 상용로그
	printf("log2(2.0)=%f\n", log2(2.0));  // 밑이 2 <- 로그
	return 0;
}

 

 

log함수

 

 

  • pow함수 : 제곱을 계산해주는 함수이다. 

    전달하는 두 값의 형태는 소수형이다.

 

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

int main(void) {
	printf("pow(2.0,3.0)=%f\n", pow(2.0, 3.0));
	return 0;
}

 

pow(2.0, 3.0)

 

 

  • fabs 함수: 절댓값을 반환하는 함수

    전달하는 값의 형태는 소수형이다.

 

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

int main(void) {
    printf("fabs(-3.0)=%f", fabs(-3.0)); // |-3.0|=3.0
    return 0;
}

 

fabs 함수

 

 

  • ceil : 소수점 올림 함수
  • floor : 소수점 내림 함수

    전달하는 값의 형태는 소수형이다.

 

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

int main(void) {
// ceil 올림
    printf("ceil(0.7)=%f\n", ceil(0.7));
    printf("ceil(0.5)=%f\n", ceil(0.5));
    printf("ceil(0.2)=%f\n", ceil(0.2));
// floor 내림
    printf("floor(0.7)=%f\n", floor(0.7));
    printf("floor(0.5)=%f\n", floor(0.5));
    printf("floor(0.2)=%f\n", floor(0.2));
    return 0;
}

 

ceil, floor

 

 

 

난수(random number) 만들기

C standard General Utilities Library(stdlib.h) 이용한다.

그러려면 #include <stdlib.h>를 반드시 적어주어야 한다.

rand() : 의사 난수(pseudo random number)를 생성한다. stdlib.h에 정의되어 있다. 0부터 RAND_MAX까지의 정수를 생성한다. 

의사 난수(pseudo random number)는 다음에 뭐가 나올지 모르는 진짜 난수가 아니라 초기값에 따라서 나오는 순서가 어느 정도 결정되어 있는 난수를 말한다. 

RAND_MAX는 rand()가 생성할 수 있는 최대 난수로 visual C++에서는 0x7fff(32767)으로 정의되어 있다.

 

#include <stdio.h>
#include <stdlib.h>  // rand()의 원형 정의

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

 

따라서 이 코드를 몇 번을 실행해도 다음과 같이 정해진 난수(의사 난수)들이 나온다.

 

rand()

 

그렇다면 프로그램을 실행할 때마다 다른 난수가 생성되게 하려면 어떻게 해야 할까? 매번 난수를 다르게 생성하려면 시드(seed)의 개념을 사용한다. 

시드(seed)는 난수 생성 시 씨앗값이 된다. 시드 값이 달라지면 이후 생성되는 모든 난수값이 달라진다. 어떠한 값도 시드값이 될 수 있으나 많은 사람들이 사용하는 값은 현재 시각이다. 이렇게 하면 프로그램이 실행되는 시간에 따라 난수 값들도 달라지기 때문이다.

time() : 표준 라이브러리에 있다. 1970년 1월 1일로부터 현재까지 경과된 시간을 초 단위로 반환한다.

이것을 srand()라는 함수를 이용하여 시드 값으로 설정하면 된다. 

 

srand(time(NULL))

time()은 time.h에 정의되어 있고 srand()는 stdlib.h에 정의되어 있다.

 

#include <stdio.h>
#include <stdlib.h> // rand()의 원형 정의
#include <time.h>  // time()의 원형 정의

int main(void) {
	int r = 0, i = 0;
	srand(time(NULL));
	for (i = 0; i < 10; i++) {
		r = rand();
		printf("r=%d\n", r);
	}
	return 0;
}

 

srand(time(NULL))
srand(time(NULL))

 

이렇게 실행할 때마다 다른 난수를 생성한다. 

 

만약, 임의의 실수가 필요하다면 RAND_MAX를 소수형으로 형변환 하여 이용하면 된다.

 

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

int main(void) {
	double r = 0;
	srand(time(NULL));
	r = rand() / (double)RAND_MAX; // RAND_MAX를 정수에서 소수형으로 형변환
	printf("r=%f\n", r);
	return 0;
}

 

만약, [a, b] 구간의 난수를 발생하려면 다음과 같이 하면 된다.

a + (rand() % (b - a + 1));

 

 

난수 만드는 것을 이용해서 주사위 프로그램, Up-Down 게임을 만들어보자. 이것은 다음을 참고하면 된다. 

 

 

외부 프로그램 실행

system() : 외부 프로그램을 실행하는 함수

 

#include <stdio.h>
#include <stdlib.h>  // system() 원형의 정의

int main(void) {
	system("mspaint");  // 그림판 실행
	system("calc");  // 계산기 실행
	return 0;
}