#정리
# 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_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;
}