该楼层疑似违规已被系统折叠隐藏此楼查看此楼
这是从我的酒店管理系统截取出来的一部分,旅客入住这一块有问题,只能储存一个房间的入住信息,如果再输入新的入住信息,旧的房间信息就会被顶掉,也就是说它只能储存一个最新的房间信息
#include
#include
#include
#include
#define LOGIN_USER_MAX 10
#define LOGIN_PASSWORD_MAX 10
#define INPUT_USER_MAX 16
#define INPUT_PASSWORD_MAX 16
#define ROOM_NUMBER_MIN 1//房间号的最小值
#define ROOM_NUMBER_MAX 30//房间号的最大值
#define LEN sizeof(struct Hotel) //用LEN代替结构体的"长度"
typedef struct Hotel//定义结构体变量
{
unsigned int iRoomNumber;
char Name[20];
char Sex[2];
char ID[10];
float Paid;
unsigned int iRegeistYear ;
unsigned int iRegeistMonth ;
unsigned int iRegeistDay ;
struct Hotel *next ;
}*HotelPtr;
char MainMenu(void); //主菜单
int Regeist(void); //登记旅客入住的函数
int CheckNumber(int n); //检查房间是否已经入住的函数
HotelPtr Load(void);
char MainMenu(void)//MainMenu函数,完成菜单功能
{
char select ;
printf ("\n--------------------------欢迎使用旅店信息管理系统---------------------------\n");
printf ("1.创建旅店信息\n");
printf ("2.查看旅店信息\n");
printf ("3.查看某一房间信息\n");
printf ("4.查看旅客信息\n");
printf ("5.查找某一旅客信息\n");
printf ("6.旅客入住\n");
printf ("7.旅客换房\n");
printf ("8.旅客退房\n");
printf ("9.退出管理系统\n");
printf ("\n-----------------------------------------------------------------------------\n");
select = getch();
return select ;
}
int Regeist (void)//Regeist函数,完成旅客入住功能
{
FILE *fpCustomerInformation;//定义文件指针 fpCustomerInformation
char Choice[2];//储存有一个空字符 , 不然就是char型的数组了 ,而不是字符串
unsigned int iTempNumber;
HotelPtr LinklistPtr;
LinklistPtr = (HotelPtr)malloc(LEN);
if (LinklistPtr == NULL)
{
printf ("动态内存分配失败!\n");
getch();
return -1;
}
if((fpCustomerInformation = fopen("CustomerInformation.dat", "a+")) == NULL)
{
printf ("无法打开文件!\n");
getch();
return -1;
}
while(1)
{
printf ("\n请登记入住信息 : \n");
printf ("RoomNumber( %d ~ %d ):", ROOM_NUMBER_MIN, ROOM_NUMBER_MAX);
scanf ("%d", &iTempNumber);
if(iTempNumber < ROOM_NUMBER_MIN || iTempNumber > ROOM_NUMBER_MAX)//检查房间号的正确性
{
printf ("\a\nError !");
return -1;
}
CheckNumber(iTempNumber);//检查该房间是否已经入住
LinklistPtr->iRoomNumber = iTempNumber ;//在该房间没有旅客时,登记入住
printf("Name:\t");
scanf("%s", &LinklistPtr->Name);
printf("Sex:\t");
scanf("%s", &LinklistPtr->Sex);
printf("ID ( <10位 ):\t");
scanf("%s", &LinklistPtr->ID);
printf("Paid:\t");
scanf("%f", &LinklistPtr->Paid);
printf("Date (年月日空格隔开):");
scanf("%d %d %d", &LinklistPtr->iRegeistYear, &LinklistPtr->iRegeistMonth, &LinklistPtr->iRegeistDay);
/*
if(scanf("%d %d %d", &LinklistPtr->iRegeistYear, &LinklistPtr->iRegeistMonth, &LinklistPtr->iRegeistDay) != 3)
{
printf("\a\nError !");
getch();
exit(0);
}
当你输入的整形数据大于3个时 ,这样是检测不到错误的 ,因为scanf()确实成功读入了3个数 ,只是留下一个在缓冲区而已,将要被其他语句取走
*/
LinklistPtr->next = NULL ;
fwrite(LinklistPtr, LEN, 1, fpCustomerInformation); //将链表信息保存到磁盘文件
printf ("\n请选择是否继续登记信息 ( y ): ");
scanf("%s",Choice);
if((strcmp(Choice, "Y") != 0) && (strcmp(Choice, "y") != 0))
{
fclose (fpCustomerInformation);
printf ("\nOk !");
return 0;
}
}
return 0;
}
int CheckNumber(int n) //CheckNumber函数,检查登指定的房间是否已经有旅客入住
{
int iTempNumber = n;
HotelPtr LinklistPtr = Load();
while(LinklistPtr)
{
if (LinklistPtr->iRoomNumber == n)
{
printf ("\n%d号房间已经有旅客入住了!\n",n);
getch();
exit(0);
}
LinklistPtr = LinklistPtr->next ;
}
return 0;
}
HotelPtr Load(void)//定义Load函数读取当前的信息,并存到链表中
{
FILE *fpCustomerInformation;
HotelPtr head, LinklistPtr, TempPtr;
LinklistPtr = (HotelPtr)malloc(LEN);
TempPtr = (HotelPtr)malloc(LEN);
if((LinklistPtr == NULL) || (TempPtr == NULL))
{
printf ("内存分配失败!\n");
getch();
return 0;
}
head = LinklistPtr;
if((fpCustomerInformation = fopen("CustomerInformation.dat","rb")) == NULL)
{
printf ("无法打开文件!\n");
getch();
return 0;
}
while(fread (TempPtr, LEN, 1, fpCustomerInformation)) //读取当前的信息,并存到链表中
{
LinklistPtr->next = TempPtr;
LinklistPtr = TempPtr;
}
LinklistPtr->next = NULL;
return head ;//返回链表的头指针
}
int main () //主函数部分,调用若干子函数完成相应的功能
{
char choice ;
//Login();//登录系统
while(1)
{
system("cls");
choice = MainMenu();
switch(choice)
{
case '6':Regeist();break;
}
printf ("\n\n请按任意键继续 !\n");
getch();
system("cls");
}
return 0 ;
}