함수 포인터 Programming/C 2015. 8. 27. 10:32

Ⅰ. 함수 포인터 


함수 포인터를 정의 내리기 전에 먼저 포인터에 대해 다시 한번 생각해 보도록 합시다.

포인터란 특정 변수에 대한 메모리 주소를 담을 수 있는 변수를 포인터 변수라고 합니다.


그렇다면 함수 포인터는 무엇일까요?  

함수 포인터란, 특정 함수에 대한 메모리 주소를 담을 수 있는 것입니다.


🃟 함수 포인터를 사용하는 이유는 무엇일까요?


🀱 프로그램 코드가 간결해 집니다.

🀲 함수 포인터를 배열에 담아서도 사용이 가능하므로 중복되는 코드를 줄일 수 있습니다.

🀳 상황에 따라 해당되는 함수를 호출 할 수 있어 유용합니다.




​Ⅱ. 함수 포인터의 사용

 

함수 포인터의 모양은 자료형 (*함수 포인터 이름) (자료형) 의 형식으로 사용합니다.

만약 함수들이 아래와 같은 경우


int (*FuncPtr) (int a, int b);

int add(int a,int b);

double div(double a,double b);


1. FuncPtr = add 

2. FuncPtr = &add

3. FuncPtr = div

4. FuncPtr = add()


다음 중 한가지 경우로 사용한다면, 1번과 2번은 괜찮은 방법이나 3번은 자료형이 다르기 때문에,

4번은 결과 값이 함수의 리턴 값이 되므로 안됩니다.



​Ⅲ. 함수 포인터 예제 




#include <stdio.h>



typedef int (*calcFuncPtr)(int, int);




int plus (int first, int second)

{

    return first + second;

}


int minus (int first, int second)

{

    return first - second;

}


int multiple (int first, int second)

{

    return first * second;

}


int division (int first, int second)

{

    return first / second;

}


int calculator (int first, int second, calcFuncPtr func)

{

    return func (first, second);

}


int main(int argc, char** argv)

{

    calcFuncPtr calc = NULL;

    int a = 0, b = 0;

    char op = 0;

    int result = 0;

    

    printf("Input : ");

    scanf ("%d %c %d", &a, &op, &b);

    

    switch (op)

    {

        case '+' :

            calc = plus;

            break;

            

        case '-':

            calc = minus;

            break;

            

        case '*':

            calc = multiple;

            break;

            

        case '/':

            calc = division;

            break;

    }

    

    result = calculator (a, b, calc);

    

    printf ("result : %d", result);

    

    return 0;

}



위의 코드는 함수 포인터를 사용한 계산기 코드입니다.


<실행 결과>







다음과 같이 정상적으로 작동 합니다.


 



'Programming > C' 카테고리의 다른 글

[ 선린 ] Pointer 과제  (0) 2015.08.31
[ Project ] Wild!  (0) 2015.08.27
[ Project ] Stack_Linked List  (0) 2015.08.27
연결 리스트 ( Linked List )  (0) 2015.08.27
구조체 ( Struct )  (0) 2015.08.27
[ Project ] Wild! Programming/C 2015. 8. 27. 10:29

프로젝트 명 : Wild!


< 프로젝트 설명 >


이 프로젝트는 C로 게임을 만들어 놓은 것으로, 조건문을 많이 써서 만들었습니다.

게임 밸런스라던가 난이도가 이상하고, 배운 것을 제대로 사용해 보지도 않아서 아쉬운 점이 많습니다.

다음에 다시 보완해볼 생각입니다.


< 소스 코드 >


#include <stdio.h>

#include <stdlib.h>


unsigned int choose=0,EXP=1000,boss;

unsigned int atk=25,hp=70,e_atk,g_exp=0,postion=3;

int bhp,e_hp;


void hunt(void)

