screenOut.h 


#ifndef __SCREENOUT_H__

#define __SCREENOUT_H__


#include "cusInfo.h"

#include "dvdInfo.h"


void ShowMenu(void);

void ShowCustomerInfo(cusInfo * pCus);

void ShowCustomerInfoContinue(cusInfo * pCus);

void ShowDVDInfo(dvdInfo * pDVD);

void ShowGenre(int gen);


#endif




dvdManager.h


#ifndef __DVDMGR_H__

#define __DVDMGR_H__


void RegistDVD(void);

void SearchDVDInfo(void);


void RentDVD(void);

void ReturnDVD(void);

void ShowDVDRentAllCusInfo(void);


#endif



dvdInfoAccess.h 


#ifndef __DVDACCESS_H__

#define __DVDACCESS_H__


#include "dvdInfo.h"


int AddDVDInfo(char * ISBN, char * title, int genre);

dvdInfo * GetDVDPtrByISBN(char * ISBN);

int IsRegistISBN(char * ISBN);


/* 추가된 함수들의 선언 */

int SetDVDRented(char * ISBN, char * cusID, int rentDay);

int SetDVDReturned(char * ISBN);

int GetDVDRentState(char * ISBN);


#endif



dvdInfo.h


#ifndef __DVDINFO_H__

#define __DVDINFO_H__


#include "cusInfo.h"


#define ISBN_LEN   30

#define TITLE_LEN  30

#define RENT_LEN  100


enum {ACTION=1, COMIC, SF, ROMANTIC};    // 장르 정보

enum {RENTED, RETURNED};    // 대여 상태를 나타내는 상수!


/* 반납일등 추가할 정보 많지만 간략히! */

typedef struct __dvdRentInfo 

{

    char cusID[ID_LEN];    // 대여 고객 ID

    unsigned int rentDay;    // 대여일

} dvdRentInfo;


typedef struct __dvdInfo 

{

    char ISBN[ISBN_LEN];

    char title[TITLE_LEN];

    int genre;


    int rentState;

    int numOfRentCus;

    dvdRentInfo rentList[RENT_LEN];

}dvdInfo;


#endif


cusManager.h

 


#ifndef __CUSMGR_H__

#define __CUSMGR_H__


void RegistCustomer(void);

void SearchCusInfo(void);


#endif


cusInfoAccess.h


#ifndef __CUSACCESS_H__

#define __CUSACCESS_H__


#include "cusInfo.h"


int AddCusInfo(char * ID, char * name, char * num);

cusInfo * GetCusPtrByID(char * ID);

int IsRegistID(char * ID);


#endif



cusInfo.h



#ifndef __CUSINFO_H__

#define __CUSINFO_H__


#define ID_LEN     10

#define NAME_LEN   30

#define PHONE_LEN  30


typedef struct __cusInfo 

{    

    char ID[ID_LEN];

    char name[NAME_LEN];

    char phoneNum[PHONE_LEN];

} cusInfo;


#endif



common.h

 

#ifndef __COMMOM_H__

#define __COMMON_H__


#include <stdio.h>

#include <stdlib.h>

#include <string.h>


#endif



screenOut.c


#include "common.h"

#include "cusInfo.h"

#include "dvdInfo.h"

#include "screenOut.h"


/* 프로그램 사용을 위한 메뉴 */

void ShowMenu(void)

{

    system("cls");   //stdlib.h

    

    printf("━━━━━ 메  뉴 ━━━━━━━ \n");

    printf(" 1. 신규가입 \n");

    printf(" 2. 고객검색 \n");

    printf("──────────────── \n");

    printf(" 3. DVD 등록 \n");

    printf(" 4. DVD 검색 \n");

    printf("──────────────── \n");

    printf(" 5. DVD 대여 \n");

    printf(" 6. DVD 반납 \n");

    printf("──────────────── \n");

    printf(" 7. DVD 대여고객 전체 조회\n");

    printf(" 8. 종료 \n");

    printf("━━━━━━━━━━━━━━━━ \n");

    printf("선택》 ");

}



/* 고객 개인의 기본 정보 출력 */

void ShowCustomerInfo(cusInfo * pCus)

