|
http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=3395 [복사]
편의점 물품 추가 / 삭제 / 수정/ 판매등록 하고 판매 종료시 결산하는 파일을 만드는
프로그램을 만들고있는데요;;
다른건 보실필요없고,, 실행해보시면 6번 판매시작하면 에러가 뜨네요...
왜 그런지 혹시 이유아시는분 있으신가요....?
소스가 좀 많아서 보기 힘들줄 알지만... 제 머리론 안되서
도움청합니다. 부탁드립니다. 고수님들 !!!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
void ADD(void);
void EDIT(void);
void DELETE(void);
void SEARCH(void);
void SALE(void);
void PRINT(void);
void file_loads(void);
void file_save(void);
void sale_end(void);
void cls(void)
{
system("cls");
}
struct Store
{
char name[20];
int price;
int amount;
};
typedef struct _Stock
{
char name[20];
int price;
int amount;
}Stock;
typedef struct Link
{
struct Store Data;
struct Link* Next;
}Link;
void updateStockSales(Stock *pStock);
void saveSalesList(Stock *pStock, int *psalesQuantity);
Stock* makeStockArray(void);
int searchIndexByName(Stock *pStock, char *salesName);
Link* pos=NULL;
static int cnt;
int main()
{
file_loads();
int n;
while(1)
{
cls();
puts(" \t\t ****** MENU ******");
puts(" \t\t 1번 : 물품 추가");
puts(" \t\t 2번 : 물품 수정");
puts(" \t\t 3번 : 물품 삭제");
puts(" \t\t 4번 : 물품 검색");
puts(" \t\t 5번 : 물품 출력 ");
puts(" \t\t 6번 : 판매 시작");
puts(" \t\t 7번 : 판매 종료");
puts(" \t\t ******************");
printf(" \t\t Choice(선택)[ ]\b\b\b");
scanf("%d", &n);
switch(n)
{
case 1: ADD();
file_save();break;
case 2: EDIT();
file_save();break;
case 3: DELETE();
file_save();break;
case 4: SEARCH();break;
case 5: PRINT();break;
case 6: SALE();break;
case 7: sale_end();
printf("\n\n\t데이터를 저장합니다.\n");
return 0;
}
}
return 0;
}
void ADD()
{
Link* add;
add=(Link*) malloc(sizeof(Link));
cls();
fflush(stdin);
printf("\n\t 추가할 물품을 입력하세요 : ");
gets(add->Data.name);
printf("\n\t 물품의 가격을 입력하세요 : ");
scanf("%d", &add->Data.price);
fflush(stdin);
printf("\n\t 물품의 수량을 입력하세요 : ");
scanf("%d", &add->Data.amount);
fflush(stdin);
printf("\n\t 물품,가격,수량이 입력되었습니다. ");
add->Next=pos;
pos=add;
}
void EDIT()
{
PRINT();
Link* edit;
Link edit_after;
char arr[20];
int i, count=0;
cls();
if(pos!=NULL)
{
edit=pos;
fflush(stdin);
printf("\n\t 수정전 물품을 입력하세요 : ");
scanf("%s", arr);
while(edit)
{
i=strcmp(edit->Data.name,arr);
if(i==0)
{
printf("\n\t품목 : %s / 가격 : %d / 수량 : %d", edit->Data.name, edit->Data.price, edit->Data.amount);
printf("\n");
fflush(stdin);
printf("\n\t수정할 물품을 입력해주세요 : ");
gets(edit_after.Data.name);
printf("\n\t수정할 물품의 가격을 입력해주세요 : ");
scanf("%d",&edit_after.Data.price);
fflush(stdin);
printf("\n\t수정할 물품의 수량을 입력해주세요 : ");
scanf("%d",&edit_after.Data.amount);
fflush(stdin);
edit->Data = edit_after.Data;
count++;
}
edit=edit->Next;
}
if(count==0)
{
printf("\n\t찾는 물품이 없습니다!!!");
}
}
}
void DELETE()
{
Link *next, *before;
char del[20];
int count=0;
cls();
if(pos!=NULL){
next=before=pos;
//PRINT();
//file_load2();
printf("\n\t 삭제할 이름을 입력해주세요 : ");
fflush(stdin);
gets(del);
while(next)
{
if(strcmp(next->Data.name,del)==0)
break;
before=next;
next=next->Next;
count++;
}
if(count==0)
{
pos=pos->Next;
printf("\n\t 선택한 물품이 삭제 되었습니다. ");
free(next);
}
else if(next==NULL)
{
printf("\n\t입력한 물품이 없습니다. ");
}
else
{
before->Next = next->Next;
printf("\n\t 선택한 물품이 삭제 되었습니다. ");
free(next);
}
}
else
{
printf("\n\t삭제할 내용이 없습니다. ");
}
getch();
}
void SEARCH()
{
Link* search;
char arr[20];
int i, count=0;
cls();
if(pos!=NULL)
{
search=pos;
fflush(stdin);
printf("\n\t 찾을 물품을 입력하세요 : ");
scanf("%s", arr);
while(search)
{
i=strcmp(search->Data.name,arr);
if(i==0)
{
printf("\n\t품목 : %s / 가격 : %d / 수량 : %d", search->Data.name, search->Data.price, search->Data.amount);
printf("\n");
printf("\n\n\t[ENTER]키를 누르면 계속 진행됩니다.");
count++;
}
search=search->Next;
}
if(count==0)
{
printf("\n\t찾는 물품이 없습니다!!!");
}
}
else
{
printf("\n\t저장된 내용이 없습니다!!!");
printf("\n\n\t[ENTER]키를 누르면 계속 진행됩니다.");
}
getch();
}
void PRINT()
{
Link* see;
cls();
printf(" \n\t물품 목록을 모두 출력합니다. \n\n");
if(pos!=NULL)
{
see=pos;
while(see)
{
printf("품목 : %s / 가격 : %d / 수량 : %d\n", see->Data.name, see->Data.price, see->Data.amount);
see=see->Next;
}
}
else
{
printf("\n\t저장된 내용이 없습니다.");
}
printf("\n\n\t[ENTER]키를 누르면 계속 진행됩니다.");
getch();
}
void file_loads()
{
FILE* file;
Link* load;
int state;
file=fopen("/ITEM_LIST.txt","rb");
if(file==NULL)
{
printf("파일을 성공적으로 읽지못했습니다. \a\a\a\a");
return;
}
load=(Link*)malloc(sizeof(Link));
while(fread(&load->Data,sizeof(struct Store),1,file)!=0);
{
load->Next=pos;
pos=load;
load=(Link*)malloc(sizeof(Link));
}
state=fclose(file);
if(state!=0)
{
printf("파일을 성공적으로 닫지 못했습니다. \a\a\a\a");
}
return;
}
/*
void file_load2()
{
cls();
FILE *load;
int state;
printf(" \n\t물품 목록을 모두 출력합니다. \n\n");
Link Link_load;
load = fopen("ITEM_LIST","rb");
if(load = NULL){
printf("\n\t**재고파일을 읽어들이는데 실패했습니다. **");
exit(-1);
}
while (fread(&Link_load.Data, sizeof(Link),1,load))
{
printf("품목 : %s / 가격 : %d / 수량 : %d\n", Link_load.Data.name, Link_load.Data.price, Link_load.Data.amount);
}
fclose(load);
}
*/
void file_save()
{
FILE* save;
Link* save1;
Stock stock;
int state;
save=fopen("/ITEM_LIST.txt","wb");
save1=pos;
while(save1!=NULL)
{
memset(&stock, '\0', sizeof(Stock));
fwrite(&stock,sizeof(Stock),1,save);
save1=save1->Next;
}
state=fclose(save);
if(state!=0)
{
printf("File Close Error\n");
//return;
}
}
void sale_end()
{
FILE* save;
Link* save1;
int state;
save=fopen("ITEM_LIST.txt","wb");
save1=pos;
while(save1!=NULL)
{
fwrite(&save1->Data,sizeof(struct Store),1,save);
save1=save1->Next;
}
state=fclose(save);
if(state!=0)
{
printf("File Close Error\n");
return;
}
}
Stock *makeStockArray(void){
Stock *pStock;
long count;
FILE *fin;
fin = fopen("ppstock.txt","rb");
if(fin = NULL){
printf("판매를 위한 재고파일 오픈 에러!!\n");
exit(-1);
}
fseek(fin,0,SEEK_END);
count = ftell(fin) / sizeof(Stock);
cnt = (int)count;
pStock = (Stock *)calloc(count, sizeof(Stock));
fseek(fin, 0, SEEK_SET);
for(int i=0; i<count; i++){
fread(&pStock[i], sizeof(Stock), 1, fin);
}
fclose(fin);
return pStock;
}
void SALE()
{
Stock *pStock;
int *pSalseQuantity;
pStock = makeStockArray(); // <<<< 이게 잘 안되는거 같음...
pSalseQuantity = (int *)calloc(cnt,sizeof(int));
printf("\n\t **** 판매준비된 현재 상태 **** \n");
for(int i=0;i<cnt;i++){
printf("%-20s %6d %3d %3d\n", pStock[i].name, pStock[i].price,pStock[i].amount,pSalseQuantity[i]);
}
char salesName[20];
int salesQuantity;
int index;
fflush(stdin);
printf("\n\t ****** 영업을 시작하였습니다 ******");
printf("\n\t *** 종료 : [END] 를 입력해주세요 *** ");
printf("\n\n\t 판매제품을 입력해주세요 : [ ]\b\b\b\b\b\b\b\b\b");
gets(salesName);
fflush(stdin);
printf("\n\t 수량을 입력해주세요 : [ ]\b\b\b");
while((strcmp(salesName, "end") || (strcmp(salesName, "END")))!= 0){
index = searchIndexByName(pStock, salesName);
if(index == -1){
printf("\n\t 재고물품에 제품이 없습니다!");
}else{
if(pStock[index].amount >= salesQuantity){
printf("판매가격 : %d 원 / 판매수량 : %d 개 / 판매금액 : %d\n 원", pStock[index].price, salesQuantity, pStock[index].price * salesQuantity);
pStock[index].amount -= salesQuantity;
pSalseQuantity[index] += salesQuantity;
}else{
printf("\n\t *** 재고 물량이 부족합니다 *** ");
printf("\n\t 재고 물량 : %d개 / 구매 물량 : %d\n개", pStock[index].amount, salesQuantity);
}
}
fflush(stdin);
printf("\n\t *** 종료 : [END] 를 입력해주세요 *** ");
printf("\n\n\t 판매제품을 입력해주세요 : [ ]\b\b\b\b\b\b\b\b\b");
gets(salesName);
fflush(stdin);
printf("\n\t 수량을 입력해주세요 : [ ]\b\b\b");
scanf("%d",&salesQuantity);
}
// 재고내역을 파일에 재 출력한다.(overwrite)
updateStockSales(pStock);
// 오늘날짜 판매현황 파일을 만든다.
saveSalesList(pStock, pSalseQuantity);
}
void updateStockSales(Stock *pStock)
{
FILE *fout = fopen("/stock.out","wb");
if(fout == NULL){
printf("\n\t재고파일 판매결과 Write Open Error!\n");
exit(-1);
}
fwrite(pStock, sizeof(Stock), cnt, fout);
fclose(fout);
}
void saveSalesList(Stock *pStock, int *psalesQuantity)
{
FILE *fout = fopen("/sale20120413.txt","wb");
if(fout == NULL){
printf("판매현황 Write Open Error!\n");
exit(-1);
}
int *pSalesAmount = (int *)calloc(cnt, sizeof(int));
int totalAmount = 0;
fprintf(fout, "%s"," ******** 2012년 4월 13일 판매 현황 ******** \n");
fprintf(fout, "%20s %s\n", "제품명", "단가 수량 판매금액");
for(int i=0; i<cnt; i++){
pSalesAmount[i] = pStock[i].price * psalesQuantity[i];
totalAmount += pSalesAmount[i];
fprintf(fout, "%-20s %6d %3d %8d\n", pStock[i].name,pStock[i].price,psalesQuantity[i],pSalesAmount[i]);
}
fprintf(fout, "-------------------------------------------------\n");
fprintf(fout, " 총판매금액 : %10d\n", totalAmount);
fclose(fout);
}
int searchIndexByName(Stock *pStock, char *salesName){
int sw = 0;
int i = 0;
while (sw != 1 && i<cnt){
if(strcmp(pStock[i].name, salesName) == 0){
sw = 1;
}else{
i++;
}
}
if(sw==1){
return i;
}else{
return -1;
}
}
|
Hit : 7461 Date : 2012/04/14 10:37
|