본문 바로가기

C lang

[C language] Geany편집기 - 6. <math.h>수학함수, random(난수/시스템시간), typedef(타입정의), function(함수)

#정리

# math - 수학 연산 함수 
// math 해더<math.h> 선언 시, 추가 옵션을 넣고 컴파일 해야한다.
//제곱 : 연산자(**), 함수(pow()) >> double(%lf)로 반환된다.
 - printf("pow : %lf\n",pow(x,y));
//#include <math.h> 사용할 때는 컴파일 옵션을 넣고 요청을 해야함
 - 1. 터미널 명령 프롬프트 >> gcc -Wall -o c22math c22math.c -lm 
 - 2. build탭 >> Set Build Command >> biuld 명령어에 -lm 추가
//제곱근 : 함수(sqrt()) >> double(%lf)로 반환된다.
- printf("sqrt: %lf\n", sqrt(h));
//삼각함수
  - printf("sin: %lf\n", sin(h));
 - printf("cos: %lf\n", cos(h));
 - printf("tan: %lf\n", tan(h));
//절대값 : <math.h> 에도 있지만, <stdlib.h>에도 있어서 충돌 오류남. 
 (둘 다 선언하면 오류 없어지며, 하나만 선언해도 실행은 가능)
 - printf("abs: %d\n", abs(t)); //절대값
//올림, 내림, 반올림
 - printf("ceil(99.11): %.2lf \n", ceil(99.11));//올림
 - printf("floor(99.99): %.2lf \n", floor(99.99));//내림
 - printf("round(99.11): %.2lf \n", round(99.11));//반올림


# random - 난수생성 
//기본적으로 매 실행마다 동일한 랜덤값이 나온다.
//time함수를 통해 seed를 넣어주면 매번 새로운 난수가 생성된다. (time.h 헤더 선언 필요) 
 - #include <time.h> ~ srand(time(NULL)); 
//time_t 타입 변수를 사용하여 시스템 시간을 초 단위로 출력할 수 있다.


# typedef : type define  - 타입 정의 
//타입의 명칭을 사용자가 변경 혹은 지정 할 수 있다. (나중에 헷갈리면 안써도된다.)
 - 길이가 긴 타입의 타입명(ex. unsigned int)을 자주 써야할 때 사용한다. (추후에 구조체에서도 활용)


# function : 함수
(1.Basic) 
//함수는 기본적으로 메인 함수보다 위에서 정의되어 있어야한다.
 - 메인 함수보다 아래에 있는 경우, 함수가 인식되지 않고 오류가 발생한다.

(2. 추상매소드화(?))
//함수 구현부를 main() 아래에 놓고, 위에서 추상매소드처럼 부를 수도 있다.
 - 함수의 바디 없이 반환 타입과 함수명을 맞춰서 콜해주면 된다.
 - 매개변수는 작성하지 않아도 문제는 없지만, 나중에 헷갈릴 수 있어 적어주는 습관을 들이는 것이 좋다.

(3. 함수 안에 함수)
//inner function - 함수 안에 함수를 만들 수 있다.
 -  함수 안에서 만들어진 함수는 밖에서 콜할 수 없다.

(4. 함수를 인수(arguments)로)
//test01 : test01({1,2,3})처럼 배열 원소를 직접 넣으면, error가 나므로 배열을 초기화한 뒤, 배열 변수로 입력해야 한다.
 - test01(sus); >> 함수의 변수로 넘겨주는 경우, 받는 함수(test01())에서는 배열변수의 시작 주소값이 넘어온다.
//함수를 콜해서 받아온 배열 변수"sus"에는 배열 원소값이 아닌, sus 배열의 시작 주소값만 넘어오게 된다.
 - sus[ ] 로 빈값을 넣어서 콜하기 때문이다. >> 하지만 넣어도 큰 의미는 없다.
 - 배열변수의 주소 값만 받아온 상태로는 sizeof(sus)로 크기 체크가 불가하다. >> #define을 통해 별도로 불러와야한다.
//test02 : 배열 변수는 배열의 주소값을 가지므로, 포인터 변수의 값으로 할당할 수 있다. 
 - printf로 주소를 출력할 때는 %p로 한다. 
//문자열로 이루어진 배열은 문자열 한 덩어리를 %s로 한 번에 출력할 수 있다.
 - char* 타입은 %s로 받는다고 생각하면 편하다.
//값이 없는 방을 제외하고 값이 있는 방만 출력하고 싶다면, strlen()을 이용하면된다. 