{

    printf("┏━━━━━━━━━━━━━━━━ \n");

    printf("┃ ▶ ID: %s \n", pCus->ID);

    printf("┃ ▶ 이름: %s \n", pCus->name);

    printf("┃ ▶ 전화번호: %s \n", pCus->phoneNum);

    printf("┗━━━━━━━━━━━━━━━━ \n\n");

    

    getchar();

}


/* 고객 개인의 기본 정보 출력(연속 출력용) */

void ShowCustomerInfoContinue(cusInfo * pCus)

{

    printf("┏━━━━━━━━━━━━━━━━ \n");

    printf("┃ ▶ ID: %s \n", pCus->ID);

    printf("┃ ▶ 이름: %s \n", pCus->name);

    printf("┃ ▶ 전화번호: %s \n", pCus->phoneNum);

    printf("┗━━━━━━━━━━━━━━━━ \n\n");

}


/* DVD 기본 정보 출력 */

void ShowDVDInfo(dvdInfo * pDVD)

{

    printf("┏━━━━━━━━━━━━━━━━ \n");

    printf("┃ ▶ ISBN: %s \n", pDVD->ISBN);

    printf("┃ ▶ 타이틀: %s \n", pDVD->title);

    printf("┃ ▶ 쟝르:  "), ShowGenre(pDVD->genre), puts("");

    printf("┗━━━━━━━━━━━━━━━━ \n\n");

    

    getchar();

}


/* DVD의 장르 정보 출력 */

void ShowGenre(int gen)

{

    switch(gen)

    {

    case ACTION:

        fputs("액션", stdout);

        break;

    case COMIC:

        fputs("코믹", stdout);

        break;

    case SF:

        fputs("SF", stdout);

        break;

    case ROMANTIC:

        fputs("로맨스", stdout);

        break;

    }

}



main.c


#include "common.h"

#include "cusManager.h"

#include "dvdManager.h"

#include "screenOut.h"


enum{

  CUS_REGIST=1, CUS_SEARCH, DVD_REGIST, DVD_SEARCH, 

  DVD_RENT, DVD_RETURN, DVD_RENT_ALLCUS, QUIT};


int main(void)

{

    int inputMenu = 0;

    

    while(1)

    {

        ShowMenu();

        scanf("%d", &inputMenu);

        fflush(stdin);

          

        switch(inputMenu)

        {

        case CUS_REGIST:

            RegistCustomer();

            break;

        

        case CUS_SEARCH:

            SearchCusInfo();

            break;


        case DVD_REGIST:

            RegistDVD();

            break;


        case DVD_SEARCH:

            SearchDVDInfo();

            break;


        case DVD_RENT:

            RentDVD();

            break;


        case DVD_RETURN:

            ReturnDVD();

            break;


case DVD_RENT_ALLCUS:

            ShowDVDRentAllCusInfo();

            break;

        }

        

        if(inputMenu==QUIT)

        {

            puts("이용해 주셔서 고마워요~");

            break;

        }

    }    


    return 0;

}



dvdManager.c 


#include "common.h"

#include "dvdInfo.h"

#include "dvdInfoAccess.h"

#include "screenOut.h"


/* 주목하고 생각해 봐야 할 #include 선언 */

#include "cusInfoAccess.h" 


/* 함    수: void RegistDVD(void)

 * 기    능: DVD 등록. 

 * 반    환: void

 *

 */

void RegistDVD(void)

{

    char ISBN[ISBN_LEN];

    char title[TITLE_LEN];

    int genre;

    

    /* ISBN 입력 과정 */

    fputs("ISBN 입력: ", stdout);

    gets(ISBN);

    

    if(IsRegistISBN(ISBN))

    {

        puts("해당 ISBN은 이미 등록되었습니다.");

        getchar();

        return;

    }


    /* 제목 입력 */

    fputs("제목 입력: ", stdout);

    gets(title);

    

    /* 장르 입력 */

    fputs("장르 입력 (액션 1, 코믹 2, SF 3, 로맨틱 4): ", stdout);

    scanf("%d", &genre);

    fflush(stdin);


    if(!AddDVDInfo(ISBN, title, genre))

    {

        puts("정상적인 데이터 저장에 실패하였습니다.");

        getchar();

        return;

    }

    

    puts("등록이 완료되었습니다.");

    getchar();

}


