⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hotel.c

📁 拿“优”的数据结构课程设计:模拟旅馆管理系统的床位的分配与回收功能。 里头包括源代码、exe文件、课程设计报告。非常全
💻 C
📖 第 1 页 / 共 2 页
字号:
    int rank, sex, roomNum, bedNum;
    //询问顾客的性别、房间号和床位号
    AskGuestRoomBed(H, &rank, &sex, &roomNum, &bedNum);
    //回收床位
    while (!ReclaimBed(H, rank, sex, roomNum, bedNum))
    {
        printf("    您的输入有错,请重新输入。\n");
        AskGuestRoomBed(H, &rank, &sex, &roomNum, &bedNum);
    }//while
    //顾客离开时间为当前程序时间
    H->guest->leave.year = H->today.year;
    H->guest->leave.month = H->today.month;
    H->guest->leave.day = H->today.day;
    PrintAccount(H, rank, sex, roomNum, bedNum);//打印账单
    free(H->guest); //删除顾客信息
    H->guest = NULL;
    return OK;
}

//询问顾客的性别、房间号和床位号
Status AskGuestRoomBed(hotel *H, int *R, int *S, int *RN, int *BN)
{
    int roomNum;
    printf("    请输入退房旅客的信息。\n");
    printf("    顾客性别:");
    scanf("%d", S); //性别
    while((*S)<0 || (*S)>1)
    {
        printf("    性别超出范围,请重新输入:");
        scanf("%d", S);
    }//while
    //输入房间号码
    printf("    房间号码:");
    scanf("%d", RN); //性别房间号码
    (*R) = (*RN)/100;
    roomNum = (*RN)%100;
    while((*R)<1 || (*R)>H->rank[0].TRnum
            || roomNum<0 || roomNum>H->rank[(*R)].TRnum)
    {
        printf("    房间号码超出范围,请重新输入:");
        scanf("%d", RN);
        (*R) = (*RN)/100;
        roomNum = (*RN)%100;
    }//while
    printf("    床位号码:");
    scanf("%d", BN); //性别房间号码
    while((*BN)<0 || (*BN)>H->rank[(*R)].RBnum)
    {
        printf("    床位号码超出范围,请重新输入:");
        scanf("%d", BN);
    }//while
    return OK;
}//询问顾客的性别、房间号和床位号