{

    boss=rand()%100;

    if(boss>=95)

    {

        printf("_____________________________________________________\n\n");

        printf("BOSS 야생 짐승이 나타났습니다!!!!!!\n\n");

        getchar();

        e_hp=(rand()%(hp*3)+120)*3;

        e_atk=(rand()%atk+atk)*3;

        printf("명칭 : \n체력 : %d\n공격력 : %d\n\n",e_hp,e_atk);

        bhp=hp;

        atk=atk+(rand()%10-5);

    }

    else{

        printf("______________________________________________________\n\n");

        printf("야생의 짐승이 나타났다!!!\n\n");

        getchar();

        e_hp=hp+(rand()%hp-rand()%(hp/2));

        e_atk=atk+(rand()%atk-rand()%(atk/2));

        printf("명칭 : 야생짐승\n체력 : %d\n공격력 : %d\n\n",e_hp,e_atk);

        bhp=hp;

        atk=atk+(rand()%10-5);

    }

    while(1)

    {

        printf("_______________________적의 ______________________\n\n\n");

        getchar();

        bhp-=e_atk;

        if(bhp<0)

            bhp=0;

        printf("야생 짐승에게서 %d 데미지를 입었다.\n남은 HP : %d\n\n",e_atk,bhp);

        if(bhp==0&&postion>0)

        {

            printf("고기를 먹겠습니까? (남은 수량 : %d)(YES : 1, NO : 0) :",postion);

            scanf("%d",&choose);

            if(choose==1)

            {

                bhp+=rand()%10+1;

                postion-=1;

            }

        }

        getchar();

        if(bhp==0)

        {

            printf("사냥에 실패하였습니다.\n보금자리로 돌아가 몸을 추스리십시오.\n");

            getchar();

            break;

        }

        else{

            printf("____________________나의 ____________________\n\n\n");

            getchar();

            e_hp-=atk;

            if(e_hp<0)

                e_hp=0;

            printf("야생 짐승에게 %d 데미지를 입혔다.\n남은 적의 HP : %d\n\n",atk,e_hp);

            getchar();

            if(e_hp==0)

            {

                if(boss>95){

                    g_exp=rand()%9000+100;

                }

                else

                    g_exp=rand()%100+100;

                printf("사냥에 성공하였습니다.\n획득 경험치 : %d",g_exp);

                getchar();

                EXP+=g_exp;

                break;

            }

        }

    }

}


void UPgrade(void)

{

    int meet;

    printf("_____________________ _____________________\n\n");

    printf("1. 할퀴기 : 1000EXP\n2. 물어뜯기 : 3000EXP\n3. 숨통끊기 : 5000EXP\n4 (Special) . 흉폭화 : 10000EXP\n\n");

    printf("5.  육체 : 1000EXP\n6. 질긴 가죽 : 3000EXP\n7. 강인함 : 5000EXP\n8 (Special) . 거대화 : 10000EXP\n9. 고기 : 75EX\n\n0. 나가기\n\n");

    printf("입력 : "); scanf("%d",&choose);

    switch(choose)

    {

        case 1: if(EXP>=1000) {EXP-=1000; atk+=5;} else printf("EXP 부족합니다. \n\n"); break;

        case 2: if(EXP>=3000) {EXP-=3000; atk+=17;} else printf("EXP 부족합니다. \n\n"); break;

        case 3: if(EXP>=5000) {EXP-=5000; atk+=33;} else printf("EXP 부족합니다. \n\n"); break;

        case 4: if(EXP>=10000) {EXP-=10000; atk*=2;} else printf("EXP 부족합니다. \n\n"); break;

        case 5: if(EXP>=1000) {EXP-=1000; hp+=15;} else printf("EXP 부족합니다. \n\n"); break;

        case 6: if(EXP>=3000) {EXP-=3000; hp+=50;} else printf("EXP 부족합니다. \n\n"); break;

        case 7: if(EXP>=5000) {EXP-=5000; hp+=100;} else printf("EXP 부족합니다. \n\n"); break;

        case 8: if(EXP>=10000) {EXP-=10000; hp*=2;} else printf("EXP 부족합니다. \n\n"); break;

        case 9: printf("\n 개를 구매하시 겠습니까? "); scanf("%d",&meet);

                if(postion+meet>20)

                    printf("최대 한도 개수를 초과 하였습니다. \n\n");

                else

                {

                    if(EXP>=75*meet)

                    {

                        postion+=meet; EXP-=75*meet;

                    }

                    else

                        printf("EXP 부족합니다. \n\n");

                } break;

        default:;

    }

}