/* 함    수: void SearchDVDInfo(void)

 * 기    능: ISBN을 이용한 DVD 정보 검색

 * 반    환: void

 * 

 */

void SearchDVDInfo(void)

{

    char ISBN[ISBN_LEN];

    dvdInfo * dvdPtr;

    

    /* 찾을 대상의 ISBN 입력 */

    fputs("찾는 ISBN 입력: ", stdout);

    gets(ISBN);


    dvdPtr=GetDVDPtrByISBN(ISBN); 

    if(dvdPtr==0)

    {

        puts("등록되지 않은 ISBN입니다.");

        getchar();

        return;

    }


    ShowDVDInfo(dvdPtr);

}


/* 함    수: void RentDVD(void)

 * 기    능: 고객이 DVD를 대여하는 과정 처리

 * 반    환: void

 * 

 */

void RentDVD(void)

{

    char ISBN[ISBN_LEN];

    int registDVD;

    int registCus;

    int rentSte;


    char cusID[ID_LEN];      // 대여 고객 ID

    unsigned int rentDay;     // 대여일


    // 1. 대여할 DVD ISBN 입력 및 검증.

    fputs("대여 DVD ISBN 입력: ", stdout);

    gets(ISBN);

    

    registDVD=IsRegistISBN(ISBN);

    if(registDVD==0)

    {

        puts("등록되지 않은 ISBN 입니다.");

        getchar();

        return;

    }

    

    // 2. 대여 가능한 상태인지 확인.

    rentSte=GetDVDRentState(ISBN);

    if(rentSte==RENTED)  // 대여 중이라면..

    {

        puts("대여 중이라 대여가 불가능합니다.");

        getchar();

        return;

    }

    

    // 3. 대여 절차 진행.

    puts("대여가 가능합니다. 대여 과정을 진행합니다.");

    fputs("대여 고객 ID 입력: ", stdout);

    gets(cusID);

    

    registCus=IsRegistID(cusID);

    if(registCus==0)

    {

        puts("가입 고객이 아닙니다.");

        getchar();

        return;

    }

    

    fputs("대여 날짜 입력: ", stdout);

    scanf("%u", &rentDay);

    fflush(stdin);


    SetDVDRented(ISBN, cusID, rentDay);

    puts("대여가 완료되었습니다.");

    getchar();

}



/* 함    수: void ReturnDVD(void)

 * 기    능: 고객이 DVD를 반납하는 과정 처리

 * 반    환: void

 * 

 */

void ReturnDVD(void)

{

    char ISBN[ISBN_LEN];

    int registDVD;

    int rentSte;

    

    // 1. 반납할 DVD ISBN 입력 및 검증.

    fputs("반납 DVD ISBN 입력: ", stdout);

    gets(ISBN);

    

    registDVD=IsRegistISBN(ISBN);

    if(registDVD==0)

    {

        puts("등록되지 않은 ISBN 입니다.");

        getchar();

        return;

    }    

    

    // 2. 반납이 가능한 대상인지 확인.

    rentSte=GetDVDRentState(ISBN);

    if(rentSte==RETURNED)  // 대여 가능한 상태라면

    {

        puts("대여되지 않은 DVD 입니다.");

        getchar();

        return;

    }

    

    // 3. 반납 절차 진행.

    SetDVDReturned(ISBN);

    puts("반납이 완료되었습니다.");

    getchar();

}



/* 함    수: void ShowDVDRentAllCusInfo(void)

 * 기    능: 특정 DVD 대여자 전체정보 출력.

 * 반    환: void

 * 

 */

void ShowDVDRentAllCusInfo(void)

