控制台旅店信息管理系统,C语言版

来源:互联网 发布:交换机telnet端口 编辑:程序博客网 时间:2024/06/02 13:27
#include <stdio.h>#include <conio.h>#include <stdlib.h>#include <string.h>#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代替结构体的"长度"const char LoginUser[LOGIN_USER_MAX] = "admin";const char LoginPassword[LOGIN_PASSWORD_MAX] = "password";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 NewHotelInformation(void); //创建旅店信息的函数int ShowHotelInformation(void); //显示旅店信息的函数int ShowEvery(void); //显示所有旅客信息的函数int SearchRoomNumber(void); //查找某房间号信息的函数int SearchName(void); //查找某旅客信息的函数int ChangeRoomNumber(void); //换房函数int DeleteRoomNumber(void); //退房函数int CheckNumber(int n); //检查房间是否已经入住的函数HotelPtr Load(void); //加载信息的函数int Login(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 NewHotelInformation()//NewHotelInformation函数,完成创建旅店信息功能{FILE *fpHotelInformation;//定义文件指针char choice[2];char chTemp;printf("\n确定创建新的旅店信息吗 ? 该操作将清除现有的旅店信息!( y ): ");gets(choice);if((strcmp(choice,"Y") != 0) && (strcmp(choice,"y") != 0)){return -1;}if((fpHotelInformation = fopen("HotelInformation.dat","w")) == NULL){printf ("无法打开文件!\n");getch();return -1;}printf("\n请创建新的旅店信息(以#结束):\n");while( (chTemp = getchar()) != '#')//判断是否结束输入信息{fputc(chTemp, fpHotelInformation); }fclose(fpHotelInformation);//关闭文件 printf("\n创建信息成功!");return 0;}int ShowHotelInformation(void) //ShowHotelInformation函数,完成查看旅店信息功能{FILE *fpHotelInformation;char chTemp ;if ((fpHotelInformation = fopen("HotelInformation.dat","r")) == NULL) {printf("无法打开文件!\n");getch(); return -1;}system("cls");printf("\n\n\t\t\t 旅店信息介绍: (若没有旅店信息请返回创建)\n\n\n\t");while((chTemp = fgetc(fpHotelInformation)) != EOF){putchar(chTemp);}fclose(fpHotelInformation);//关闭文件 getch();return 0;}int Regeist (void)//Regeist函数,完成旅客入住功能{FILE *fpCustomerInformation;//定义文件指针 fpCustomerInformationchar 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 ShowEvery(void)//ShowEvery函数,用来显示所有旅客信息{HotelPtr ListPtr = Load()->next;printf ("\n所有入住旅客的信息如下:\n\n\n");printf("Number Name Sex ID Paid Date");printf("\n");while (ListPtr){printf("\n");printf("%-2d %-20s %s\t %-10s %4.0f %-4d:%-2d:%0-2d",ListPtr->iRoomNumber, ListPtr->Name, ListPtr->Sex, ListPtr->ID, ListPtr->Paid, ListPtr->iRegeistYear, ListPtr->iRegeistMonth, ListPtr->iRegeistDay);ListPtr = ListPtr->next;}return 0;}int SearchRoomNumber(void) //SearchRoomNumber函数,用来查看某一房间的信息{char Choice[2];//储存有空字符unsigned int iTempNumber;//iTempNumber用来储存需要查询的RoomNumberHotelPtr ListPtr = Load()->next;printf("\n请输入需要查看的房间序号:( %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;}while(1){if(ListPtr){if(iTempNumber == ListPtr->iRoomNumber)//遍历链表{printf ("\n");printf("Number Name Sex ID Paid Date");printf("\n\n");printf("%-2d %-20s %s\t %-10s %4.0f %-4d:%-2d:%0-2d", ListPtr->iRoomNumber, ListPtr->Name, ListPtr->Sex, ListPtr->ID, ListPtr->Paid, ListPtr->iRegeistYear, ListPtr->iRegeistMonth, ListPtr->iRegeistDay);printf("\n\n请选择是否继续查看信息( y ):\n");scanf("%s",Choice);if((strcmp(Choice, "Y") != 0) && (strcmp(Choice, "y") !=0 )){getch();return 0;}else{ListPtr = Load()->next;//重置为链表头printf ("\n请输入需要查看的房间序号:( %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;}continue ;//跳出该层循环}}ListPtr = ListPtr->next;}else{printf("\n该房间还没有旅客入住 ! ");return 0;}}return 0;}int SearchName(void)//SearchName函数,查看某一旅客的信息{char Choice[2];char TempName[20];//用数组inName[20]来储存需要查询的旅客NameHotelPtr ListPtr = Load()->next;printf("\n请输入需要查看的旅客姓名:");scanf("%s",TempName);while(1){if(ListPtr){if(strcmp(TempName, ListPtr->Name) == 0){printf("\n");printf("Number Name Sex ID Paid Date");printf("\n\n");printf("%-2d %-20s %s\t %-10s %4.0f %-4d:%-2d:%0-2d", ListPtr->iRoomNumber, ListPtr->Name, ListPtr->Sex, ListPtr->ID, ListPtr->Paid, ListPtr->iRegeistYear, ListPtr->iRegeistMonth, ListPtr->iRegeistDay);printf("\n\n请选择是否继续查看信息( y ): \n");scanf("%s",Choice);if((strcmp(Choice, "Y") != 0) && (strcmp(Choice, "y") !=0 )){return 0;}else{ListPtr = Load()->next;printf ("\n请输入需要查看的旅客姓名:");scanf("%s",TempName);continue ;}}ListPtr = ListPtr ->next;}else {printf ("\n没有查到该旅客的信息");return 0;}}return 0;}int ChangeRoomNumber(){FILE *fpCustomerInformation;unsigned int iTempNumber ;//iRoomNumber用来储存需要换房的RoomNumberunsigned int iNewRoomNumber ;HotelPtr head = Load();HotelPtr ListPtr = head->next;HotelPtr ListPtrToWrite;printf ("\n请输入需要换房的房间序号:( %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;}for (;;){if (ListPtr){if(iTempNumber == ListPtr->iRoomNumber){printf ("\n");printf("Number Name Sex ID Paid Date");printf("\n\n");printf("%-2d %-20s %s\t %-10s %4.0f %-4d:%-2d:%0-2d", ListPtr->iRoomNumber, ListPtr->Name, ListPtr->Sex, ListPtr->ID, ListPtr->Paid, ListPtr->iRegeistYear, ListPtr->iRegeistMonth, ListPtr->iRegeistDay);printf ("\n");printf ("\n请输入需要换到的房间序号:( %d ~ %d ):",ROOM_NUMBER_MIN, ROOM_NUMBER_MAX);scanf ("%d",&iNewRoomNumber);if(iNewRoomNumber < ROOM_NUMBER_MIN || iNewRoomNumber > ROOM_NUMBER_MAX) //检查房间号的正确性{printf ("\a\nError !");return -1;}CheckNumber(iNewRoomNumber);ListPtr->iRoomNumber = iNewRoomNumber;break;}ListPtr = ListPtr->next;}else{printf ("\n该房间还没有旅客入住!\n");return 0;}}//把新的信息写入文件保存ListPtrToWrite = head->next ;if((fpCustomerInformation = fopen("CustomerInformation.dat","wb")) == NULL){printf("无法打开文件!\n");getch();return -1;}while(ListPtrToWrite){fwrite(ListPtrToWrite, LEN, 1, fpCustomerInformation);ListPtrToWrite = ListPtrToWrite->next ;}fclose(fpCustomerInformation);printf ("\nOk!");return 0;}int DeleteRoomNumber(void){FILE *fpCustomerInformation;unsigned int iTempNumber;//用数组TempName[20]来储存需要退房旅客NameHotelPtr head = Load();HotelPtr ListPtr, previous, ListPtrToWrite;ListPtr = head->next;previous = (HotelPtr)malloc(LEN);if (previous == NULL){printf ("动态内存分配失败!\n");getch();return -1;}printf ("\n请输入需要退房的房间序号 ( %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;}for(;;){if (ListPtr){if(iTempNumber == ListPtr->iRoomNumber){printf ("\n");printf("Number Name Sex ID Paid Date");printf("\n\n");printf("%-2d %-20s %s\t %-10s %4.0f %-4d:%-2d:%0-2d", ListPtr->iRoomNumber, ListPtr->Name, ListPtr->Sex, ListPtr->ID, ListPtr->Paid, ListPtr->iRegeistYear, ListPtr->iRegeistMonth, ListPtr->iRegeistDay);printf ("\n");if(ListPtr == head){head = ListPtr->next;}else {previous = head ;while(previous->next != ListPtr) //找到需要查找节点的前驱节点{previous = previous->next ;}if (ListPtr->next == NULL){previous->next = NULL ;}else{previous->next = ListPtr->next ;}break ;}}ListPtr = ListPtr->next;}else {printf ("\n该房间没有旅客入住!\n");getch();return -1;}}ListPtrToWrite = head->next ;if((fpCustomerInformation = fopen("CustomerInformation.dat","wb")) == NULL){printf ("无法打开文件!\n");getch();return -1;}while(ListPtrToWrite){fwrite(ListPtrToWrite, LEN, 1, fpCustomerInformation);ListPtrToWrite = ListPtrToWrite->next ;}fclose(fpCustomerInformation);printf ("\nOk!");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 -1;}head = LinklistPtr;if((fpCustomerInformation = fopen("CustomerInformation.dat","rb")) == NULL){printf ("无法打开文件!\n");getch();return -1;}while(fread (TempPtr, LEN, 1, fpCustomerInformation)) //读取当前的信息,并存到链表中{LinklistPtr->next = TempPtr;LinklistPtr = TempPtr;}LinklistPtr->next = NULL;return head ;//返回链表的头指针}int Login(void)//系统登陆函数{int status = 0;int iPasswordCount = 0;char InputUser[INPUT_USER_MAX];char InPutPassword[INPUT_PASSWORD_MAX];printf("LoginUser : ");scanf("%s", InputUser);printf("Password : ");while(iPasswordCount <= INPUT_PASSWORD_MAX){InPutPassword[iPasswordCount] = getch();if((InPutPassword[iPasswordCount] =='\n') || (InPutPassword[iPasswordCount] == '\r')){break;}putchar('*');iPasswordCount++;}InPutPassword[iPasswordCount] = '\0';if((strcmp(InputUser, "admin") == 0)&&(strcmp(InPutPassword, "password") == 0)){status = 1;}if(status == 0){printf("\nLogin Failure ! Press any key to exit !\n");getch();exit(0);}return 0;}int main () //主函数部分,调用若干子函数完成相应的功能{char choice ;//Login();//登录系统while(1){system("cls");choice = MainMenu();switch(choice) { case '1':NewHotelInformation();break; case '2':ShowHotelInformation();break; case '3':SearchRoomNumber();break; case '4':ShowEvery();break; case '5':SearchName();break; case '6':Regeist();break; case '7':ChangeRoomNumber();break; case '8':DeleteRoomNumber();break; case '9':exit(0);break; default :printf ("\aError !");break ;}printf ("\n\n请按任意键继续 !\n");getch();system("cls");}return 0 ;}


0 0
原创粉丝点击