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; // 가입 된 경우.
}
함수마다 주석으로 기능과 반환값이 의미하는 바를 작성하는것은 좋은것 같다.