프로그래밍

 3198, 1/160 회원가입  로그인  
   SKTCTO
   편의점 물품 추가/삭제/수정/판매등록 만드는중인데.... 판매에서 막히네요 ..

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



    
rainroad87 Stock *makeStockArray(void) 이 함수에서

fin = fopen("ppstock.txt","rb"); 파일 열고

체크하는 루틴이 잘못되었네요

if(fin = NULL) -> if(fin == NULL)

파일 여는데 실패 하였는데,

fseek(fin,0,SEEK_END); offset 변경하려니까

죽는문제 인거 같습니다
2012/04/19