数据结构课程设计:源代码(C)客房信息管理系统

avatar
作者
猴君
阅读量:2

main.c

#include <unistd.h> #include "SeqList.h" #include "User.h"  int main() {     SL user;     SLInit(&user); 	char ans = 0; 	printf("是否需要导入昨日续住客人的数据:y/n\n"); 	scanf(" %c", &ans); 	if (ans == 'y') 	{ 		LoadUser(&user); 	}else if(ans!='n')     {         printf("请重新输入y/n\n");         scanf(" %c",&ans);     }     menu();     printf("请输入选项:");     int choice = 0;     while (scanf("%d", &choice))     {         switch (choice)         {             case 1:                 userInfoGet(&user);                 break;             case 2:                 find(&user);                 break;             case 3:                 remedy(&user);                 break;             case 4:                 deleteUser(&user);                 break;             case 5:                 sortUser(&user);                 break;             case 6:                 printUser(&user);                 if(user.size==0)                 {                     printf("当前没有客人入住");                 } else{                     printf("当前入住有%d位客人\n",user.size);                 }                  break;             case 7:                 printf("当前入住有%d位客人\n剩余%d间房间\n",user.size,user.Max);                 break;             case 8:                 destroyUser(&user);                 printf("谢谢使用");                 return 1;             default:                 printf("请按照菜单重新输入:");                 break;         }         usleep(1000);         menu();         printf("请输入选项:");     } }

Seqlist.c

 #include "SeqList.h"  //顺序表的初始化 void SLInit(SL* ps) {     assert(ps);//确保没有传入空指针     ps->SeqList = NULL;     ps->size = 0;     ps->Max = 50;//初始化房间最大数量     ps->capacity = 0; }  //顺序表的销毁 void SLDestroy(SL* ps) {     assert(ps);      if (ps->SeqList)     {         free(ps->SeqList);     }      ps->SeqList = NULL;     ps->size = 0;     ps->capacity = 0; }  //顺序表的扩容 void SLCheckCapacity(SL* ps) {     assert(ps);      SLDataType* temp = NULL;     if (ps->size == ps->capacity)     {         int newCapacity = ps->capacity;         temp = (SLDataType*)realloc(ps->SeqList, (newCapacity = (ps->capacity == 0) ? 4 : (ps->capacity * 2)) * sizeof(SLDataType));//扩容         assert(temp);         ps->SeqList = temp;         ps->capacity = newCapacity;         temp = NULL;     } }  //顺序表的尾部插入 //当顺序表有足够的空间插入时(包括有内容和顺序表为空) void SLPushBack(SL* ps, SLDataType x) {     assert(ps);      //顺序表的扩容     SLCheckCapacity(ps);//确保SeqList指针不为空之后判断容量是否足够     //当顺序表有足够的空间插入时(包括有内容和顺序表为空)     ps->SeqList[ps->size] = x;     ps->size++;     ps->Max--;  } //顺序表的指定位置删除 void SLErase(SL* ps, int pos) {     assert(ps);     assert(0 <= pos && pos <= ps->size);//确保pos为有效位置      for (int i = pos + 1; i < ps->size; i++)     {         ps->SeqList[i - 1] = ps->SeqList[i];     }      ps->size--;     ps->Max++; } 

Seqlsit.h

 #include "SeqList.h"  //顺序表的初始化 void SLInit(SL* ps) {     assert(ps);//确保没有传入空指针     ps->SeqList = NULL;     ps->size = 0;     ps->Max = 50;//初始化房间最大数量     ps->capacity = 0; }  //顺序表的销毁 void SLDestroy(SL* ps) {     assert(ps);      if (ps->SeqList)     {         free(ps->SeqList);     }      ps->SeqList = NULL;     ps->size = 0;     ps->capacity = 0; }  //顺序表的扩容 void SLCheckCapacity(SL* ps) {     assert(ps);      SLDataType* temp = NULL;     if (ps->size == ps->capacity)     {         int newCapacity = ps->capacity;         temp = (SLDataType*)realloc(ps->SeqList, (newCapacity = (ps->capacity == 0) ? 4 : (ps->capacity * 2)) * sizeof(SLDataType));//扩容         assert(temp);         ps->SeqList = temp;         ps->capacity = newCapacity;         temp = NULL;     } }  //顺序表的尾部插入 //当顺序表有足够的空间插入时(包括有内容和顺序表为空) void SLPushBack(SL* ps, SLDataType x) {     assert(ps);      //顺序表的扩容     SLCheckCapacity(ps);//确保SeqList指针不为空之后判断容量是否足够     //当顺序表有足够的空间插入时(包括有内容和顺序表为空)     ps->SeqList[ps->size] = x;     ps->size++;     ps->Max--;  } //顺序表的指定位置删除 void SLErase(SL* ps, int pos) {     assert(ps);     assert(0 <= pos && pos <= ps->size);//确保pos为有效位置      for (int i = pos + 1; i < ps->size; i++)     {         ps->SeqList[i - 1] = ps->SeqList[i];     }      ps->size--;     ps->Max++; } 

