You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

387 lines
13 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h> //在使用中要用到的字符串都包含在本文件中
#include <stdlib.h> //exit()函数就包含在此文件中
#include <conio.h>
#define isPrime(year) ((year%4==0&&year%100!=0)||(year%400==0))
int z[100]={0};
int s,j;
FILE *fp;
void check_in(); //声明登记入住函数
void availability(); //声明查询房间入住情况函数
void fate_days(); //声明查询日用住宿的费用
void fate_hours(); //声明查询时用住宿的费用
void check_out_days(); //声明结日用住宿的费用
void check_out_hours(); //声明结时用住宿的费用
void modificate(); //声明修改信息函数
void modificate_person(); //声明修改信息函数中的修改客户信息
void modificate_accommodation(); //声明修改信息函数中的修改住宿信息
void save(); //声明保存函数
void menu(); //声明菜单函数
void days(); //声明入住类型为天数函数
void hours(); //声明入住类型为小时函数
int date1Diff(); //声明计算天数差函数
struct date1
{
int year;
int month;
int day;
};
struct Date
{int year;
int month;
int day;
int hour;
int minute;
}date; //定义日期变量
struct room
{
int room_ID; //房间号
int kind; //房间种类包含单人间双人间三人间VIP套房
char name[20]; //客户姓名
int age; //客户年龄
int sex; //客户性别
char ID_card[20]; //客户身份证号
int day_money; //按日收费价格
int hour_money; //按小时收费价格
int count; //房间数量
struct Date date;
}room[100];
int main()
{
printf("\n");
menu(); //把主菜单用函数来实现
save();
return 0;
}
void menu()
{
int n;
do
{
printf("\n");
printf(" \t ******************欢迎入住酒店***************** \n");
printf("\n *********************菜单********************");
printf("\n******* 1.登记入住 \t *******\n");
printf("******* 2.查询房间入住情况 \t *******\n");
printf("******* 3.查询当前费用(日用) \t *******\n");
printf("******* 4.查询当前费用(时用) \t *******\n");
printf("******* 5.结账当前费用(日用) \t *******\n");
printf("******* 6.结账当前费用(时用) \t *******\n");
printf("******* 7.退出 \t *******");
printf(" *********************菜单********************\n"); //输出菜单界面,让操作员能够方便的选择所需要进行的操作
printf("\n接下来的操作中如果您的信息输入错误请在下一步时输入0则返回菜单重新选择");
printf("\n请输入数字来选择操作:");
scanf("%d",&n);
while(n<1||n>7)
{printf(" *********************您输入的数字有误,请重新输入。********************\n");
scanf("%d",&n);}
switch(n)
{
case 1:check_in();break; //调用登记入住函数
case 2:availability();break; //调用查询房间的入住情况函数
case 3:fate_days();break; //调用查询当前日用费用函数
case 4:fate_hours();break; //调用查询当前时用费用函数
case 5:check_out_days();break; //调用结账日用费用函数
case 6:check_out_hours();break; //调用结账当前时用费用函数
case 7:exit(0); //退出
}
}while(n!=7);
scanf("%d",&n);
}
void check_in() // 登记函数
{
int op,way,po,i,num;
printf("请输入需要的房间数量:");
scanf("%d", &num); while(num<0||num>100)
{printf(" *********************您输入的数字有误,请重新输入。********************\n");
scanf("%d",&num);}
if(num==0) menu();
for (i=1;i<=num;++i) {
printf("请输入登记相关信息:\n");
printf("\n房间%d房号(1号到100号之间)",i);
scanf("%d", &j);if(j==0) menu();
room[j].room_ID = j;
printf("\n请输入年龄:");
scanf("%d", &room[j].age);if(room[j].age==0) menu();
while (j<0||j>100)
{
printf("您的输入有误,请重新输入");
}
printf("\n请选择住宿时间类型:(1表示按天计费2表示按小时计费)\n\t *****注意:如果您所居住时间包括了晚上,请您选择按天计费*****");
scanf("%d", &way);if(way==0) menu();
printf("\n入住时间为(年):");
scanf("%d", &room[j].date.year);if(room[j].date.year==0) menu();
printf("\n入住时间为(月):");
scanf("%d", &room[j].date.month);if(room[j].date.month==0) menu();
printf("\n入住时间为(日):");
scanf("%d", &room[j].date.day);if(room[j].date.day==0) menu();
if (way == 1)
{
printf("\n房间种类:[1代表单人间(200元/天)2代表双人间(390元/天)3代表三人间(475元/天)4代表VIP套房(650元/天)]");
scanf("%d", &op);if(op==0) menu();
}
if (way == 2)
{
printf("\n房间种类:[1代表单人间(10元/小时)2代表双人间(19元/小时)3代表三人间(27元/小时)4代表VIP套房(45元/小时)]");
scanf("%d", &po);if(po==0) menu();
printf("\n入住时间为(小时):");
scanf("%d", &room[j].date.hour);if(room[j].date.hour==0) menu();
printf("\n入住时间为(分钟):");
scanf("%d", &room[j].date.minute);if(room[j].date.minute==0) menu();
}
printf("\n姓名:");
scanf("%s", &room[j].name);if(room[j].name==0) menu();
printf("\n性别(其中1表示男2表示女!):");
scanf("%d", &room[j].sex);if(room[j].sex==0) menu();
printf("\n身份证号:");
scanf("%s", &room[j].ID_card);if(room[j].ID_card==0) menu();
z[j] = 1; //标记使用的房间为1
save();
}
menu();
}
void availability() //查询房间入住情况函数
{
int g,count=0;
for(g=0;g<100;g++)
{
if(z[g]==0)
++count;
else
if(z[g]==1)
printf("\n正在使用的房间号:%d",g);
}
printf("\n\n未使用的房间数:%d",count); //通过循环输出未使用的房间数
printf("\n\n");
printf("\n请输入需查询的房间号: "); //查询输入的房间号的信息,且输出该房间的相关信息
scanf("%d",&s);
while(s<0||s>100)
{printf(" *********************您输入的数字有误,请重新输入。********************\n");
scanf("%d",&s);}if(s==0) menu();
if(z[s]==1)
{printf("姓名:%s",room[s].name);
printf("\n性别(其中1表示男2表示女):%d",room[s].sex);
printf("\n年龄:%d",room[s].age);
printf("\n身份证号:%s",room[s].ID_card);
printf("\n年:%d",room[s].date.year);
printf(" 月:%d",room[s].date.month);
printf(" 日:%d",room[s].date.day);
printf("\n房间号:%d",room[s].room_ID);
}
else
printf("该房间未被使用!");
menu();
save(); //调用保存函数
}
void hours()
{
int nu,numb;
int hour1,minute1;
int hour2,minute2;
printf("请输入入住时间(小时,分钟)");
scanf("%d,%d",&hour1,&minute1);if(hour1==0||minute1==0) menu();
printf("请输入退房时间(小时,分钟)");
scanf("%d,%d",&hour2,&minute2);if(hour2==0||minute2==0) menu();
int t,t1,t2,o,q;
t1=hour1*60+minute1;
t2=hour2*60+minute2;
t=t2-t1;
o=t/60;
q=t%60;
if(q!=0)
o=o+1;
printf("您入住的小时为%d小时",o);
printf("\n您选择的房间类型是1代表单人间2代表双人间3代表三人间4代表VIP套房 ");
scanf("%d",&nu);if(nu==0) menu();
printf("\n您选择了几间套房: ");
scanf("%d",&numb);
while(numb<1||numb>7)
{printf(" *********************您输入的数字有误,请重新输入。********************\n");
scanf("%d",&numb);} if(numb==0) menu();
switch(nu)
{
case 1:printf("您当前费用为 %d 元",10*numb*o);break;
case 2:printf("您当前费用为 %d 元",19*numb*o);break;
case 3:printf("您当前费用为 %d 元",27*numb*o);break;
case 4:printf("您当前费用为 %d 元",45*numb*o);break;
}
}
int date1Diff(struct date1 mindate,struct date1 maxdate)
{
int Days=0,j,flag;
const int primeMonth[][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};
/************************************************************************/
/* 交换两个日期函数,将小的日期给mindate,将大的日期给maxdate */
/************************************************************************/
struct date1 tmp;
if ((mindate.year>maxdate.year)|| (mindate.year==maxdate.year&&mindate.month>maxdate.month)||(mindate.year==maxdate.year&&mindate.month==maxdate.month&&mindate.day>maxdate.day))
{
tmp=mindate;
mindate=maxdate;
maxdate=tmp;
}
/************************************************************************/
/* 从mindate.year开始累加到maxdate.year */
/************************************************************************/
for(j=mindate.year;j<maxdate.year;++j)
Days+=isPrime(j)?366:365; //如果maxdate.year是闰年,则flag=1,后面调用primeMonth[1][12]
flag=isPrime(maxdate.year); //加上maxdate.month到1月的天数
for (j=1;j<maxdate.month;j++)
Days+=primeMonth[flag][j-1]; //减去mindate.month到1月的天数
flag=isPrime(maxdate.year);
for (j=1;j<mindate.month;j++)
Days-=primeMonth[flag][j-1];
Days=Days+maxdate.day-mindate.day;
return Days;
}
void days()
{
int mun,un; // int isPrime(int year);
int date1Diff(struct date1 mindate,struct date1 maxdate);
struct date1 mindate,maxdate;
int Days;
printf("\t\t ***在输入日期过程中请不要让0在首位***");
printf("\n请输入入住日期(年,月,日):");
scanf("%i,%i,%i",&mindate.year,&mindate.month,&mindate.day);if(mindate.year==0||mindate.month==0||mindate.day==0) menu();
printf("请输入退房日期(年,月,日):");
scanf("%i,%i,%i",&maxdate.year,&maxdate.month,&maxdate.day);if(maxdate.year==0||maxdate.month==0||maxdate.day==0) menu();
Days=date1Diff(mindate,maxdate);
printf("您入住的天数为:%d\n",Days);
printf("\n您选择的房间类型是1代表单人间2代表双人间3代表三人间4代表VIP套房 ");
scanf("%d",&un);if(un==0) menu();
printf("\n您选择了几间套房: ");
scanf("%d",&mun); if(mun==0) menu();
switch(un)
{
case 1:printf("您当前费用为 %d 元",200*mun*Days);break;
case 2:printf("您当前费用为 %d 元",290*mun*Days);break;
case 3:printf("您当前费用为 %d 元",475*mun*Days);break;
case 4:printf("您当前费用为 %d 元",650*mun*Days);break;
}
}
void fate_days()
{
days();
menu();
}
void fate_hours()
{
hours();
menu();
}
void check_out_days()
{
int Mun=0, Un,i; // int isPrime(int year);
int date1Diff(struct date1 mindate, struct date1 maxdate);
struct date1 mindate, maxdate;
int Days;
int roomId;
int roomNum;
printf("请输入房间数量:");
scanf("%i", &roomNum);if(roomNum==0) menu();
for (i = 1; i <= roomNum; ++i) {
while (1) {
printf("\n房间%d房号(1号到100号之间)",i);
scanf("%i", &roomId);if(roomId==0) menu();
if (roomId < 0 || roomId >= 100) {
printf("房间号输入有误\n");
continue;
}
else
break;
}
printf("\t\t ***在输入日期过程中请不要让0在首位***");
printf("\n请输入入住日期(年,月,日):");
scanf("%i,%i,%i", &mindate.year, &mindate.month, &mindate.day);if(mindate.year==0||mindate.month==0||mindate.day==0) menu();
printf("请输入退房日期(年,月,日):");
scanf("%i,%i,%i", &maxdate.year, &maxdate.month, &maxdate.day);if(maxdate.year==0||maxdate.month==0||maxdate.day==0) menu();
Days = date1Diff(mindate, maxdate);
printf("您入住的天数为:%d\n", Days);
printf("\n您选择的房间类型是1代表单人间2代表双人间3代表三人间4代表VIP套房 ");
scanf("%d", &Un);if(Un==0) menu();
switch (Un)
{
case 1:Mun+=(200*Days); break;
case 2:Mun += (290 * Days); break;
case 3:Mun+=(475*Days); break;
case 4:Mun += (650 * Days); break;
}
z[roomId] = 0;
memset(room + roomId, 0, sizeof(room));
}
printf("请缴纳 %d 元", Mun);
}
void check_out_hours()
{
int Nu, Numb = 0,i;
int hour1,minute1;
int hour2,minute2;
int roomId;
int roomNum;
printf("请输入房间数量:");
scanf("%i", &roomNum);if(roomNum==0) menu();
for (i = 1; i <= roomNum; ++i) {
while (1) {
printf("\n房间%d房号(1号到100号之间)", i);
scanf("%i", &roomId);if(roomId==0) menu();
if (roomId < 0 || roomId >= 100) {
printf("房间号输入有误\n");
continue;
}
else
break;
}
printf("请输入入住时间(小时,分钟)");
scanf("%d,%d", &hour1, &minute1);if(hour1==0||minute1==0) menu;
printf("请输入退房时间(小时,分钟)");
scanf("%d,%d", &hour2, &minute2);if(hour2==0||minute2==0) menu;
int t, t1, t2, o, q;
t1 = hour1 * 60 + minute1;
t2 = hour2 * 60 + minute2;
t = t2 - t1;
o = t / 60;
q = t % 60;
if (q != 0)
o = o + 1;
printf("您入住的小时为%d小时", o);
printf("\n您选择的房间类型是1代表单人间2代表双人间3代表三人间4代表VIP套房 ");
scanf("%d", &Nu);if(Nu==0) menu;
switch (Nu)
{
case 1:Numb+=(10*o);break;
case 2:Numb+=(19*o);break;
case 3:Numb+=(27*o);break;
case 4:Numb+=(45*o);break;
}
z[roomId]=0;
memset(room+roomId,0,sizeof(room));
}
printf("请缴纳 %d 元", Numb);
}