void SELECT(void)

{

    while(1)

    {

        printf("_____________________ _____________________\n\n");

        printf("\n\n1. 사냥\n2. 업그레이드\n\nEXP : %d\nATK : %d\nHP : %d\n고기 개수 : %d\n\n선택 : ",EXP,atk,hp,postion);

        scanf("%d",&choose);

        if(choose==1)

            hunt();

        else if(choose==2)

            UPgrade();

        else

            printf("재선택");

    }

    

}


int main (void)

{

    char name[20];

    printf("PRESS ENTER\n\n");

    getchar();

    while(choose==0)

    {

        printf("캐릭터 명은 무엇입니까?\t");

        scanf("%s",name);

        printf("\n%s () 맞습니까? (Yes : 1, NO : 0)  ",name);

        scanf("%d",&choose);

    }

    printf("\n\n__________________GAME START__________________\n\n");

    SELECT();

    

    return 0;

 

}

'Programming > C' 카테고리의 다른 글

[ 선린 ] Pointer 과제  (0) 2015.08.31
함수 포인터  (0) 2015.08.27
[ Project ] Stack_Linked List  (0) 2015.08.27
연결 리스트 ( Linked List )  (0) 2015.08.27
구조체 ( Struct )  (0) 2015.08.27

프로젝트 명 : Stack_Linked List


< 프로젝트 설명 >


이 프로젝트는 스택과 Linked List를 같이 써서 구현한 프로젝트입니다.

이 프로젝트를 통해 스택과 Linked List가 어떻게 돌아가는 지 볼 수 있습니다.


< 소스코드 >


#include <stdio.h>


#include <stdlib.h>




typedef struct NODE


{

    

    int data;

    

}NODE;




NODE* node;


int length=0;


int range=0;




void RANGE(void);


void push(int n);


void pop(void);


void PRINT(void);




int main(void)


{

    

    int i;

    

    RANGE();

    

    for(i=0;i<20;i++)

        

    {

        

        push(i);

        

    }

    

    PRINT();

    

    for(i=0;i<=20;i++)

        

    {

        

        pop();

        

    }

    

    PRINT();

    

    

    

}




void push(int n)


{

    

    if(range<=length)

        

    {

        

        printf("OVER FLOW\n");

        

    }

    

    

    

    else

        

    {

        

        length++;

        

        node=(NODE*)realloc(node,sizeof(NODE)*length);

        

        node[length-1].data=n;

        

    }

    

}




void pop()


{

    

    if(length!=0)

        

    {

        

        length--;

        

        node=(NODE*)realloc(node,sizeof(NODE)*length);

        

    }

    

    else

        

        printf("EMPTY\n");

    

}




void PRINT (void)


{

    

    int i;

    

    for(i=0;i<length;i++)

        

        printf("%d 번째 출력 : %d\n",i+1,node[i]);

    

    printf("\n");

    

}




void RANGE(void)


{

    

    printf("STACK 크기는 몇으로 지정하시겠습니까? : ");

    

    scanf("%d",&range);

    

 

}

'Programming > C' 카테고리의 다른 글

함수 포인터  (0) 2015.08.27
[ Project ] Wild!  (0) 2015.08.27
연결 리스트 ( Linked List )  (0) 2015.08.27
구조체 ( Struct )  (0) 2015.08.27
Stack과 Queue  (0) 2015.08.26