#include "Bus.h"
void Bus_Format(BUS* (*Bus)[4]) // 버스 좌석 NULL로 초기화
{
int i, j;
for(i=0; i<20; i++)
{
for(j=0; j<4; j++)
{
Bus[i][j] = NULL;
}
}
}
void Price_Format(PRICE* *Price) // 요금 정산 기록 NULL로 초기화
{
int i;
for(i=0; i<120; i++)
{
Price[i] = NULL;
}
}
void AllFree(BUS* (*Bus)[4], PRICE* *Price)//동적 할당 해제
{
int i, j;
if(Price[0] == NULL)
{
return;
}
for(i=0; i<20; i++)
{
for(j=0; j<4; j++)
{
if(Bus[i][j] != NULL)
{
free(Bus[i][j]);
}
}
}
for(i=0; i<120; i++)
{
if(Price[i] == NULL)
{
break;
}
free(Price[i]);
}
}
int main()
{
int num;
int login_num = 0;
BUS* Bus[20][4];
PRICE* Price[120];
Bus_Format(Bus);
Price_Format(Price);
int e_num[10]={0};
char e_pwd[10][11]={""};
while (1)
{
num = disp_menu();
switch (num)
{
case 1:
enroll_num(e_num, e_pwd,login_num); break;
case 2:
login_out(e_num, e_pwd, &login_num); break;
case 3:
Bus_Book(Bus,Price,&login_num,e_num,e_pwd); break;
case 4:
Bus_BookList(Price,&login_num); break;
case 5:
Bus_BookCancle(Bus,Price); break;
case 6:
Price_Print(Price); break;
case 7:
Save(Bus,Price); break;
case 0:
AllFree(Bus,Price); return;
default:
printf("@ 메뉴 번호가 아닙니다!\n\n");
break;
}
}
return 0;
}
int disp_menu()
{
int num;
printf("\n===[ 버스 예약 시스템 ]===\n");
printf("1. 회원가입\n");
printf("2. 로그인/로그아웃\n");
printf("3. 버스 예약 \n");
printf("4. 티켓 조회\n");
printf("5. 예약 취소\n");
printf("6. 티켓 정산\n");
printf("7. Save\n");
printf("0. 종료\n");
printf("--------------------------\n");
printf("> 번호 선택 : ");
scanf("%d", &num);
return num;
}
void Bus_print(BUS* (*Bus)[4])
{
int i,j;
int seat=0, nonseat=0;
printf("=========버스좌석========\n");
for(i=0;i<20;i++)
{
for(j=0;j<4;j++)
{
if(Bus[i][j] == NULL)
{
printf("□ ");
seat++;
}
else
{
printf("■ ");
nonseat ++;
}
}
printf(" (%d ~ %d)",(i*4)+1,(i*4)+4);
printf("\n");
}
printf("\n[빈자리 □] [자리 없음 ■]\n");
printf("예약 가능 자리: %d개 예약된 자리: %d개\n\n", seat, nonseat);
fflush(stdin);
}
void Bus_Book(BUS* (*Bus)[4], PRICE* *Price,int* login_num,int *e_num, char (*e_pwd)[11])
{
int num ,seat,i,flag;
int row,col;
char yn;
char Name[10];
char pwd[11]="";
int index;
if (*login_num == 0)
{
printf("@ 로그인후 사용가능합니다!\n");
return;
}
Bus_print(Bus);
printf("# 이름을 입력하세요 : ");
scanf("%s", Name);
fflush(stdin);
printf("# 자리를 입력하세요 : ");
scanf("%d",&seat);
fflush(stdin);
row = seat/4;
col = seat%4-1;
//버스 자리 있는지 검사
if(is_Bus_Book(Bus, row, col))
{
return ;
}
//현재 로그인된 회원의 비밀번호 저장
for(i=0;i<e_cnt;i++)
{
if(*login_num==e_num[i])
{
index=i;
break;
}
}
strcpy(pwd,e_pwd[index]);
printf("@ 1 : 성인 요금은 20000원 입니다. \n");
printf("@ 2 : 아동 요금은 10000원 입니다. \n");
printf("> 입력 : ");
scanf("%d",&flag);
fflush(stdin);
printf("\n# 예약 하시겠습니까?(y/ n): ");
scanf("%c", &yn);
if(yn == 'y')
{
Bus[row][col] = (BUS*)malloc(sizeof(BUS));
strcpy(Bus[row][col]->name, Name);
num = *login_num;
Bus[row][col]->num=num;
Add_Price(Bus, Price, Name, seat,num,pwd,flag);
seat_cnt++;
printf("@ 예약 되었습니다\n");
}
else
{
printf("@ 취소 되었습니다\n");
}
}
int is_Bus_Book(BUS* (*Bus)[4], int row,int col)
{
if(Bus[row][col] == NULL)
{
return 0;
}
else
{
printf("\n@ 자리가 없습니다.");
return 1;
}
}
void Add_Price(BUS* (*Bus)[4], PRICE* *Price, char* Name, int Seat,int num,char* pwd,int flag)
{
int i;
time_t B_time;
B_time = time(NULL);
for(i=0; i<120; i++)
{
if(Price[i] == NULL)
{
Price[i] = (PRICE*)calloc(80,sizeof(PRICE));
strcpy(Price[i]->Name, Name);
Price[i]->Seat = Seat;
Price[i]->num = num;
Price[i]->flag=flag;
strcpy(Price[i]->pwd,pwd);
Price[i]->B_time = time(&B_time); // 예약 시간 저장
break;
}
}
}
void Bus_BookList(PRICE* *Price,int* login_num)
{
int i,count=0;
if (*login_num == 0)
{
printf("@ 로그인후 사용가능합니다!\n");
return;
}
printf("\n<==========티켓 조회==========>\n");
for(i=0; i<120; i++)
{
if(Price[i] == NULL)
{
break ;
}
else if(Price[i]->num==*login_num) //로그인된 회원만 조회
{
printf("# 예약자 이름: %s\n" ,Price[i]->Name);
printf("# 예약 좌석 : %d\n", Price[i]->Seat);
if(strcmp(ctime(&Price[i]->O_time),"Thu Jan 01 09:00:00 1970\n"))
{
printf("<<<취소된 티켓입니다.>>>\n");
}
printf("================================\n");
count++;
}
}
if(!count)
printf("@ 예약된 티켓이 없습니다.\n");
}
void Bus_BookCancle(BUS* (*Bus)[4], PRICE* *Price)
{
char pwd[11] = "";
int seat,i;
int row,col;
time_t O_time;
O_time = time(NULL);
printf("# 좌석을 입력하세요 : ");
scanf("%d",&seat);
row = seat/4;
col = seat%4-1;
for(i=0; i<120; i++)
{
if(Price[i] == NULL)
{
printf("@ 티켓 목록이 없습니다!\n");
break;
}
else if(Price[i]->Seat==seat)
{
printf("# 비밀번호를 입력하세요 : ");
scanf("%s",pwd);
if(!strcmp(pwd,Price[i]->pwd))
{
Price[i]->O_time=O_time;//예약 취소 시간 저장
Bus[row][col]=NULL;
printf("@ 예약이 취소되었습니다.\n");
break;
}
else
{
printf("@ 비밀번호가 틀렸습니다\n");
break;
}
}
}
}
void Price_Print(PRICE* *Price)
{
int i;
int sum = 0;
for(i=0; i<120; i++)
{
if(Price[i] == NULL)
{
break;
}
if(Price[i]->Name != NULL) // 예약자가 있을때만 출력
{
printf("\n예약자 이름: %s\n", Price[i]->Name);
}
printf("예약 자리: %d\n", Price[i]->Seat);
printf("예약 형태: 좌석");
if(Price[i]->flag==1)
{
sum += Price_sum(adult_add);
printf("[성인] \n");
}
if(Price[i]->flag==2)
{
sum += Price_sum(child_add);
printf("[아동] \n");
}
printf("예약 시간: %s\n", ctime(&Price[i]->B_time));
if(strcmp(ctime(&Price[i]->O_time),"Thu Jan 01 09:00:00 1970\n"))
{
printf("취소 시간: %s\n", ctime(&Price[i]->O_time));
if(Price[i]->flag==1)
sum +=Price_sum(adult_sub);
if(Price[i]->flag==2)
sum +=Price_sum(child_sub);
}
}
printf("\n정산 요금: %d\n", sum);
total = sum;
}
void Save(BUS* (*Bus)[4], PRICE* *Price)
{
FILE *fp = fopen("Bus.txt", "w");
char yn;
char str[10];
int i;
if(Price[0] == NULL)
{
return;
}
fflush(stdin);
printf("\n세이브 하시겠습니까?(y / n): ");
scanf("%c", &yn);
if(yn == 'y')
{
for(i=0;i<seat_cnt;i++) // 파일에 문자열 저장
{
fputs("예약자 이름 :", fp);
fputs(Price[i]->Name, fp);
fputs("\n", fp);
fputs("예약시간 :", fp);
fputs(ctime(&Price[i]->B_time), fp);
fputs("취소시간 :", fp);
if(!strcmp(ctime(&Price[i]->O_time),"Thu Jan 01 09:00:00 1970\n"))
{
fputs("\n", fp);
}
else
fputs(ctime(&Price[i]->O_time), fp);
fputs("좌석 :",fp);
itoa(Price[i]->Seat,str,10);
fputs(str, fp);
if(Price[i]->flag==1)
fputs("[성인] \n",fp);
if(Price[i]->flag==2)
fputs("[아동] \n",fp);
}
}
fputs("\n정산 요금 : ",fp);
itoa(total,str,10);
fputs(str,fp);
fclose(fp);
}
void enroll_num(int *e_num, char (*e_pwd)[11], int login_num)
{
int num;
int index;
if (login_num != 0)
{
printf("@ 로그아웃 후 사용할 수 있습니다!\n");
return;
}
printf("\n======[ 회원 가입 ]======\n\n");
printf("# 회원번호를 입력하세요 :");
scanf("%d",&num);
index = is_enroll_num(num,e_num); // 등록이 되어 있는지 확인
if (index >= 0)
{
printf("@ 이미 회원가입된 번호입니다\n");
}
else // 처음 등록하는 경우
{
insertID(num, e_num, e_pwd);
}
}
int is_enroll_num(int num, int *e_num)
{
int i;
for (i = 0; i < e_cnt; i++)
{
if (num == e_num[i]) return i;
}
return -1;
}
void insertID(int id, int *e_num, char (*e_pwd)[11]){
char pwd[11] = "";
input_password(pwd);
insertToIDList(id, pwd, e_num, e_pwd);
printIDList(e_num, e_pwd);
}
void input_password(char *pwd)
{
char first[11];
char second[11];
int flag=0;
do {
while (1)
{
printf("> 비밀번호 : ");
scanf("%s",first);
if(strlen(first)>10)
{
printf("@ 비밀번호가 너무 깁니다 \n");
flag=1;
}
else
{
flag=0;
}
if (flag==0) break;
}
printf("> 한번 더 입력하세요. : ");
scanf("%s",second);
if ( strcmp(first, second) == 0) break;
printf("@ 비밀번호가 일치하지 않습니다!\n");
} while (1);
strcpy(pwd,first);
}
void insertToIDList(int id, char* pwd, int *e_num, char (*e_pwd)[11]) {
e_num[e_cnt] = id;
strcpy(e_pwd[e_cnt], pwd);
e_cnt++;
printf("@ %d번이 등록되었습니다!\n", id);
}
void printIDList(int *e_num, char (*e_pwd)[11]){
int i=0;
printf("\n>> 현재 등록된 회원번호(비밀번호) : ");
for (i = 0; i < e_cnt; i++)
{
printf("%5d(%s)", e_num[i], e_pwd[i]);
}
printf("\n\n");
}
void login_out(int *e_num, char (*e_pwd)[11], int *login_num)
{
int num;
char pwd[11]="";
int index;
if (*login_num != 0)
{
*login_num = 0;
printf("# 로그아웃 되었습니다!\n");
return;
}
printf("\n[ 로그인 ]\n\n");
printf("> 회원번호 : ");
scanf("%d", &num);
index = is_enroll_num(num, e_num);
if (index == -1)
{
printf("@ %d번은 등록되지 않은 번호입니다!\n", num);
return;
}
printf("> 비밀번호 : ");
fflush(stdin); gets(pwd);
if (strcmp(pwd, e_pwd[index]) != 0)
{
printf("@ 비밀번호가 틀렸습니다!\n");
return;
}
*login_num = num;
printf("@ 로그인 되었습니다!\n");
}
int Price_sum(int (*fp)(int))
{
int sum=0;
return fp(sum);
}
int adult_add(int sum)
{
return sum+20000;
}
int adult_sub(int sum)
{
return sum-20000;
}
int child_add(int sum)
{
return sum+10000;
}
int child_sub(int sum)
{
return sum-10000;
}