//回收床位
Status ReclaimBed(hotel *H, int R, int S, int RN, int BN)
{
    roomptr tempRoom1, tempRoom2;
    //在空床链寻找该房间
    if (H->rank[R].EBlink[S])
    {
        tempRoom1 = H->rank[R].EBlink[S];
        //要查找的房间是第一个结点
        if (tempRoom1->Rnum == RN)
        {
            if (!tempRoom1->guest[BN])
            {
                return FALSE;
            }//if //该床位没有住人
            tempRoom1->Ebed[tempRoom1->Btop] = BN; //床位入栈
            tempRoom1->Btop++; //栈顶指针上移
            H->guest = tempRoom1->guest[BN]; //将顾客信息反馈到H
            tempRoom1->guest[BN] = NULL;     //顾客信息指针置空
            H->rank[R].Ebed[S]++;            //该级别该性别可用空床数加一
            H->rank[0].Ebed[S]++;            //该性别所有可用空床数加一
            if (tempRoom1->Btop == H->rank[R].RBnum)
            {
                H->rank[R].Eroom[H->rank[R].Rtop] = RN; //进入空房栈
                H->rank[R].Rtop++; //栈顶指针上移
                H->rank[R].Ebed[(S-1)*(0-1)] += H->rank[R].RBnum;
                                      //该级别另一性别可用空床数加该级别每房间床数
                H->rank[0].Ebed[(S-1)*(0-1)] += H->rank[R].RBnum;
                                      //另一性别所有可用空床数加该级别每房间床数
                H->rank[R].EBlink[S] = tempRoom1->Rlink; //从空床链摘除
                free (tempRoom1);                        //释放内存空间
            }//if //房间空则回收该房间进入空房栈
            return OK;
        }//if //要查找的房间是第一个结点
        //不是第一个结点,剩下的结点中寻找
        tempRoom2 = tempRoom1->Rlink;
        while (tempRoom2!=NULL && tempRoom2->Rnum!=RN)
        {
            tempRoom1 = tempRoom2;
            tempRoom2 = tempRoom1->Rlink;
        }//while //遍历其余结点
        //如果找到该房间
        if (tempRoom2 != NULL) 
        {
            if (!tempRoom2->guest[BN])
            {
                return FALSE;
            }//if //该床位没有住人
            tempRoom2->Ebed[tempRoom2->Btop] = BN; //床位入栈
            tempRoom2->Btop++; //栈顶指针上移
            H->guest = tempRoom2->guest[BN]; //将顾客信息反馈到H
            tempRoom2->guest[BN] = NULL;     //顾客信息指针置空
            H->rank[R].Ebed[S]++;            //该级别该性别可用空床数加一
            H->rank[0].Ebed[S]++;            //该性别所有可用空床数加一
            if (tempRoom2->Btop == H->rank[R].RBnum)
            {
                H->rank[R].Eroom[H->rank[R].Rtop] = RN; //进入空房栈
                H->rank[R].Rtop++; //栈顶指针上移
                H->rank[R].Ebed[(S-1)*(0-1)] += H->rank[R].RBnum;
                                      //该级别另一性别可用空床数加该级别每房间床数
                H->rank[0].Ebed[(S-1)*(0-1)] += H->rank[R].RBnum;
                                      //另一性别所有可用空床数加该级别每房间床数
                tempRoom1->Rlink = tempRoom2->Rlink; //从空床链摘除
                free (tempRoom2);                    //释放内存空间
            }//if //房间空则回收该房间进入空房栈
            return OK;
        }//if //如果找到该房间
    }//if //在空床链寻找该房间
    //没找到,在满床链寻找该房间
    if (H->rank[R].FRlink[S])
    {
        tempRoom1 = H->rank[R].FRlink[S];
        //要查找的房间是第一个结点
        if (tempRoom1->Rnum == RN)
        {
            if (!tempRoom1->guest[BN])
            {
                return FALSE;
            }//if //该床位没有住人
            tempRoom1->Ebed[tempRoom1->Btop] = BN; //床位入栈
            tempRoom1->Btop++; //栈顶指针上移
            H->guest = tempRoom1->guest[BN]; //将顾客信息反馈到H
            tempRoom1->guest[BN] = NULL;     //顾客信息指针置空
            H->rank[R].Ebed[S]++;            //该级别该性别可用空床数加一
            H->rank[0].Ebed[S]++;            //该性别所有可用空床数加一
            H->rank[R].FRlink[S] = tempRoom1->Rlink; //从满床链摘除
            if (tempRoom1->Btop == H->rank[R].RBnum)
            {
                H->rank[R].Eroom[H->rank[R].Rtop] = RN; //进入空房栈
                H->rank[R].Rtop++; //栈顶指针上移
                H->rank[R].Ebed[(S-1)*(0-1)] += H->rank[R].RBnum;
                                      //该级别另一性别可用空床数加该级别每房间床数
                H->rank[0].Ebed[(S-1)*(0-1)] += H->rank[R].RBnum;
                                      //另一性别所有可用空床数加该级别每房间床数
                free (tempRoom1); //释放内存空间
            }//if //房间空则回收该房间进入空房栈
            else
            {
                tempRoom1->Rlink = H->rank[R].EBlink[S];
                H->rank[R].EBlink[S] = tempRoom1;
            }//else //房间非空则该房间进入空床栈
            return OK;
        }//if //要查找的房间是第一个结点
        //不是第一个结点,剩下的结点中寻找
        tempRoom2 = tempRoom1->Rlink;
        while (tempRoom2!=NULL && tempRoom2->Rnum!=RN)
        {
            tempRoom1 = tempRoom2;
            tempRoom2 = tempRoom1->Rlink;
        }//while //遍历其余结点
        //如果找到该房间
        if (tempRoom2 != NULL) 
        {
            if (!tempRoom2->guest[BN])
            {
                return FALSE;
            }//if //该床位没有住人
            tempRoom2->Ebed[tempRoom2->Btop] = BN; //床位入栈
            tempRoom2->Btop++; //栈顶指针上移
            H->guest = tempRoom2->guest[BN]; //将顾客信息反馈到H
            tempRoom2->guest[BN] = NULL;     //顾客信息指针置空
            H->rank[R].Ebed[S]++;            //该级别该性别可用空床数加一
            H->rank[0].Ebed[S]++;            //该性别所有可用空床数加一
            tempRoom1->Rlink = tempRoom2->Rlink; //从满床链摘除
            if (tempRoom2->Btop == H->rank[R].RBnum)
            {
                H->rank[R].Eroom[H->rank[R].Rtop] = RN; //进入空房栈
                H->rank[R].Rtop++; //栈顶指针上移
                H->rank[R].Ebed[(S-1)*(0-1)] += H->rank[R].RBnum;
                                      //该级别另一性别可用空床数加该级别每房间床数
                H->rank[0].Ebed[(S-1)*(0-1)] += H->rank[R].RBnum;
                                      //另一性别所有可用空床数加该级别每房间床数
                free (tempRoom2); //释放内存空间
            }//if //房间空则回收该房间进入空房栈
            else
            {
                tempRoom2->Rlink = H->rank[R].EBlink[S];
                H->rank[R].EBlink[S] = tempRoom2;
            }//else //房间非空则该房间进入空床栈
            return OK;
        }//if //如果找到该房间
    }//if //在满床链寻找该房间
    //没找到
    return FALSE;
}//回收床位