#custom header - 다른 파일에 있는 함수를 끌어오는 방법
//직접 만든 헤더는 " "로 불러온다.
 - 깨끗한 화면에 소스코드만 작성하면 된다.
 - 확장자는 .h로 한다.

 

 

 

# math - 수학 연산 함수 

// math 해더<math.h> 선언 시, 추가 옵션을 넣고 컴파일 해야한다.

//제곱 : 연산자(**), 함수(pow()) >> double(%lf)로 반환된다.
 - printf("pow : %lf\n",pow(x,y));
//#include <math.h> 사용할 때는 컴파일 옵션을 넣고 요청을 해야함
 - 1. 터미널 명령 프롬프트 >> gcc -Wall -o c22math c22math.c -lm 
 - 2. build탭 >> Set Build Command >> biuld 명령어에 -lm 추가
//제곱근 : 함수(sqrt()) >> double(%lf)로 반환된다.
- printf("sqrt: %lf\n", sqrt(h));

//삼각함수 
 - printf("sin: %lf\n", sin(h));
 - printf("cos: %lf\n", cos(h));
 - printf("tan: %lf\n", tan(h));
//절대값 : <math.h> 에도 있지만, <stdlib.h>에도 있어서 충돌 오류남. 

 (둘 다 선언하면 오류 없어지며, 하나만 선언해도 실행은 가능)
 - printf("abs: %d\n", abs(t)); 
//올림, 내림, 반올림
 - printf("ceil(99.11): %.2lf \n", ceil(99.11));//올림
 - printf("floor(99.99): %.2lf \n", floor(99.99));//내림
 - printf("round(99.11): %.2lf \n", round(99.11));//반올림

 

--예문 코드 보기--

더보기
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
	printf("math...\n");
	
	//제곱 : 연산자(**), 함수(pow()) >> double(%lf)로 반환된다.
	int x = 2;
	int y = 3;
	printf("pow : %lf\n",pow(x,y));
	
	//#include <math.h> 사용할 때는 컴파일 옵션을 넣고 요청을 해야함
	//1. 터미널 명령 프롬프트 >> gcc -Wall -o c22math c22math.c -lm 
	//2. build탭 >> Set Build Command >> biuld 명령어에 -lm 추가
	
	
	int h = 100;
	printf("sqrt: %lf\n", sqrt(h)); //제곱근 : 함수(sqrt()) >> double(%lf)로 반환된다.
	printf("sin: %lf\n", sin(h));
	printf("cos: %lf\n", cos(h));
	printf("tan: %lf\n", tan(h));
	
	
	int t1 = -100;
	//절대값은 <math.h> 에도 있지만, <stdlib.h>에도 있어서 충돌 오류남. 둘 다 선언하면 오류 없어짐
	printf("abs: %d\n", abs(t1)); //절대값 
	
	printf("ceil(99.11): %.2lf \n", ceil(99.11));//올림
	printf("floor(99.99): %.2lf \n", floor(99.99));//내림
	
	printf("round(99.11): %.2lf \n", round(99.11));//반올림
	printf("round(99.99): %.2lf \n", round(99.99));
	

	return 0;
}

 

 


# random - 난수생성 

//기본적으로 매 실행마다 동일한 랜덤값이 나온다.

//time함수를 통해 seed를 넣어주면 매번 새로운 난수가 생성된다. (time.h 헤더 선언 필요) 

 - #include <time.h> ~ srand(time(NULL)); 

(좌) time 함수 적용전 / (우) time함수 적용 후

 

//time_t 타입 변수를 사용하여 시스템 시간을 초 단위로 출력할 수 있다.

 

--예문 코드 보기--

더보기
#include <stdio.h>
#include <stdlib.h> //rand, srand
#include <time.h> //time

int main(int argc, char **argv)
{
	printf("random...\n");
	
	//계속 같은 랜덤값이 아닌, 매 실행마다 새로운 난수 생성을 할 땐 seed가 필요하다.
	//seed value setup
	srand(time(NULL));
	
	for(int i=0;i<10;i++){
		int su = rand();
		printf("random : %d, %d\n",su,su%10);
	}
	
	printf("===== time ============\n");
	
	//시스템 시간을 초 단위로 출력
	time_t t;
	t = time(NULL);
	printf("time_t: %ld\n",t);
	
	return 0;
}

 


 

# typedef : type define  - 타입 정의 

