linked list로 구현된 동적할당 malloc을 사용하는 구조체... 문제..
사실 배열로도 구현이 되긴하나 이 바로 이전 포스트에서 본듯이;;;
뭔가 어정쩡해지는게 있어서;;;
암튼 링크드 리스트로 구현된 자판기...
추가 삭제 수정 가능 잘만 응용하면 성적처리, 연락처, 주소록 등으로도 포팅 가능할듯...
드디어 하루가 넘는 레폿이 나오기 시작...
레폿의 난이도는 누구 말대로 익스포넨셜 하게 증가 한다 ㅜㅜ
닫아주셈;;; Code Type : C
/////////////////////////////////////////
// 2007년 04월 08일 고급프로그래밍 //
// Coded By 오형탁 Ohyung (2002711158) //
// ohyung@ohyung.com http://ohyung.com //
/////////////////////////////////////////
/*<<<<<<<<<헤더파일부분>>>>>>>>>>*/
#include < stdlib.h>
#include < stdio.h>
#include < string.h>
// 구조체를 만든다. ITEMS로 크게 잡고 LINK로 연결
typedef struct item{
char name[20];
int cost;
struct item *next;
}ITEMS, *LINK;
LINK head = NULL; // 머리용
LINK new = NULL; // 추가용
LINK del = NULL; // 삭제용
LINK current = NULL; // 현재용
int total=0,now=0;
void insert(char *name,int cost) // NULL이 발견될때까지 노드를 찾아가다가 마지막에서 할당받고, 이름과 가격을 넣고, 마지막엔 NULL을 넣는다.
{
current = head;
while (current->next != NULL)
{
current = current->next;
}
new = (LINK)malloc(sizeof(ITEMS));
current->next = new;
new->next = NULL;
strcpy(new->name, name);
new->cost=cost;
now++;
}
void menu() // 간단하게 NULL까지 증가시키면서 출력
{
printf("-----------------------------------------------------------------------------\n\t\t\tVending Marchine\n-----------------------------------------------------------------------------\n");
printf(":Product:| ");
current = head;
while (current != NULL)
{
printf("%8s|", current->name);
current = current->next;
}
printf("\n: Price :| ");
current = head;
while (current != NULL)
{
printf("%8d|", current->cost);
current = current->next;
}
printf("\n-----------------------------------------------------------------------------\nMode Selection\n1:투입, 2:구입, 3:반환\nA.제품추가,B.제품삭제,C.제품수정\n");
}
void buy()
{
int sel=0,sel2=0,choose=0,i=0;
while (sel<=0||sel>now+1)
{
printf(" >> 제품을 선택하세요 : ");
scanf("%d", &sel);
fflush(stdin);
}
current = head;
for(i=0;i<=sel-2;i++)
current = current->next;
printf(" '%s'의 수량 (개당 %d원) : ",current->name,current->cost);
scanf("%d", &sel2);
fflush(stdin);
choose=current->cost;
if (total<(choose*sel2))
printf("* %d원이 부족합니다. 투입 또는 반환을 선택하세요.\n",(choose*sel2)-total);
else
{
total-=(choose*sel2);
printf(" 현재 남아있는잔액 : %d원\n",total);
}
}
void main()
{
int i_money=0,i=0,j=0,sel=0,sel2=0,choose=0,temp=0,i_cost=0;
char i_mode='0',i_item[20],i_mitem[20];
// 초기 세팅
new = (LINK)malloc(sizeof(ITEMS));
new->next = head;
head = new;
strcpy(new->name, "Milk Coffee");
new->cost = 400;
insert("Orange",500);
insert("Coke",400);
//메뉴 호출
menu();
//루프내에서 메뉴선택
while(1)
{
printf(">>Select the mode : ");
gets(&i_mode);
if(i_mode=='1') // 코인넣고 바이
{
printf(" >> Insert the Coin : ");
scanf("%d", &i_money);
fflush(stdin);
total+=i_money;
buy();
}
else if(i_mode=='2') // 노말한 바이
{
buy();
}
else if(i_mode=='3') // 종료함.
{
printf("%d원 반환완료. Vending Machine을 종료합니다.\n",total);
exit('0');
}
else if(i_mode=='a' || i_mode=='A') // 입력부
{
temp=now;
printf(" >> 추가제품명 : ");
gets(&i_item);
current = head;
while (current != NULL)
{
if(strcmp(i_item,current->name)==0)
{
printf("기존에 있던 제품명과 동일합니다.\n");
temp=-1;
break;
}
current = current->next;
}
if(temp!=-1)
{
printf(" >> 가격 : ");
scanf("%d",&i_cost);
fflush(stdin);
insert(&i_item,i_cost);
}
menu();
}
else if(i_mode=='b' || i_mode=='B') // 삭제부
{
printf(" >> 삭제할 제품명 : ");
gets(&i_item);
temp=now;
current = head;
while (current != NULL)
{
if(strcmp(i_item,current->name)==0)
{
temp--;
break;
}
del=current;
current = current->next;
}
if (temp==now) // 미발견시
printf("그런 제품명은 없습니다.\n");
else //발견 했다면면
{
if(current==head)
{
head=current->next;
free(current);
}
else
{
del->next=current->next;
free(current);
}
now--;
}
menu();
}
else if(i_mode=='c' || i_mode=='C') // 수정부
{
temp=now; //원래 now의 값을 temp에 임시저장
printf(" >> 수정할 제품명 : ");
gets(&i_item);
current = head;
while (current != NULL)
{
if(strcmp(i_item,current->name)==0)
{
temp--;
break;
}
current = current->next;
}
if (temp==now)
printf("그런 제품명은 없습니다.\n");
else
{
printf(" >> 수정될 제품명 : ");
gets(&i_mitem);
current = head;
while (current != NULL)
{
if(strcmp(i_mitem,current->name)==0)
{
printf("기존에 있던 제품명과 동일합니다.\n");
temp=-1;
break;
}
current = current->next;
}
if(temp!=-1)
{
temp=now;
current = head;
while (current != NULL)
{
if(strcmp(i_item,current->name)==0)
{
temp--;
break;
}
current = current->next;
}
printf(" >> 가격 : ");
scanf("%d",&i_cost);
fflush(stdin);
strcpy(current->name, i_mitem);
current->cost=i_cost;
}
}
menu();
}
i_mode=0;
}
}
닫아주셈;;;
뭐 깔끔하게 빼기위해서 링크드 리스트로 작성하였지만..
배열로도 충분히 가능한것으로 알고 있음...;;;