第2章 停车场管理问 2.6.3队列模块
实现队列抽象数据类型
数据对象:D={aiai∈ElemSet,i=1,2,??,n,n=0}
数据关系:R1={ai-1,aiai-1,ai∈D,i=2,??,n}约定中端为队列头,后端为队列尾。
2.6.4模块调用关系
主程序模块
栈模块1
队列模块
栈模块2
图2-2 模块调用关系
栈模块1----模拟停车场 栈模块2----模拟倒车场 队列模块----模拟车道
2.7详细设计与源程序
2.7.1详细设计
以栈模拟停车场,以队列模拟停车场外的便道,按照从终端读入的输入数据序
- 17 -
经济管理学院本科课程设计论文 列进行模拟管理。另设一个栈,临时停放为离去的汽车让路而从停车场退出来的汽车。栈以顺序存储结构实现,队列以链表存储结构实现。
停车场栈park模拟停车场。 临时栈Aux-park模拟倒车场。 便道队列Road模拟停车场外便道。
程序运行后,先设定停车时间单位和计费单位,再设定停车场容量(测试数据设定停车场容量n=2)。继续输入车辆数据:车辆属性(到达’A’或离开’D’)、车牌号、时间(到达时间或离开时间)。程序根据输入数据中的“车辆属性”进入该属性程序模块。输出车辆停放位置或离开时的收据。然后循环,继续输入车辆数据。当输入车辆数据为’E’时,程序自动退出。
2.7.2部分源程序
停车场问题管理程序代码如下:
#include
#include
#include
#include
int ar_time; //汽车到达时间 }zanInode;
typedef struct{
zanInode *base; //停车场的堆栈底 zanInode *top; //停车场的堆栈顶
int stacksize_curren; }stackhead;
//堆栈的基本操作;
void initstack(stackhead &L) //构造一个空栈 {
L.base=(zanInode*)malloc(size*sizeof(zanlind)); if(!L.base)exit(0); //存储分配失败 L.top=L.base;
- 18 -
第2章 停车场管理问 L.stacksize_curren=0; }
void push(stackhead &L,zanInode e) //把元素e压入L栈成为新的栈顶元素
{
*L.top++=e;
L.stacksize_curren++;
}
void pop(stackhead &L,zanInode &e) //把元素e弹出L栈 {
if(L.top==L.base) {
cout<<\停车场为空 !!\ return; }
e=*(--L.top);
L.stacksize_curren--; }
//模拟便道的队列的性质
typedef struct duilie{ int number; //汽车车号
int ar_time; //汽车到达时间 struct duilie *next; }*queueptr;
Typedef struct{
queueptr front; //便道的队列的队头 queueptr rear; //便道的队列的队尾 int length; }linkqueue;
//队列的基本操作
void initqueue(linkqueue &q) //构造一个空队列 {
- 19 -
经济管理学院本科课程设计论文 2.8调试过程中的问题及系统测试情况
2.8.1出现的问题
(1)编程过程中忽略头文件的作用,导致漏掉了一个头文件
错误提示:error C2065: 'malloc' : undeclared identifier error C2065: 'exit' : undeclared identifier 执行 cl.exe 时出错.
在代码中加上#define〈stdlib.h〉,解决此问题。
(2)没有良好的编程习惯,没有合适的缩进及换行,给程序的调试带来了比较多的困难。
(3)编程过程中比较粗心,一些程序结束的分号和成对出现的大括号忘记写。
2.8.2运行过程
图2-3 这是停车场系统的登录界面。
- 20 -
第2章 停车场管理问
图2-4 车辆到达登记信息,为了便于观察,车场内最多可停3辆车,
当停车场内已满时,只登记车牌号,然后进入便道上,即进入队列中。
- 21 -