//타입의 명칭을 사용자가 변경 혹은 지정 할 수 있다. (나중에 헷갈리면 안써도된다.)

 - 길이가 긴 타입의 타입명(ex. unsigned int)을 자주 써야할 때 사용한다. (추후에 구조체에서도 활용)

 

--예문 코드 보기--

더보기
#include <stdio.h>

int main(int argc, char **argv)
{
	printf("typedef : type define...\n");
	
	//unsigned int type의 이름을 Uint로 변경
	typedef unsigned int Uint;
	Uint x = -999;
	printf("%u\n",x);
	
	return 0;
}

 

 


 

 

# function : 함수 - 1.Basic 

//함수는 기본적으로 메인 함수보다 위에서 정의되어 있어야한다.

 - 메인 함수보다 아래에 있는 경우, 함수가 인식되지 않고 오류가 발생한다.

 

--예문 코드 보기--

더보기
#include <stdio.h>

//함수는 기본적으로 메인 함수보다 위에 있어야한다.
void test1(){
	printf("test().....\n");
}

int test2(){
	printf("test2().....\n");
	return 100;
}

void test3(int x){
	printf("test3(%d).....\n",x);
}

int test4(int x){
	printf("test4(%d).....\n",x);
	return 1000;
}

int main(int argc, char **argv)
{
	printf("function...\n");

	test1();
	printf("test2()...%d\n",test2());
	test3(999);
	printf("test4(777)...%d\n",test4(777));
	
	return 0;
}

 

 

-----------------------------------------------

 

# function : 함수 - 2. 추상매소드화(?) 

//함수 구현부를 main() 아래에 놓고, 위에서 추상매소드처럼 부를 수도 있다.

 - 함수의 바디 없이 반환 타입과 함수명을 맞춰서 콜해주면 된다.

 - 매개변수는 작성하지 않아도 문제는 없지만, 나중에 헷갈릴 수 있어 적어주는 습관을 들이는 것이 좋다.

 

--예문 코드 보기--

더보기
#include <stdio.h>

//함수는 기본적으로 메인 함수보다 위에 있어야한다.
//추상매소드 처럼 구현부를 아래에 놓고, 위에서 먼저 불러도 된다.
// >> 바디가 없이 반환 타입과 함수명을 입력하여 함수를 콜 해주면 된다.
void test1();
int test2();
void test3(); //안에 매개변수가 없어도 문제되지 않는다.
//void test3(int x);
int test4();
//int test4(int x); 

int main(int argc, char **argv)
{
	printf("function...\n");
	
	test1();
	printf("test2()...%d\n",test2());
	test3(999);
	printf("test4(777)...%d\n",test4(777));
	
	return 0;
}

void test1(){
	printf("test().....\n");
}

int test2(){
	printf("test2().....\n");
	return 100;
}

void test3(int x){
	printf("test3(%d).....\n",x);
}

int test4(int x){
	printf("test4(%d).....\n",x);
	return 1000;
}

 

 

-----------------------------------------------

 

# function : 함수 - 3. 함수 안에 함수 

//inner function - 함수 안에 함수를 만들 수 있다.
-  함수 안에서 만들어진 함수는 밖에서 콜할 수 없다.

 

--예문 코드 보기--

더보기
#include <stdio.h>

int main(int argc, char **argv)
{
	printf("function...\n");
	
	//inner function - 함수 안에 함수를 만들 수 있다.
	void test01(){
		printf("test01()...\n");
		void sleep(){
		printf("sleep()....\n");
		}
		sleep();
	}
	test01();
	//sleep();//error >> 함수 안에서 만들어진 함수는 밖에서 콜할 수 없다.
	
    
	return 0;
}

 

 

-----------------------------------------------

 

# function : 함수 - 4. 함수를 인수(arguments)로 

//test01 : test01({1,2,3})처럼 배열 원소를 직접 넣으면, error가 나므로 배열을 초기화한 뒤, 배열 변수로 입력해야 한다.

 - test01(sus); >> 함수의 변수로 넘겨주는 경우, 받는 함수(test01())에서는 배열변수의 시작 주소값이 넘어온다.

//함수를 콜해서 받아온 배열 변수"sus"에는 배열 원소값이 아닌, sus 배열의 시작 주소값만 넘어오게 된다.

 - sus[ ] 로 빈값을 넣어서 콜하기 때문이다. >> 하지만 넣어도 큰 의미는 없다.

 - 배열변수의 주소 값만 받아온 상태로는 sizeof(sus)로 크기 체크가 불가하다. >> #define을 통해 별도로 불러와야한다.