{

    int i;

    char ISBN[ISBN_LEN];


    dvdInfo * ptrDVDInfo;

    int rentCusNum;


    dvdRentInfo * ptrDVDRentInfo;

    cusInfo * ptrCusInfo;

    

    /* 찾을 대상의 ISBN 입력 */

    fputs("찾는 ISBN 입력: ", stdout);

    gets(ISBN);

    

    ptrDVDInfo = GetDVDPtrByISBN(ISBN);

    if(ptrDVDInfo==0)

    {

        puts("존재하지 않는 ISBN 입니다.");

        getchar();

    }

    

    rentCusNum=ptrDVDInfo->numOfRentCus;

    ptrDVDRentInfo=ptrDVDInfo->rentList;

            

    for(i=0; i<rentCusNum; i++)

    {

        printf("대여일: %d \n", ptrDVDRentInfo[i].rentDay);

        ptrCusInfo=GetCusPtrByID(ptrDVDRentInfo[i].cusID);

        ShowCustomerInfoContinue(ptrCusInfo);

    }


    puts("조회를 완료하였습니다.");

    getchar();         

}


dvdInfoAccess.c


#include "common.h"

#include "screenOut.h"

#include "dvdInfo.h"

#include "dvdInfoAccess.h"


#define MAX_DVD  100


static dvdInfo * dvdList[MAX_DVD];

static int numOfDVD=0;


/* 함    수: int AddDVDInfo(char * ISBN, char * title, int genre)

 * 기    능: dvdInfo 할당 및 저장. 

 * 반    환: 성공 시 '등록된 정보의 수', 실패 시 0을 반환.

 *

 */

int AddDVDInfo(char * ISBN, char * title, int genre)

{

    dvdInfo * pDVD;

    

    if(numOfDVD>=MAX_DVD)

        return 0;  // 입력 실패


    pDVD=(dvdInfo *)malloc(sizeof(dvdInfo));

    strcpy(pDVD->ISBN, ISBN);

    strcpy(pDVD->title, title);

    pDVD->genre=genre;


    /* 추가된 기본 초기화 */

    pDVD->rentState=RETURNED;

    pDVD->numOfRentCus=0;

    

    dvdList[numOfDVD++]=pDVD;

    return numOfDVD;   // 입력 성공

}


/* 함    수: dvdInfo * GetDVDPtrByISBN(char * ISBN)

 * 기    능: 해당 ISBN의 정보를 담고 있는 변수의 포인터 반환 

 * 반    환: 등록 안된 ISBN의 경우 NULL 포인터 반환.

 *

 */

dvdInfo * GetDVDPtrByISBN(char * ISBN)

{

    int i;


    for(i=0; i<numOfDVD; i++)

    {

        if(!strcmp(dvdList[i]->ISBN, ISBN))

            return dvdList[i];

    }

    

    return (dvdInfo *)0;

}


/* 함    수: int IsRegistISBN(char * ISBN)

 * 기    능: 등록 된 ISBN인지 확인. 

 * 반    환: 등록 되었으면 1, 아니면 0 반환.

 *

 */

int IsRegistISBN(char * ISBN)

{

    dvdInfo * pDVD = GetDVDPtrByISBN(ISBN);

    

    if(pDVD==0)

        return 0;  // 가입 안된 경우.

    else

        return 1;  // 가입 된 경우.

}


/* 함    수: int SetDVDRented(char * ISBN, char * cusID, int rentDay)

 * 기    능: 대여 상태로 변경. 

 * 반    환: 성공 1, 실패 0.

 *

 */

int SetDVDRented(char * ISBN, char * cusID, int rentDay)

{

    int rentCusNum;

dvdInfo * pDVD = GetDVDPtrByISBN(ISBN);

    if(pDVD==0)

        return 0;  // 등록 안된 경우.

    

    rentCusNum=pDVD->numOfRentCus;

            

    pDVD->rentState=RENTED;

    strcpy(pDVD->rentList[rentCusNum].cusID, cusID);

    pDVD->rentList[rentCusNum].rentDay = rentDay;


    pDVD->numOfRentCus++;

    return 1;

}


/* 함    수: int SetDVDReturned(char * ISBN)

 * 기    능: 대여 가능 상태로 변경. 

 * 반    환: 성공 1, 실패 0.

 * 특이사항: 필자가 제공한 함수.

 *

 */

int SetDVDReturned(char * ISBN)

{

    dvdInfo * pDVD = GetDVDPtrByISBN(ISBN);

    

    if(pDVD==0)

        return 0;  // 등록 안된 경우.


    pDVD->rentState=RETURNED;

    return 1;

}



