停车场管理课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
停车场管理
一、课程设计题目内容
(1)问题描述:
设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等待,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。
基本要求:
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。
测试数据:
设n=2,输入数据为:
(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3,20),(‘A’,4,25),(‘A’,5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。其中:‘A’表示到达(Arrival);‘D’表示(Departure);‘E’表示输入结束(End)。
实现提示:
需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入停车场的时刻。
二、本人完成的工作
(1)定义车辆信息结构体,包括汽车的车牌号码、到达停车场时间、离开停车场时间;
(2)定义顺序堆栈的结构体,用于模拟停车场;
(3)定义链式队列的结构体,用于模拟车场外的停车场;
(4)定义堆栈和队列的初始化函数;
(5)设计汽车进入停车场、离开停车场、离开收费信息和汽车停靠情况查询等主要函数;
(6)主函数:设计停车场管理菜单,通过菜单选项,调用相关的函数来实现停车场汽车到达登记、汽车离开停车场、汽车停靠查询和退出程序的操作,完成模拟汽车停车场的整个过程。
三、所采用的数据结构
数据结构的定义:
typedef struct car //定义车辆信息的结构体
{
long CarNo; //车牌号
int Atime; //车到达时间
int Dtime; //车离开时间
}CarNode;
typedef struct node //定义模拟停车场的顺序堆栈
{
CarNode stack[Maxsize+1]; //栈底不存放元素,即停车场共有Masize个位置
int top; //栈顶指针
}StackCar;
typedef struct qnode //用队列结点定义,构造停车场外的单个等候车辆{
CarNode data; //数据域
struct qnode *next; //指针域
}QNode;
typedef struct Node //用队列定义,构造停车场外的等候便道
{
QNode *front; //队头指针
QNode *rear; //队尾指针
}LinkQueue;
四、所设计的函数
1)void StackInitiate(StackCar *s) //堆栈初始化
{
s->top=0; //栈顶置0
}
初始方法:初始化顺序栈,只需令栈顶的下标值置为0即可。
程序框图:
2)LinkQueue *Init_LinkQueue(void)//链队列的初始化
{
LinkQueue *Q;QNode *p;
p=(QNode *)malloc(sizeof(QNode)) ; /* 开辟头结点 */
p->next=NULL;
Q=(LinkQueue *)malloc(sizeof(LinkQueue));/* 开辟链队的指针结点 */ Q->front=Q->rear=p;
return(Q) ;
}
初始方法:开辟一个队列的头结点p,其next指针为空,再开辟链队的指针结点Q,用p来初始化链队结点的队头指针和队尾指针。初始化成功后,返回Q 程序框图:
3)void Arrival(StackCar *car1,LinkQueue *car2) //车辆进入停车场操作
{
CarNode p;
QNode *q;
printf("\n++++++++++++车辆到达登记表+++++++++++");
printf("\n请输入车牌号(整型,例如:1234):");
scanf("%d",&p.CarNo);//输入车牌号
if(car1->top 栈未满,进入停车场 { car1->top++; //栈顶指针+1 printf("\n【汽车顺利停放在车场的第%d位置】\n",car1->top); while(1) { printf("\n车辆几点钟到达(%d~23点):",n); scanf("%d",&p.Atime); if(p.Atime>23 || p.Atime printf("输入时间有误,请重新输入!"); else { n=p.Atime; printf("\n北京时间%d:00整\n",n); break; } } car1->stack[car1->top]=p; //将车停入停车场,停放在top位置 } else //停车场已停满车,即栈已满,则停靠在便道 { printf("\n停车场已满,请先在便道等候!有车位时进入车场!\n"); q=(QNode *)malloc(sizeof(QNode)); q->data=p; q->next=NULL; //形成新的结点,保存车辆信息 car2->rear->next=q; car2->rear=q; //新结点入队尾,即车辆进入便道等候} printf("+++++++++++++++++++++++++++++++++++++\n"); } 算法思想:当车进入车场时,登记车的车牌号,如果停车场有空位,将车停放在相应的空位,输出此时车停放的位置,记录到达时间;如果停车场没有空位,便将车开到便道等候。其过程相当于,当顺序栈未满时,进栈;当顺序栈已满时,无法入栈,便进入队列。 程序框图: