블로그 이미지
하루, 글. 그림. 영상매체. 표현을 도와주는 기기들. 도전 중. 동화다아아
    동화다아아

    카테고리

    분류 전체보기 (176)
    잡담 (1)
    IT 기기-리뷰&뉴스 (7)
    리뷰 - 도서 (1)
    리뷰 - 영상 (0)
    리뷰 - 그림/음악 (1)
    내장형 하드웨어 (163)
    Total
    Today
    Yesterday
     

    - 수학 함수 (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

     




    Posted by 동화다아아
    , |

    최근에 달린 댓글

    최근에 받은 트랙백

    글 보관함