05-模拟轮渡管理
3.1.3 模拟轮渡管理
问题描述
某汽车轮渡口,过江渡船每次能载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所示。

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