当前位置:嗨网首页>书籍在线阅读

05-模拟轮渡管理

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

3.1.3 模拟轮渡管理

问题描述

19.png 某汽车轮渡口,过江渡船每次能载10辆车过江。过江车辆分为客车类和货车类,上船有以下规定:同类车先到先上船,客车先于货车上船,且每上4辆客车,才允许上一辆货车;若等待客车不足4辆,则以货车代替,若无货车等待则允许客车都上船。设计一个算法模拟轮渡管理。

【分析】

(1)初始时,上船汽车数(count)、上船客车数(countbus)、上船货车数(counttruck)均为0。

(2)输入命令e或E表示有汽车来过江,可按客车、货车分别进入相应的队列排队。

(3)输入命令o或O表示渡船到渡口,可按排队顺序将汽车或客车上船。

① 若上船汽车数count<4,且客车队列非空,则将客车队列的队头汽车出队上船。同时,进行计数,即count和countbus增1。

② 若上船客车数countbus≥4或客车队列为空,且货车队列非空,则将货车队列的队头汽车出队上船。将countbus置为0,并进行计数,即count和counttruck增1。

③ 若货车队列为空且客车队列非空,则将客车队列的队头汽车出队上船。count和countbus增1,将counttruck置为0。

(4)输入命令q或Q表示退出程序。

第3章\实例3-03.c
/********************************************
*实例说明:模拟轮渡管理
*********************************************/
#include<stdio.h>
typedef int DataType;
#include "SeqQueue.h"
void FerryManage()
{
    SeqQueue bus,truck;/*bus表示客车队列,truck表示货车队列*/
    char ch;
    DataType n;        /*n为车号*/
    int tag;           /*tag是标志,tag=1表示客车,tag=2表示货车*/
    int count=0,countbus=0,counttruck=0;
    InitQueue(&bus);
    InitQueue(&truck);
    while(1)
    {
        fflush(stdin);
        printf("输入命令(e或E表示入队,o或O表示出队,q或Q表示退出):\n");
        scanf("%c",&ch);
        switch (ch)
        {
           case 'e':
           case 'E':
                printf("请输入车号(整数):");
                scanf("%d",&n);
                printf("是客车(1)还是货车(2):");
                scanf("%d",&tag);
                if (tag==1)
                   EnQueue(&bus,n);
                else
                   EnQueue(&truck,n);
                   break;
            case 'o':
            case 'O':
                while (count<10)
                {
                    if (count<4 &&!QueueEmpty(bus))/*客车出队*/
                    {
                        DeQueue(&bus,&n);
                        printf("上船的车号为:%d\n",n);
                        count++;
                        countbus++;
                    }
                    else if (!QueueEmpty(truck))    /*货车出队*/
                    {
                        countbus=0;
                        DeQueue(&truck,&n);
                        printf("上船的车号为:%d\n",n);
                        count++;
                        counttruck++;
                    }
                    else if (!QueueEmpty(bus))
                    {
                        counttruck=0;
                        DeQueue(&bus,&n);
                        printf("上船的车号为:%d\n",n);
                        count++;
                        countbus++;
                    }
                    else
                    {
                        printf("排队轮渡的车辆少于10辆.\n" );
                        return;
                    }
            }
            break;
        case 'q':
        case 'Q':
            break;
        }
        if (ch=='q' || ch=='Q')
            break;
    }
}
void main()
{
    FerryManage();
}

运行结果如图3.8所示。

98.png 99.png

图3.8 运行结果

【注意】

每输入一个客车或货车信息,按Enter键后,回车符就会被下一轮循环中的scanf函数自动接收。为了避免这种情况出现,在scanf函数前面加入fflush(stdin),以清除缓存中的字符,这样就不会出现以上情况了。这是大家在使用C语言中的scanf函数、getch函数、getchar函数过程中经常会遇到的问题,遇到这类问题可通过调用fflush函数解决。