/* 함    수: int GetDVDRentState(char * ISBN)

 * 기    능: 현재 대여 상태 반환 

 * 반    환: 반납상태 RETURNED, 대여중 RENTED.

 *           존재하지 않는 ISBN의 경우 -1 반환.

 */


int GetDVDRentState(char * ISBN)

{

    dvdInfo * pDVD = GetDVDPtrByISBN(ISBN);


    if(pDVD==0)

        return -1;  // 등록 안된 경우.


    return pDVD->rentState;

}



cusManager.c



#include "common.h"

#include "cusInfo.h"

#include "cusInfoAccess.h"

#include "screenOut.h"


/* 함    수: void RegistCustomer(void)

 * 기    능: 신규 회원 가입. 

 * 반    환: void

 *

 */

void RegistCustomer(void)

{

    char ID[ID_LEN];

    char name[NAME_LEN];

    char phoneNum[PHONE_LEN];

    

    /* ID 입력 과정 */

    fputs("ID 입력: ", stdout);

    gets(ID);

    

    if(IsRegistID(ID))

    {

        puts("해당 ID는 사용 중에 있습니다. 다른 ID를 선택해 주세요");

        getchar();

        return;

    }


    /* 이름 입력 */

    fputs("이름 입력: ", stdout);

    gets(name);

    

    /* 전화번호 입력 */

    fputs("전화번호 입력: ", stdout);

    gets(phoneNum);

    

    if(!AddCusInfo(ID, name, phoneNum))

    {

        puts("정상적인 데이터 저장에 실패하였습니다.");

        getchar();

        return;

    }

    

    puts("가입이 완료되었습니다.");

    getchar();

}


/* 함    수: void SearchCusInfo(void)

 * 기    능: ID를 통한 회원 정보 검색

 * 반    환: void

 * 

 */

void SearchCusInfo(void)

{

    char ID[ID_LEN];

    cusInfo * cusPtr;

    

    /* 찾을 대상의 ID 입력 */

    fputs("찾는 ID 입력: ", stdout);

    gets(ID);


    cusPtr=GetCusPtrByID(ID); 

    if(cusPtr==0)

    {

        puts("존재하지 않는 ID입니다.");

        getchar();

        return;

    }


    ShowCustomerInfo(cusPtr);

}


cusInfoAccess.c


#include "common.h"

#include "cusInfo.h"


#define MAX_CUSTOMER  100


static cusInfo * cusList[MAX_CUSTOMER];

static int numOfCustomer=0;


/* 함    수: int AddCusInfo (char * ID, char * name, char * num)

 * 기    능: cusInfo 할당 및 저장. 

 * 반    환: 성공 시 '등록된 정보의 개수', 실패 시 0을 반환.

 *

 */

int AddCusInfo(char * ID, char * name, char * num)

{

    cusInfo * pCus;

    

    if(numOfCustomer>=MAX_CUSTOMER)

        return 0;  // 입력 실패


    pCus=(cusInfo*)malloc(sizeof(cusInfo));

    strcpy(pCus->ID, ID);

    strcpy(pCus->name, name);

    strcpy(pCus->phoneNum, num);


    cusList[numOfCustomer++]=pCus;

    return numOfCustomer;   // 입력 성공

}



/* 함    수: cusInfo * GetCusPtrByID(char * ID)

 * 기    능: 해당 ID의 정보를 담고 있는 변수의 포인터 반환 

 * 반    환: 등록 안된 ID의 경우 NULL 포인터 반환.

 *

 */

cusInfo * GetCusPtrByID(char * ID)

{

    int i;


    for(i=0; i<numOfCustomer; i++)

    {

        if(!strcmp(cusList[i]->ID, ID))

            return cusList[i];

    }

    

    return (cusInfo *)0;

}



/* 함    수: int IsRegistID(char * ID)

 * 기    능: 가입 된 ID인지 확인. 

 * 반    환: 가입 되었으면 1, 아니면 0 반환.

 *

 */

int IsRegistID(char * ID)

{

    cusInfo * pCus = GetCusPtrByID(ID);


    if(pCus==0)

        return 0;  // 가입 안된 경우.

    else

        return 1;  // 가입 된 경우.

}





함수마다 주석으로 기능과 반환값이 의미하는 바를 작성하는것은 좋은것 같다.






+ Recent posts