user.c

#include <unistd.h> #include "SeqList.h" #include "User.h"  // 系统主菜单 void menu() {      usleep(500000); 	printf("*****************************\n"); 	printf("******客房管理系统*******\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("*****************************\n"); } //导入历史信息 void LoadUser(SL* user) {     FILE* pf = fopen("/Users/meiyouyu/Desktop/2/user.txt", "rb");     if (pf == NULL)     {         perror("fopen error!\n");         return;     }     User tmp;     while (fread(&tmp, sizeof(User), 1, pf))     {         SLPushBack(user, tmp);     }     fclose(pf);     printf("****成功导入历史入住数据****\n"); } // 打印所有客人信息 void printUser(SL* user) {     for (int i = 0; i < user->size; i++)     {         printf("第%d名客人:", i + 1);         printf("\t身份证:%ld", user->SeqList[i].id);         printf("\t姓名:%s", user->SeqList[i].name);         printf("\t性别:%s", user->SeqList[i].gender);         printf("\t入住房间档位:%d", user->SeqList[i].level);         printf("\t入住房间号:%d\n", user->SeqList[i].location);     }  } //按照房间号排序 int cmp_loc(const void* p1, const void* p2) {     return ((User *)p1)->location - ((User *)p2)->location; } // 打印排序后的内容 void printSortedUser(User* tmp, int size) {     for (int i = 0; i < size; i++)     {         printf("第%d名客人:", i + 1);         printf("\t客人身份证:%ld", tmp[i].id);         printf("\t姓名:%s", tmp[i].name);         printf("\t性别:%s", tmp[i].gender);         printf("\t入住房间价格:%d", tmp[i].level);         printf("\t房间号:%d\n", tmp[i].location);     } }  //身份证去重 int repeat_id(User tmp,SL user) {     int i;     for (i=0;i<user.size;i++)     {         if(tmp.id==user.SeqList[i].id)         {             return 0;         }      }     return 1; }  // 获取输入 void userInfoGet(SL* user) { 	int num = 0;     char a=0; 	printf("请输入入住用户个数:"); 	scanf("%d", &num); 	for (int i = 0; i < num; i++) 	{         User tmp; 		printf("请输入第%d个客人信息\n", i + 1); 		printf("请输入客人身份证:"); 		scanf("%ld", &(tmp.id));         while (!repeat_id(tmp,*user))         {             printf("身份证重复,请仔细检查重新输入\n");             scanf("%ld", &(tmp.id));         } 		printf("请输入客人姓名:"); 		scanf("%s", tmp.name); 		printf("请输入客人性别:"); 		scanf("%s", tmp.gender); 		printf("要查看已被入住的房间号吗?y/n\n");         scanf(" %c",&a);         if(a=='y')         {             printf("已经入住的有:\n");             qsort(user->SeqList, user->size, sizeof(User), cmp_loc);             printSortedUser(user->SeqList, user->size);         } else if(a!='n')         {             printf("请重新输入y/n\n");             scanf(" %c",&a);         }         printf("请输入客人想要入住的价格:1.199大床房,2.299双人床,3.999豪华大床房 : "); 		scanf("%d", &tmp.level);         while (tmp.level!=999&&tmp.level!=299&&tmp.level!=199)         {             printf("\n输入价格格式错误,请重新输入:1.199大床房,2.299双人床,3.999豪华大床房 : ");             scanf("%d", &tmp.level);         }         printf("请输入客人入住对应等级的房间号: "); 		scanf("%d", &tmp.location); 		SLPushBack(user, tmp);         printf("入住成功\n"); 	} }  // 查找方式菜单 void menuForFind() { 	printf("**************\n"); 	printf("*1. 客人身份证\n"); 	printf("*2. 客人姓名\n"); 	printf("*3. 房间号\n"); 	printf("*4. 退出查找\n"); 	printf("**************\n"); }  // 按照身份证查找,返回在表中位置 int findBy_id(SL* user, long target) { 	for (int i = 0; i < user->size; i++) 	{ 		if (user->SeqList[i].id == target) 		{ 			return i;// 返回对应位置下标 		} 	} 	return -1; } //按照房间号 int findBy_loc(SL* user, long loc) { 	for (int i = 0; i < user->size; i++) 	{ 		if (user->SeqList[i].location == loc) 		{ 			return i;// 返回对应位置下标 		} 	} 	return -1; }  // 按照名字查找 int findBy_name(SL* user, char* target) { 	for (int i = 0; i < user->size; i++) 	{ 		if (strcmp(user->SeqList[i].name, target) == 0) 		{ 			return i;// 返回对应位置下标 		} 	} 	return -1; }  // 选择删除——返回下标 int findUser(SL* user) { 	int choice = 0; 	int pos ; 	menuForFind(); 	printf("请选择查找方式:"); 	while (scanf("%d", &choice)) 	{ 		switch (choice) 		{ 		case 1: 		{ 			long target = 0; 			printf("请输入需要查找的身份证id:"); 			scanf("%ld", &target); 			pos = findBy_id(user, target); 			return pos; 		} 		case 2: 		{ 			char name[50] = { 0 }; 			printf("请输入需要查找的客人姓名:"); 			scanf("%s", name); 			pos = findBy_name(user, name); 			return pos; 		} 		case 3:         {             long loc = 0;             printf("请输入需要查找的身份证id:");             scanf("%ld", &loc);             pos = findBy_loc(user, loc);             return pos;         }         case 4: 			return -1; 		default: 			menuForFind(); 			printf("请重新按照菜单输入:\n"); 			break; 		} 		menuForFind(); 		printf("请选择查找方式:"); 	} 	return -2; }  // 查找身份证 void findnumber(SL* a, long id) { 	int i = 0; 	while (i != a->size)  	{ 		if (id == a->SeqList[i].id)  		{             printf("\n身份证:%ld 姓名:%s 性别:%s  房间号:%d 房间价格:%d\n",                 a->SeqList[i].id, a->SeqList[i].name, a->SeqList[i].gender,a->SeqList[i].location,a->SeqList[i].level);             return; 		} 		i++; 	}     printf("没有检索到对应信息的客人\n");   } //查找房间号 void findlocation(SL* a, int location) { 	int i = 0; 	while (i != a->size) 	{ 		if (location == a->SeqList[i].location) 		{             printf("身份证:%ld 姓名:%s 性别:%s  房间号:%d 房间价格:%d\n",                    a->SeqList[i].id, a->SeqList[i].name, a->SeqList[i].gender,a->SeqList[i].location,a->SeqList[i].level);             return; 		} 		i++; 	}     printf("没有检索到对应信息的客人\n");   } // 查找姓名 void findname(SL* a, char* name)         {             int i = 0;             while (i != a->size)             {                 int j = 0;                 while (a->SeqList[i].name[j] == name[j] &&  name[j] != NULL)                 {                     j++;                 }                 if (j == strlen(name))                 {                     printf("用户信息\n身份证:%ld 姓名:%s 性别:%s  入住房间号:%d 房间价格:%d\n",                         a->SeqList[i].id, a->SeqList[i].name, a->SeqList[i].gender,a->SeqList[i].location,a->SeqList[i].level);                     return;                 }                 i++;             }             printf("没有检索到对应信息的客人\n");         } // 查找 void find(SL* a) { 	printf("请输入需要怎么查找 1.通过身份证查找 2.通过姓名查找 3.通过房间号查找:"); 	int num = 0; 	scanf("%d", &num); 	if (num == 1)  	{ 		printf("请输入需要查找的身份证:"); 		long id = 0; 		scanf("%ld", &id); 		findnumber(a, id); 	} 	else if(num==2) 	{ 		printf("请输入需要查找的姓名:"); 		char name[50]; 		scanf(" %s", name); 		findname(a, name); 	} else if(num==3){         printf("请输入需要查找的房间号:");         int location;         scanf(" %d", &location);         findlocation(a,location);     } else{         printf("输入有误,请仔细检查选项\n");         find(a);     } }  // 修改员工 void remedy(SL* a)  {      printUser(a);     printf("请输入需要修改信息的人员身份证号:"); 	long id = 0; 	scanf("%ld", &id); 	int i = 0; 	while (i != a->size) { 		if (id == a->SeqList[i].id)  		{ 			break; 		} 		i++; 	}     if(i>=a->size)     {         printf("没有找到对应客人信息\n");         return;     } 	printf("输入需要修改的信息编号: 1.身份证 2.姓名 3.性别  4.房间号以及价格:"); 	int num = 0; 	scanf("%d", &num); 	long id1 = 0; 	char name[50]; 	char gender[10]; 	int location;     int level; 	switch (num)  	{ 	case 1: 		printf("请输入修改后身份证:"); 		scanf("%ld", &id1); 		a->SeqList[i].id = id1; break; 	case 2: 		printf("请输入修改后姓名:"); 		scanf(" %s", name); 		strcpy(a->SeqList[i].name, name); break; 	case 3:printf("请输入修改后性别:"); 		scanf(" %s", gender); 		strcpy(a->SeqList[i].gender, gender); break; 	case 4:printf("请输入修改后的房间号和价格:"); 		scanf(" %d", &location); 		scanf(" %d", &level);             a->SeqList[i].location = location;             a->SeqList[i].level = level;             break;      } 	printf("修改完成\n"); }  // 退房 void deleteUser(SL* user) {     char a=0; 	// 调用查找函数 	int pos = findUser(user);     if(pos==0){         return;     } 	if (pos < -1) 	{ 		printf("没有此用户,请仔细核对,或者用户已经办理退房\n");         return; 	}     printf("确定为身份证为%ld的客人办理退房吗?y/n\n",user->SeqList[pos].id);     scanf(" %c",&a);     if(a=='y')     {         SLErase(user, pos);         printf("退房成功\n");     }else{         printf("返回主菜单");     }   }  // 排序菜单 void menuForSort() { 	printf("**************\n"); 	printf("*1. 客人身份证\n"); 	printf("*2. 客人姓名\n"); 	printf("*3. 房间号\n"); 	printf("*4. 房间价格\n"); 	printf("*5. 退出排序\n"); 	printf("**************\n"); }  // 按照身份证排序 int cmp_id(const void* p1, const void* p2) { 	return ((User*)p1)->id - ((User*)p2)->id; } //等级排序 int cmp_lev(const void* p1, const void* p2) {     return ((User*)p1)->level- ((User*)p2)->level; }   // 名字比较 int cmp_name(const void* p1, const void* p2) { 	return strcmp(((User*)p1)->name, ((User*)p2)->name); }     // 排序主体 void sortUser(SL* user) { 	int choice = 0; 	menuForSort(); 	printf("请选择需要排序的字段:"); 	while (scanf("%d", &choice)) 	{ 		switch (choice) 		{ 		case 1: 			qsort(user->SeqList, user->size, sizeof(User), cmp_id); 			printSortedUser(user->SeqList, user->size); 			break; 		case 2: 			qsort(user->SeqList, user->size, sizeof(User), cmp_name);             printSortedUser(user->SeqList, user->size); 			break;         case 3:             qsort(user->SeqList, user->size, sizeof(User), cmp_loc);             printSortedUser(user->SeqList, user->size);             break;         case 4:             qsort(user->SeqList, user->size, sizeof(User), cmp_lev);                 printSortedUser(user->SeqList, user->size);                 break; 		case 5: 			return; 		default: 			menuForSort(); 			printf("请重新按照菜单输入:"); 			break; 		} 		menuForSort(); 		printf("请选择需要排序的字段:"); 	} }  // 向文件中写入数据 void writeIntoFile(SL* user) { 	FILE* pf = fopen("/Users/meiyouyu/Desktop/2/user.txt", "wb"); 	if (pf == NULL)  	{ 		perror("fopen error!\n");  		return; 	} 	//将通讯录数据写⼊⽂件 	for (int i = 0; i < user->size; i++) 	{ 		fwrite(user->SeqList + i, sizeof(User), 1, pf); 	} 	fclose(pf); 	printf("数据保存成功!\n"); }  // 信息销毁函数 void destroyUser(SL* user) { 	char ans = 0; 	printf("当前剩余客户是否需要续住:y/n\n"); 	scanf(" %c", &ans); 	if (ans == 'y') 	{ 		writeIntoFile(user); 	}else if(ans!='n')     {         printf("请重新输入y/n\n");         scanf(" %c",&ans);     } 	SLDestroy(user); } 

user.h

#pragma once  #include "SeqList.h"  typedef struct SeqList_dynamic SL;   typedef struct User {     long id;//身份证     char name[50];//名字     char gender[10];//性别     int level;//入住房间价格     int location;//入住房间号 }User;  // 程序菜单 void menu();  // 导入数据 void LoadUser(SL* employees);  // 初始化——输入 void userInfoGet(SL* employees);  // 查找方式菜单 void menuForFind(); // 查找——返回下标 int findUser(SL* user); // 查找——显示对应客人信息 void find(SL* a);  // 修改信息 void remedy(SL* a);   // 删除员工信息 void deleteUser(SL* user);  // 排序菜单 void menuForSort(); // 按照指定内容排序 void sortUser(SL* user); // 打印排序后的内容 void printSortedUser(User* tmp, int size);  // 向文件中写入数据 void writeIntoFile(SL* user);  // 销毁系统数据 void destroyUser(SL* user);  // 打印所有员工信息 void printUser(SL* user); 

建立如图所示的结构就可以

user.txt打开是乱码是正常的

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!