求助】,有点急11111111111111
旅店系统、床位分配问题
某客店有N个等级的房间,第k级客房有A(k)个,每个房间有B(k)个单人床,以菜单调用方式设计为单身旅客分配床位以及离店时收回床位的程序。要求分配成功时,印出旅客姓名、年龄、性别、到达日期、客房等级、房间号及床位号;分配不成功时,允许更改房间等级,若不更改等级,印出“满客”提示。
仿造站上某大佬的创建过程;在写完之后,构建成功,但始终运行不完全,不知道那里有毛病,求大佬解答QAQ
源代码如下:
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
struct Level{
struct Room *R; ///房间数组
int Roomnum; ///房间个数;
};
struct Room{
int sex; ///性别
int allcount; /// 总床位个数
int count; ///空床位个数
int Rnum; ///房间号
struct Bed *B; ///床位数组
};
struct Bed { ///床位情况;
int Bnum; ///床位号
char *name; ///姓名
int in; ///是否入住
char *id; ///ID
};
int n, x ,y, e;
void Createhotel(struct Level *h){ /// 创建旅馆
printf("输入总级数:");
scanf("%d", &n);
int a, b;
h = (struct Level*)malloc(sizeof(struct Level)*n);
for(int i = 0; i < n; i++){
printf("输入%d级下的房间数和房间的床位数:", i + 1);
scanf("%d %d", &a, &b);
h[i].Roomnum = a;
h[i].R = (struct Room*)malloc(sizeof(struct Room)*a);
for(int j = 0; j < a; j++){
h[i].R[j].sex = 0;
h[i].R[j].count = b;
h[i].R[j].allcount = b;
h[i].R[j].Rnum = (i + 1)*100 + j;
h[i].R[j].B = (struct Bed*)malloc(sizeof(struct Bed)*b);
for(int k = 0; k < b; k++){
h[i].R[j].B[k].Bnum = k + 1;
h[i].R[j].B[k].in = 0;
h[i].R[j].B[k].name = " ";
h[i].R[j].B[k].id = " ";
}
}
}
}
int Checklevfull(struct Level a){ ///判断某级是否已满
for(int i = 0; i < a.Roomnum; i++){
if(a.R[i].count) return 1;
}
return 0;
}
int Checkallfull(struct Level *a){ ///判断全店是否已满
for(int i = 0; i < n; i++){
if(Checklevfull(a[i])) return 1;
}
return 0;
}
void Checklevempty(struct Level a){ ///查询某等级的空余床位 0 不限 1 男 2 女
e = 0;
if(x = 0){
for(int i = 0; i < a.Roomnum; i++){
if(a.R[i].count > 0){
e++;
if(a.R[i].sex = 1){printf("(M)");}
else if(a.R[i].sex = 2){printf("(F)");}
else {printf("(空)");}
printf("%d号房:", a.R[i].Rnum);
for(int j = 0; j < a.R[i].allcount; j++){
if(a.R[i].B[j].in = 0)
printf("%4d号", a.R[i].B[j].Bnum);
}
}
}
} else if(x = 1){
for(int i = 0; i < a.Roomnum; i++){
if(a.R[i].sex == 1 || a.R[i].sex == 0){
if(a.R[i].count > 0){
e++;
printf("%d号房:", a.R[i].Rnum);
for(int j = 0; j < a.R[i].allcount; j++){
if(a.R[i].B[j].in = 0)
printf("%4d号", a.R[i].B[j].Bnum);
}
}
}
}
}else {
for(int i = 0; i < a.Roomnum; i++){
if(a.R[i].sex == 2 || a.R[i].sex == 0){
if(a.R[i].count > 0){
e++;
printf("%d号房:", a.R[i].Rnum);
for(int j = 0; j < a.R[i].allcount; j++){
if(a.R[i].B[j].in = 0)
printf("%4d号", a.R[i].B[j].Bnum);
}
}
}
}
}
}
void Checkempty(struct Level *a){ ///查询空余床位 0 不限 1 男 2 女
int z;
printf("----0 查询全店 1 查询特定等级----\n请输入:");
scanf("%d", &z);
printf("\n");
if(z == 1){
printf("输入需要查询的等级和性别(0 不限 1 男 2 女):");
scanf("%d %d", &y, &x);
printf("\n");
Checklevempty(a[y-1]);
if( e==0 ) printf("满客!");
printf("\n");
} else {
int f = 0;
printf("输入需要查询的性别(0 不限 1 男 2 女):");
scanf("%d", &x);
if(x == 1){printf("\n全店的男性床位空余情况:\n");}
else if(x == 2){printf("\n全店的女性床位空余情况:\n");}
else {printf("\n全店的床位空余情况:\n");}
for(int i = 0; i < n; i++){
y = i;
Checklevempty(a[y]);
f+=e;
printf("\n");
}
if( f==0 ) printf("满客!");
}
}
int Levsexfull(struct Level a, int x){ ///查询某等级男、女客是否已满
for(int i = 0; i < a.Roomnum; i++){
if(x == 1){
if(a.R[i].sex == 1 || a.R[i].sex == 0){
if(a.R[i].count > 0) return 1;
}
}else {
if(a.R[i].sex == 2 || a.R[i].sex == 0){
if(a.R[i].count > 0) return 1;
}
}
}
return 0;
}
int Sexfull(struct Level *a, int x){ ///查询全店男、女客是否已满
for(int i = 0; i < n; i++){
if(Levsexfull(a[i], x)) return 1;
}
return 0;
}
void Guestimfo(struct Level *a){ ///根据姓名查询客户信息
char *name;
printf("输入需要查询的客户姓名:");
scanf("%s", name);
e = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < a[i].Roomnum; j++){
for(int k = 0; k < a[i].R[j].allcount; k++){
if(strcmp(name, a[i].R[j].B[k].name) == 0){
printf("------客户信息------\n");
printf("姓名:%s\n", a[i].R[j].B[k].name);
printf("性别:");
if(a[i].R[j].sex == 1)printf("男\n");
else printf("女\n");
printf("ID:%s\n", a[i].R[j].B[k].id);
printf("等级:%d 房间号:%d 床号:%d\n", n+1, a[i].R[j].Rnum, a[i].R[j].B[k].Bnum);
e++;
}
}
}
}
if(e == 0) printf("抱歉,未查询到该客户的入住信息!\n");
}
void Order(struct Level *a){ ///定房入住
int g, l;
if(Checkallfull(a) == 0){
printf("本店满客!");
exit(1);
}
if(Sexfull(a, 1) == 0)printf("本店男性满客!");
if(Sexfull(a, 2) == 0)printf("本店女性满客!");
printf("请输入订房等级(1-%d)及性别 (1 男 2 女):", n);
scanf("%d %d", &y, &x);
while(Levsexfull(a[y-1], x) == 0){
if(Levsexfull(a[y-1], x) == 0) printf("该等级已满!是否查看其他等级(0 查看 1 退出):");
scanf("%d", &g);
printf("\n");
if(g == 1) exit(1);
else{
printf("请重新输入等级(1-%d):", n);
scanf("%d", &y);
}
}
printf("---选择房间: 0 系统分配 1 自行选择---\n请输入:");
scanf("%d", &l);
if(l == 0){
for(int i = 0; i < a[y-1].Roomnum; i++){
if((a[y-1].R[i].count > 0 && a[y-1].R[i].sex == x) || a[y-1].R[i].sex == 0){
for(int j = 0; j < a[y-1].R[i].allcount; j++){
if(a[y-1].R[i].B[j].in == 0)
a[y-1].R[i].sex = x;
a[y-1].R[i].count--;
printf("请输入您的姓名:");
scanf("%s", a[y-1].R[i].B[j].name);
printf("请输入您的ID:");
scanf("%s", a[y-1].R[i].B[j].id);
a[y-1].R[i].B[j].in = 1;
printf("----订房成功-----\n");
printf("客户姓名:%s\n", a[y-1].R[i].B[j].name);
printf("性别:");
if(x == 1)printf("男\n");
else printf("女\n");
printf("ID:", a[y-1].R[i].B[j].id);
printf("房间信息:%d级%d房%d%号床\n", y, a[y-1].R[i].Rnum, a[y-1].R[i].B[j].Bnum);
}
}
}
} else{
int o, p, q;
Checklevempty(a[y-1]);
printf("输入您选择的房间号:");
scanf("%d", &o);
p = o%100;
q = (o-p)/100;
while(q != y || p > a[y-1].Roomnum-1){
printf("输入有误,请重新输入:");
scanf("%d", &o);
}
for(int j = 0; j < a[y-1].R[p].allcount; j++){
if(a[y-1].R[p].B[j].in == 0)
a[y-1].R[p].sex = x;
a[y-1].R[p].count--;
printf("请输入您的姓名:");
scanf("%s", a[y-1].R[p].B[j].name);
printf("请输入您的ID:");
scanf("%s", a[y-1].R[p].B[j].id);
a[y-1].R[p].B[j].in = 1;
printf("----订房成功-----\n");
printf("客户姓名:%s\n", a[y-1].R[p].B[j].name);
printf("性别:");
if(x == 1)printf("男\n");
else printf("女\n");
printf("ID:", a[y-1].R[p].B[j].id);
printf("房间信息:%d级%d房%d%号床\n", y, a[y-1].R[p].Rnum, a[y-1].R[p].B[j].Bnum);
}
}
}
void Checkout(struct Level *a){ ///退房
char *name , *id;
int o, p, q, e = 0;
printf("输入客户姓名:");
scanf("%s", name);
printf("输入客户ID:");
scanf("%s", id);
printf("输入需要退房的房间号:");
scanf("%d", &o);
p = o%100;
q = (o-p)/100-1;
while(q < 0 || q > n-1 || p > a[q].Roomnum-1){
printf("输入有误,请重新输入:");
scanf("%d", &o);
p = o%100;
q = (o-p)/100-1;
}
for(int k = 0; k < a[q].R[p].allcount; k++){
if(strcmp(name, a[q].R[p].B[k].name) == 0 && strcmp(id, a[q].R[p].B[k].id) == 0){
e++;
printf("退房成功!谢谢光临!");
a[q].R[p].B[k].name = " ";
a[q].R[p].B[k].id = " ";
a[q].R[p].B[k].in = 0;
a[q].R[p].count++;
if(a[q].R[p].count == a[q].R[p].allcount)
a[q].R[p].sex = 0;
}
}
if(e == 0) printf("抱歉,未在%d房查询到该客户的入住信息!\n", a[q].R[p].Rnum);
}
int main(){
int op;
struct Level *h;
Createhotel(h);
printf("欢迎来到XX酒店!!!\n");
printf("------1 入 住------\n");
printf("------2 退 房------\n");
printf("------3 查询客户信息------\n");
printf("------4 查 询 空 房------\n");
printf("------5 退 出------\n");
while(1){
printf("请输入:");
scanf("%d", &op);
while(op != 1 && op != 2 && op != 3 && op != 4 && op != 5)
printf("\n");
switch(op){
case 1: Order(h);break;
case 2: Checkout(h);break;
case 3: Guestimfo(h);break;
case 4: Checkempty(h);break;
case 5: printf("谢谢使用!");exit(1);break;
}
}
}