//test02 : 배열 변수는 배열의 주소값을 가지므로, 포인터 변수의 값으로 할당할 수 있다. 

 - printf로 주소를 출력할 때는 %p로 한다. 

//문자열로 이루어진 배열은 문자열 한 덩어리를 %s로 한 번에 출력할 수 있다.

 - char* 타입은 %s로 받는다고 생각하면 편하다.

//값이 없는 방을 제외하고 값이 있는 방만 출력하고 싶다면, strlen()을 이용하면된다. 

 

--예문 코드 보기--

더보기
#include <stdio.h>
#include <string.h>

#define SUS_LENGTH 5
#define NAME_LENGTH 5
void test01(int sus[]);
int* test02();
void test03(char name[]);
char test04();
char* test05();

int main(int argc, char **argv)
{
	printf("function...arguments \n");
	
	printf("=======test01======= \n");
	int sus[SUS_LENGTH] = {11,22,33,44,55};
	//sus = {1,2,3} //이렇게 바로 배열 전체를 넣을 수 없듯이,
	//test01({1,2,3}) //error 가 나므로 아래처럼 값을 줘야한다.
	printf("sus()...%p\n",sus);
	printf("sus length...%d\n",sizeof(sus)); 
	test01(sus); // sus == array address
	
	printf("=======test02======= \n");
	//배열은 주소값으로 가지고 있으므로 포인터 변수의 값으로 배열을 지정할 수 있다. 
	sus[SUS_LENGTH] = *test02();
	for(int i=0;i<SUS_LENGTH;i++){
		printf("test02()...%d\n",sus[i]);
	}
	
	printf("=======test03======= \n");
	char name[NAME_LENGTH] = "LEE";
	test03(name);
	
	printf("=======test04======= \n");
	printf("test04()...%c\n",test04());
	
	printf("=======test05======= \n");
	printf("test05()...%s\n",test05());//char* 타입은 %s로 받는다고 생각하면 편하다.
	
	return 0;
}//end main()

void test01(int sus[]){//array address
	printf("test01()...%p\n",sus);//main함수에서 초기화된 sus배열 주소값이 넘어온다.
	//printf("sus length...%d\n",sizeof(sus)/sizeof(int));
	//sus 배열값이 아닌, sus의 주소값만 넘어오기 때문에 사이즈체크가 불가능하다.
	printf("sus length...%d\n",SUS_LENGTH); 
		for(int i=0;i<SUS_LENGTH;i++){
			printf("sus[%d]:%d\n",i,sus[i]);
		}
}

int* test02(){
	int sus[SUS_LENGTH] = {11,22,33,44,55};
	int *pt = sus;
	return pt;
}

void test03(char name[]){
	printf("name()...%s\n",name);
	//값이 있는 방만 출력하기 위해 strlen()사용
	for(int i=0;i<strlen(name);i++){
			printf("name[%d]:%c\n",i,name[i]);
	}
}

char test04(){
	printf("test04()...\n");
	return 'A';
}

char* test05(){
	printf("test05()...\n");
	return "AAA";
}

 


#custom header - 다른 파일에 있는 함수를 끌어오는 방법

//직접 만든 헤더는 " "로 불러온다.

 - 깨끗한 화면에 소스코드만 작성하면 된다.

 - 확장자는 .h로 한다.

좌측부터, 헤더파일 / 메인 소스코드 / 실행결과

 

--예문 코드 보기--

더보기
/////////////////////헤더 파일///////////////////////////
int su = 999;
static int su2 =888;

void test1(){
	printf("test().....\n");
}

int test2(){
	printf("test2().....\n");
	return 100;
}

void test3(int x){
	printf("test3(%d).....\n",x);
}

int test4(int x){
	printf("test4(%d).....\n",x);
	return 1000;
}

/////////////////////소스 파일///////////////////////////
#include <stdio.h>
#include "c29header.h" //직접 만든 헤더는 " "로 불러온다.


int main(int argc, char **argv)
{
	printf("custom  header file...\n");
	
	printf("su: %d\n", ++su);
	printf("su: %d\n", ++su);
	
	printf("su2: %d\n", ++su2);
	printf("su2: %d\n", ++su2);
	
	test1();
	
	printf("test2()...%d\n",test2());
	
	test3(999);
	
	printf("test4(777)...%d\n",test4(777));
	
	
	return 0;
}