Call by Value 로의 함수 호출은 일반적으로 많이 사용해 왔고
그닥 설명이랍시고 달지 않아도 어떤 개념인지 알 듯 하여
주소값(포인터)을 가르키고 그 주소값에 인자를 전달하여 함수를 호출하고
값을 가지고 도는 Call by Reference 프로그램을 작성하여 연습해 본다.
그닥 설명이랍시고 달지 않아도 어떤 개념인지 알 듯 하여
주소값(포인터)을 가르키고 그 주소값에 인자를 전달하여 함수를 호출하고
값을 가지고 도는 Call by Reference 프로그램을 작성하여 연습해 본다.
-
#include <stdio.h>
-
#include <string.h>
-
-
int Menu(int *j, char (*emp_no)[7], char (*name)[20], char (*gender)[10], char (*jik)[20])
-
/* int값을 바라보는 포인터로써 *을 써주고, 배열의 인자크기를 선언함으로 2차원 배열임을
기술하는 의미로 형선언 후 행을 가르키는 의미로 *와 인자의 크기를 뒤에 기재
: (*emp_no)=emp_no[] */ -
{
-
int num; /* 지역변수 */
-
-
while(1)
-
{
-
scanf("%d", &num);
-
-
switch(num)
-
{
-
case 1:
-
List(j, emp_no, name, gender, jik);
/* j의 포인터형을 Menu에서 값을 받아와서 j 로 선언 무방 */ -
break;
-
case 2:
-
Src(emp_no, name, gender, jik);
-
break;
-
case 3:
-
Add(j, emp_no, name, gender, jik);
-
break;
-
case 4:
-
Edit(emp_no, name, gender, jik);
-
break;
-
case 5:
-
Del(j, emp_no, name, gender, jik);
-
break;
-
case 0:
-
system("pause");
-
return 0;
-
default:
-
}
-
}
-
}
-
int ClearEnter(void) /* 엔터버림 */
-
{
-
while(getchar()!='\n');
-
}
-
int Add(int *j, char (*emp_no)[7], char (*name)[20], char (*gender)[10], char (*jik)[20])
-
{
-
char ans; /* Yes or No */
-
int i; /* 중복체크용 변수 선언 */
-
int p; /* 기존 지역변수로 j값을 썼던 것을 대체 */
-
-
/* j값을 지역변수로 쓰면 안됨.. */
-
for(p=0; p<5; p++) /* 배열의 행값 증가 */
-
{
-
if(p>4) /* 5개 이상 등록되지 않도록 막음 */
-
/* emp_no[p]의 값이 NULL과 같다면 0 */
-
/* strcmp(s1, s2); : 0(s1=s2), -(s1>s2), +(s1<s2) */
-
/* 아래는 !0 : 0이 아니라면, 즉 같지 않다면, emp_no[p]가 빈값이 아니라면 */
-
else if(!strcmp("", emp_no[p]))
-
{
-
while(1)
-
{
-
if(p>4 || strcmp("", emp_no[p]))
/* emp_no[p]가 빈값이 아니거나 p가 4보다 크다면 */ -
break;
-
scanf("%s", emp_no[p]); /* 문자열은 엔퍼센트 연산자를 붙이지 않음 */
-
-
ClearEnter();
-
-
for(i=1; i<5; i++) /* 사번 중복체크 구간 시작 */
-
if(!strcmp(emp_no[p], emp_no[p-i]))
-
{
-
/* 이미등록된 사번임을 체크했지만 65행에서 그 값을 입력받았으므로 초기화 함 */
-
memset(emp_no[p],0x00,sizeof(emp_no[p]));
-
return 1;
-
} /* 사번중복체크 구간 끝 */
-
scanf("%20s", name[p]);
-
scanf("%10s", gender[p]);
-
scanf("%20s", jik[p]);
-
-
ClearEnter();
-
-
while(1)
-
{
-
scanf("%c", &ans);
-
if(ans=='y'||ans=='Y'||ans=='\n') /* y or Y or Enter */
-
{
-
(*j)++; /* *j++ : 주소값(e.g.> 0x02...)을 1증가함 */
-
break; /* 현재 while문을 빠져나가므로 61행의 while문으로 이동 */
-
}
-
else if(ans=='n'||ans=='N')
-
{
-
(*j)++; /* (*j)++ : j의 주소를 가르키는 값을 1증가함 */
-
return 1;
/* 현재 함수를 빠져나가고 (현재는)의미없는 1값을 호출한 함수에 반환 */ -
}
-
else
-
}
-
}
-
}
-
}
-
if(p>4)
-
}
-
-
int List(int *j, char (*emp_no)[7], char (*name)[20], char (*gender)[10], char (*jik)[20])
-
/* char (*name)[20] : 2차원 배열의 포인터형 */
-
{
-
int mm; /* 배열의 포인터값 증가 변수 */
-
-
for(mm=0; mm<5; mm++)
/* 배열의 주소에 값이 없을 때 리스트가 출력되지 않도록 하기 위함 */ -
{
-
if(strcmp("", emp_no[mm])) /* emp_no[mm]의 값이 NULL이 아닐 때 */
-
{
-
/* emp_no[mm] : 주소값을 가르킴 */
-
}
-
else /* emp_no[mm]의 값이 NULL일 때 */
-
{
-
}
-
}
-
-
if(*j<=0) /* j 주소의 값이 0이거나 0보다 작을 때 이면 추가되지 않았거나 삭제되어
데이터가 없을 때 */ -
{
-
}
-
system("pause");
-
}
-
-
int Src(char (*emp_no)[7], char (*name)[20], char (*gender)[10], char (*jik)[20])
-
{
-
char no_src[20]; /* 검색할 사번을 입력받을 1차원 배열의 변수 선언 */
-
int k=0, g=0;
/* k:배열의 주소값을 가르키는 행값 증가용 변수, g:strcmp의 값을 담을 변수 */ -
-
scanf("%s", no_src);
-
ClearEnter();
-
-
for(k=0; k<5; k++)
-
{
-
g=strcmp(no_src, emp_no[k]);
-
-
if(g==0)
-
break;
-
}
-
if(g>0 || g<0)
-
{
-
return 1;
-
}
-
}
-
-
int Edit(char (*emp_no)[7], char (*name)[20], char (*gender)[10], char (*jik)[20])
-
{
-
char no_edit[20];
-
int k=0, g=0, e_num;
-
-
scanf("%s", no_edit);
-
ClearEnter();
-
-
for(k=0; k<5; k++)
-
{
-
g=strcmp(no_edit, emp_no[k]);
-
-
if(g==0)
/* g값이 0이라는 것은 입력한 사번과 emp_no[k]의 값이 같다는 것을 의미하므로 */ -
break; /* 현재 반복문을 빠져 나가면 아래 while 문으로 이동 */
-
}
-
if(g>0 || g<0)
-
{
-
return 1;
-
}
-
while(1)
-
{
-
scanf("%d", &e_num);
-
-
switch(e_num)
-
{
-
case 1:
-
scanf("%20s", name[k]);
-
return 1;
-
case 2:
-
scanf("%20s", gender[k]);
-
return 1;
-
case 3:
-
scanf("%20s", jik[k]);
-
return 1;
-
case 4:
-
scanf("%20s", name[k]);
-
scanf("%20s", gender[k]);
-
scanf("%20s", jik[k]);
-
return 1;
-
case 5:
-
return 1;
-
default:
-
}
-
}
-
}
-
int Del(int *j, char (*emp_no)[7], char (*name)[20], char (*gender)[10], char (*jik)[20])
-
{
-
char no_del[20]; /* 사번을 입력 받는 1차원 배열 변수 */
-
int k=0, g=0;
-
char d_ans;
-
-
scanf("%s", no_del);
-
ClearEnter();
-
-
for(k=0; k<5; k++)
-
{
-
g=strcmp(no_del, emp_no[k]);
-
-
if(g==0)
-
{
-
break;
-
}
-
}
-
if(g>0 || g<0)
-
{
-
return 1;
-
}
-
while(1)
-
{
-
scanf("%c", &d_ans);
-
-
if(d_ans=='y'||d_ans=='Y'||d_ans=='\n')
-
{
-
-
memset(&emp_no[k],0x00,sizeof(emp_no[k]));
/* 0x00 으로 초기화 하여 데이터 삭제 */ -
memset(&name[k],0x00,sizeof(name[k]));
-
memset(&gender[k],0x00,sizeof(gender[k]));
-
memset(&jik[k],0x00,sizeof(jik[k]));
-
(*j)--;
-
break;
-
}
-
else if(d_ans=='n'||d_ans=='N')
-
{
-
return 1;
-
}
-
else
-
{
-
}
-
}
-
}
-
void HowTo(void)
-
{
-
}
-
int main(void)
-
{
-
/* 전역변수로 사용하던 것을 메인에 선언 */
-
char emp_no[5][7]; /* 2차원 배열 선언 */
-
char name [5][20];
-
char gender[5][10];
-
char jik [5][20];
-
int j=0,m=0;
-
-
/* 변수값 초기화, 메모리를 지정한 문자열로 채움: memset */
-
/* memset(채울메모리주소, 채울문자, 채울문자의개수) */
-
for(j=0; j<5; j++)
-
{
-
memset(emp_no[j],0x00,sizeof(emp_no[j])); /* NULL 값 초기화 */
-
memset(name[j],0x00,sizeof(name[j]));
-
memset(gender[j],0x00,sizeof(gender[j]));
-
memset(jik[j],0x00,sizeof(jik[j]));
-
}
-
-
j=0; /* j값 = 열의 행번호를 증감시킬 변수 */
-
/* 함수 호출. 프로그램 시작 */
-
HowTo(); /* 프로그램 소개글 호출 */
-
Menu(&j, emp_no, name, gender, jik); /* j의 주소값을 참조함 : &j */
-
/* 2차원 배열은 상단에 선언으로 이미 주소값을 가짐. 변수명만 기입해도 무방 */
-
return 0;
-
}
'C' 카테고리의 다른 글
c 표준 라이브러리 함수 (0) | 2012.03.30 |
---|---|
\n (0) | 2012.03.19 |