검색결과 리스트
글
Ⅰ. 함수 포인터
함수 포인터를 정의 내리기 전에 먼저 포인터에 대해 다시 한번 생각해 보도록 합시다.
포인터란 특정 변수에 대한 메모리 주소를 담을 수 있는 변수를 포인터 변수라고 합니다.
그렇다면 함수 포인터는 무엇일까요?
함수 포인터란, 특정 함수에 대한 메모리 주소를 담을 수 있는 것입니다.
🃟 함수 포인터를 사용하는 이유는 무엇일까요?
🀱 프로그램 코드가 간결해 집니다.
🀲 함수 포인터를 배열에 담아서도 사용이 가능하므로 중복되는 코드를 줄일 수 있습니다.
🀳 상황에 따라 해당되는 함수를 호출 할 수 있어 유용합니다.
Ⅱ. 함수 포인터의 사용
함수 포인터의 모양은 자료형 (*함수 포인터 이름) (자료형) 의 형식으로 사용합니다.
만약 함수들이 아래와 같은 경우
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 |
설정
트랙백
댓글
글
프로젝트 명 : 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 |
RECENT COMMENT