//打印账单
Status PrintAccount(hotel *H, int R, int S, int RN, int BN)
{
    int day;
    char sex[2][3]={"男","女"};
    day = DiffDate(H->guest->arrive, H->guest->leave);
    printf("\n\n");
    printf("    ┏━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
    printf("    ┃                    账     单                   ┃\n");
    printf("    ┣━━━━┯━━┯━━┯━━━━━━┯━━━━━━┫\n");
    printf("    ┃  姓名  │性别│年龄│到 达 日 期 │离 开 日 期 ┃\n");
    printf("    ┠────┼──┼──┼──────┼──────┨\n");
    printf("    ┃%6s  │ %2s │ %2d │%5d-%2d-%2d │%5d-%2d-%2d ┃\n",
            H->guest->name, sex[H->guest->sex], H->guest->age,
            H->guest->arrive.year, H->guest->arrive.month, H->guest->arrive.day, 
            H->guest->leave.year, H->guest->leave.month, H->guest->leave.day);
    printf("    ┠────┼──┴─┬┴───┬──┴─┬────┨\n");
    printf("    ┃房间等级│房间号码│床位号码│住宿时间│住宿费用┃\n");
    printf("    ┠────┼────┼────┼────┼────┨\n");
    printf("    ┃   %2d   │   %3d  │   %2d   │ %3d天  │  %4d  ┃\n",
            R, RN, BN, day,day*(H->rank[R].price));
    printf("    ┗━━━━┷━━━━┷━━━━┷━━━━┷━━━━┛\n");
    printf("\n     ");
    system("pause");
    system("cls");
    return OK;
}//打印账单

//显示当前剩余客房
Status PrintEmptyBed(hotel *H)
{
    int i;
    printf("\n\n\n                 ┏━━━┯━━━┯━━━┯━━━━┓\n");
    printf("                 ┃ 等级 │  男  │  女  │价格/天 ┃\n");
    printf("                 ┠───┼───┼───┼────┨\n");
    printf("                 ┃ 总数 │ %3d  │ %3d  │        ┃\n",
            H->rank[0].Ebed[0], H->rank[0].Ebed[1]);
    for (i=1; i<=H->rank[0].TRnum; i++)
    {
        printf("                 ┠───┼───┼───┼────┨\n");
        printf("                 ┃ %3d  │ %3d  │ %3d  │   %3d  ┃\n",
                i, H->rank[i].Ebed[0], H->rank[i].Ebed[1], H->rank[i].price);
	}
    printf("                 ┗━━━┷━━━┷━━━┷━━━━┛\n");
    printf("\n\n\n                 ");
    system("pause");
    system("cls");
    
}
//显示菜单
Status PrintMenu(hotel *H)
{
    printf("\n\n                 ┏━━━━━━━━━━━━━━┓\n");
    printf("                 ┃                            ┃\n");
    printf("                 ┃   旅馆床位分配回收系统     ┃\n");
    printf("                 ┃                            ┃\n");
    printf("                 ┣━━━━━━━━━━━━━━┫\n");
    printf("                 ┃                            ┃\n");
    printf("                 ┃    1.旅客入住              ┃\n");
    printf("                 ┃                            ┃\n");
    printf("                 ┃    2.旅客退房              ┃\n");
    printf("                 ┃                            ┃\n");
    printf("                 ┃    3.当前入住情况          ┃\n");
    printf("                 ┃                            ┃\n");
    printf("                 ┃    4.进入下一天            ┃\n");
    printf("                 ┃                            ┃\n");
    printf("                 ┃    0.退出程序              ┃\n");
    printf("                 ┃                            ┃\n");
    printf("                 ┣━━━┳━━━━━━━━━━┫\n");
    printf("                 ┃      ┃ 当前日期%5d-%2d-%2d┃\n",
            H->today.year, H->today.month, H->today.day);
    printf("                 ┗━━━┻━━━━━━━━━━┛\n");
    printf("                   请选择一项操作:");
    return OK;
}//显示菜单

//选择操作
Status Chose(hotel *H, int C)
{
    switch(C)
    {
        case 1: GuestArrive(H);
                return OK; //选择1旅客入住
        case 2: GuestLeave(H);
                return OK; //选择2旅客退房
        case 3: PrintEmptyBed(H);
                return OK; //选择3显示当前入住情况 
		case 4: DataPlus(H->today, &H->today);
                return OK; //选择4程序日期进入下一天
        case 0: return FALSE; //选择0退出程序
    }
    return OK;
}//选择操作

main()
{
    int i;
    hotel *hotel;
    Init(&hotel);
    while(1)
    {
        PrintMenu(hotel);
        scanf("%d",&i);
        while (i<0 || i>4)
        {
            printf("您输入选项超出范围,请重新输入:");
            scanf("%d",&i);
        }//while
        system("cls");
        if (!Chose(hotel, i)) break;
    }//while    
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -