📄 hotel.c
字号:
int rank, sex, roomNum, bedNum;
//询问顾客的性别、房间号和床位号
AskGuestRoomBed(H, &rank, &sex, &roomNum, &bedNum);
//回收床位
while (!ReclaimBed(H, rank, sex, roomNum, bedNum))
{
printf(" 您的输入有错,请重新输入。\n");
AskGuestRoomBed(H, &rank, &sex, &roomNum, &bedNum);
}//while
//顾客离开时间为当前程序时间
H->guest->leave.year = H->today.year;
H->guest->leave.month = H->today.month;
H->guest->leave.day = H->today.day;
PrintAccount(H, rank, sex, roomNum, bedNum);//打印账单
free(H->guest); //删除顾客信息
H->guest = NULL;
return OK;
}
//询问顾客的性别、房间号和床位号
Status AskGuestRoomBed(hotel *H, int *R, int *S, int *RN, int *BN)
{
int roomNum;
printf(" 请输入退房旅客的信息。\n");
printf(" 顾客性别:");
scanf("%d", S); //性别
while((*S)<0 || (*S)>1)
{
printf(" 性别超出范围,请重新输入:");
scanf("%d", S);
}//while
//输入房间号码
printf(" 房间号码:");
scanf("%d", RN); //性别房间号码
(*R) = (*RN)/100;
roomNum = (*RN)%100;
while((*R)<1 || (*R)>H->rank[0].TRnum
|| roomNum<0 || roomNum>H->rank[(*R)].TRnum)
{
printf(" 房间号码超出范围,请重新输入:");
scanf("%d", RN);
(*R) = (*RN)/100;
roomNum = (*RN)%100;
}//while
printf(" 床位号码:");
scanf("%d", BN); //性别房间号码
while((*BN)<0 || (*BN)>H->rank[(*R)].RBnum)
{
printf(" 床位号码超出范围,请重新输入:");
scanf("%d", BN);
}//while
return OK;
}//询问顾客的性别、房间号和床位号
//回收床位
Status ReclaimBed(hotel *H, int R, int S, int RN, int BN)
{
roomptr tempRoom1, tempRoom2;
//在空床链寻找该房间
if (H->rank[R].EBlink[S])
{
tempRoom1 = H->rank[R].EBlink[S];
//要查找的房间是第一个结点
if (tempRoom1->Rnum == RN)
{
if (!tempRoom1->guest[BN])
{
return FALSE;
}//if //该床位没有住人
tempRoom1->Ebed[tempRoom1->Btop] = BN; //床位入栈
tempRoom1->Btop++; //栈顶指针上移
H->guest = tempRoom1->guest[BN]; //将顾客信息反馈到H
tempRoom1->guest[BN] = NULL; //顾客信息指针置空
H->rank[R].Ebed[S]++; //该级别该性别可用空床数加一
H->rank[0].Ebed[S]++; //该性别所有可用空床数加一
if (tempRoom1->Btop == H->rank[R].RBnum)
{
H->rank[R].Eroom[H->rank[R].Rtop] = RN; //进入空房栈
H->rank[R].Rtop++; //栈顶指针上移
H->rank[R].Ebed[(S-1)*(0-1)] += H->rank[R].RBnum;
//该级别另一性别可用空床数加该级别每房间床数
H->rank[0].Ebed[(S-1)*(0-1)] += H->rank[R].RBnum;
//另一性别所有可用空床数加该级别每房间床数
H->rank[R].EBlink[S] = tempRoom1->Rlink; //从空床链摘除
free (tempRoom1); //释放内存空间
}//if //房间空则回收该房间进入空房栈
return OK;
}//if //要查找的房间是第一个结点
//不是第一个结点,剩下的结点中寻找
tempRoom2 = tempRoom1->Rlink;
while (tempRoom2!=NULL && tempRoom2->Rnum!=RN)
{
tempRoom1 = tempRoom2;
tempRoom2 = tempRoom1->Rlink;
}//while //遍历其余结点
//如果找到该房间
if (tempRoom2 != NULL)
{
if (!tempRoom2->guest[BN])
{
return FALSE;
}//if //该床位没有住人
tempRoom2->Ebed[tempRoom2->Btop] = BN; //床位入栈
tempRoom2->Btop++; //栈顶指针上移
H->guest = tempRoom2->guest[BN]; //将顾客信息反馈到H
tempRoom2->guest[BN] = NULL; //顾客信息指针置空
H->rank[R].Ebed[S]++; //该级别该性别可用空床数加一
H->rank[0].Ebed[S]++; //该性别所有可用空床数加一
if (tempRoom2->Btop == H->rank[R].RBnum)
{
H->rank[R].Eroom[H->rank[R].Rtop] = RN; //进入空房栈
H->rank[R].Rtop++; //栈顶指针上移
H->rank[R].Ebed[(S-1)*(0-1)] += H->rank[R].RBnum;
//该级别另一性别可用空床数加该级别每房间床数
H->rank[0].Ebed[(S-1)*(0-1)] += H->rank[R].RBnum;
//另一性别所有可用空床数加该级别每房间床数
tempRoom1->Rlink = tempRoom2->Rlink; //从空床链摘除
free (tempRoom2); //释放内存空间
}//if //房间空则回收该房间进入空房栈
return OK;
}//if //如果找到该房间
}//if //在空床链寻找该房间
//没找到,在满床链寻找该房间
if (H->rank[R].FRlink[S])
{
tempRoom1 = H->rank[R].FRlink[S];
//要查找的房间是第一个结点
if (tempRoom1->Rnum == RN)
{
if (!tempRoom1->guest[BN])
{
return FALSE;
}//if //该床位没有住人
tempRoom1->Ebed[tempRoom1->Btop] = BN; //床位入栈
tempRoom1->Btop++; //栈顶指针上移
H->guest = tempRoom1->guest[BN]; //将顾客信息反馈到H
tempRoom1->guest[BN] = NULL; //顾客信息指针置空
H->rank[R].Ebed[S]++; //该级别该性别可用空床数加一
H->rank[0].Ebed[S]++; //该性别所有可用空床数加一
H->rank[R].FRlink[S] = tempRoom1->Rlink; //从满床链摘除
if (tempRoom1->Btop == H->rank[R].RBnum)
{
H->rank[R].Eroom[H->rank[R].Rtop] = RN; //进入空房栈
H->rank[R].Rtop++; //栈顶指针上移
H->rank[R].Ebed[(S-1)*(0-1)] += H->rank[R].RBnum;
//该级别另一性别可用空床数加该级别每房间床数
H->rank[0].Ebed[(S-1)*(0-1)] += H->rank[R].RBnum;
//另一性别所有可用空床数加该级别每房间床数
free (tempRoom1); //释放内存空间
}//if //房间空则回收该房间进入空房栈
else
{
tempRoom1->Rlink = H->rank[R].EBlink[S];
H->rank[R].EBlink[S] = tempRoom1;
}//else //房间非空则该房间进入空床栈
return OK;
}//if //要查找的房间是第一个结点
//不是第一个结点,剩下的结点中寻找
tempRoom2 = tempRoom1->Rlink;
while (tempRoom2!=NULL && tempRoom2->Rnum!=RN)
{
tempRoom1 = tempRoom2;
tempRoom2 = tempRoom1->Rlink;
}//while //遍历其余结点
//如果找到该房间
if (tempRoom2 != NULL)
{
if (!tempRoom2->guest[BN])
{
return FALSE;
}//if //该床位没有住人
tempRoom2->Ebed[tempRoom2->Btop] = BN; //床位入栈
tempRoom2->Btop++; //栈顶指针上移
H->guest = tempRoom2->guest[BN]; //将顾客信息反馈到H
tempRoom2->guest[BN] = NULL; //顾客信息指针置空
H->rank[R].Ebed[S]++; //该级别该性别可用空床数加一
H->rank[0].Ebed[S]++; //该性别所有可用空床数加一
tempRoom1->Rlink = tempRoom2->Rlink; //从满床链摘除
if (tempRoom2->Btop == H->rank[R].RBnum)
{
H->rank[R].Eroom[H->rank[R].Rtop] = RN; //进入空房栈
H->rank[R].Rtop++; //栈顶指针上移
H->rank[R].Ebed[(S-1)*(0-1)] += H->rank[R].RBnum;
//该级别另一性别可用空床数加该级别每房间床数
H->rank[0].Ebed[(S-1)*(0-1)] += H->rank[R].RBnum;
//另一性别所有可用空床数加该级别每房间床数
free (tempRoom2); //释放内存空间
}//if //房间空则回收该房间进入空房栈
else
{
tempRoom2->Rlink = H->rank[R].EBlink[S];
H->rank[R].EBlink[S] = tempRoom2;
}//else //房间非空则该房间进入空床栈
return OK;
}//if //如果找到该房间
}//if //在满床链寻找该房间
//没找到
return FALSE;
}//回收床位
//打印账单
Status PrintAccount(hotel *H, int R, int S, int RN, int BN)
{
int day;
char sex[2][3]={"男","女"};
day = DiffDate(H->guest->arrive, H->guest->leave);
printf("\n\n");
printf(" ┏━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf(" ┃ 账 单 ┃\n");
printf(" ┣━━━━┯━━┯━━┯━━━━━━┯━━━━━━┫\n");
printf(" ┃ 姓名 │性别│年龄│到 达 日 期 │离 开 日 期 ┃\n");
printf(" ┠────┼──┼──┼──────┼──────┨\n");
printf(" ┃%6s │ %2s │ %2d │%5d-%2d-%2d │%5d-%2d-%2d ┃\n",
H->guest->name, sex[H->guest->sex], H->guest->age,
H->guest->arrive.year, H->guest->arrive.month, H->guest->arrive.day,
H->guest->leave.year, H->guest->leave.month, H->guest->leave.day);
printf(" ┠────┼──┴─┬┴───┬──┴─┬────┨\n");
printf(" ┃房间等级│房间号码│床位号码│住宿时间│住宿费用┃\n");
printf(" ┠────┼────┼────┼────┼────┨\n");
printf(" ┃ %2d │ %3d │ %2d │ %3d天 │ %4d ┃\n",
R, RN, BN, day,day*(H->rank[R].price));
printf(" ┗━━━━┷━━━━┷━━━━┷━━━━┷━━━━┛\n");
printf("\n ");
system("pause");
system("cls");
return OK;
}//打印账单
//显示当前剩余客房
Status PrintEmptyBed(hotel *H)
{
int i;
printf("\n\n\n ┏━━━┯━━━┯━━━┯━━━━┓\n");
printf(" ┃ 等级 │ 男 │ 女 │价格/天 ┃\n");
printf(" ┠───┼───┼───┼────┨\n");
printf(" ┃ 总数 │ %3d │ %3d │ ┃\n",
H->rank[0].Ebed[0], H->rank[0].Ebed[1]);
for (i=1; i<=H->rank[0].TRnum; i++)
{
printf(" ┠───┼───┼───┼────┨\n");
printf(" ┃ %3d │ %3d │ %3d │ %3d ┃\n",
i, H->rank[i].Ebed[0], H->rank[i].Ebed[1], H->rank[i].price);
}
printf(" ┗━━━┷━━━┷━━━┷━━━━┛\n");
printf("\n\n\n ");
system("pause");
system("cls");
}
//显示菜单
Status PrintMenu(hotel *H)
{
printf("\n\n ┏━━━━━━━━━━━━━━┓\n");
printf(" ┃ ┃\n");
printf(" ┃ 旅馆床位分配回收系统 ┃\n");
printf(" ┃ ┃\n");
printf(" ┣━━━━━━━━━━━━━━┫\n");
printf(" ┃ ┃\n");
printf(" ┃ 1.旅客入住 ┃\n");
printf(" ┃ ┃\n");
printf(" ┃ 2.旅客退房 ┃\n");
printf(" ┃ ┃\n");
printf(" ┃ 3.当前入住情况 ┃\n");
printf(" ┃ ┃\n");
printf(" ┃ 4.进入下一天 ┃\n");
printf(" ┃ ┃\n");
printf(" ┃ 0.退出程序 ┃\n");
printf(" ┃ ┃\n");
printf(" ┣━━━┳━━━━━━━━━━┫\n");
printf(" ┃ ┃ 当前日期%5d-%2d-%2d┃\n",
H->today.year, H->today.month, H->today.day);
printf(" ┗━━━┻━━━━━━━━━━┛\n");
printf(" 请选择一项操作:");
return OK;
}//显示菜单
//选择操作
Status Chose(hotel *H, int C)
{
switch(C)
{
case 1: GuestArrive(H);
return OK; //选择1旅客入住
case 2: GuestLeave(H);
return OK; //选择2旅客退房
case 3: PrintEmptyBed(H);
return OK; //选择3显示当前入住情况
case 4: DataPlus(H->today, &H->today);
return OK; //选择4程序日期进入下一天
case 0: return FALSE; //选择0退出程序
}
return OK;
}//选择操作
main()
{
int i;
hotel *hotel;
Init(&hotel);
while(1)
{
PrintMenu(hotel);
scanf("%d",&i);
while (i<0 || i>4)
{
printf("您输入选项超出范围,请重新输入:");
scanf("%d",&i);
}//while
system("cls");
if (!Chose(hotel, i)) break;
}//while
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -