C++课程设计——
停车场管理系统
姓
名: 汪 志 成
学
09102211
号:
专
业: 信息与计算科学
学
院: 理 学 院
指导老师: 丁 木 华
日
期: 2011 . 12 . 18
停车场管理系统——C++课程设计报告
概述
一、本课程设计意义
课程设计是实践性教学中的一个重要环节,它以某一课程为基础,可以涉及和课程
相关的各个方面,是一门独立于课程之外的特殊课程。课程设计是让同学们对所学的课
程更全面的学习和应用,理解和掌握课程的相关知识。《数据结构》是一门重要的专业
基础课,是计算机理论和应用的核心基础课程。
数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择
和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。同时,在程序设计
方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
二、本课程设计任务及目的
停车场是一个可停放 n 辆汽车的狭长通道,且只有一个大门可供汽车进出。停车场
内已停了 n 辆汽车,后来的汽车只能在门外的便道上等候,一旦有车开走,排在通道上
的第一辆车即可开入;当停车场内每辆车要离开时,在它之后进入的车辆必须先退出停
车场为其让路,待该辆车开出大门,其他车辆再按原次序进入停车场。为停车场编写按
上述要求进行管理的模拟程序。
系统分析
一、问题描述
设停车场是一个可停放 n 辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车
在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在南端,最先到达的
第一辆车停放在停车场的最北端),若停车场内已停了 n 辆汽车,则后来的汽车只能在
门外的便道上等候,一旦有车开走,排在便道上的第一辆车即可开入;当停车场内每辆
车要离开时,在它之后进入的车辆必须先退出停车场为其让路,待该辆车开出大门,其
1
他车辆再按原次序进入停车场,每辆停放在停车场的车在它离开停车场时必须按它停留
在停车场内的时间长短交纳停车费。试为停车场编写按上述要求进行管理的模拟程序。
二、基本要求
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行
模拟管理。每一组输入数据包括三个数据项:汽车到达或离去信息,汽车牌照号码以及
到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:在停车场内停留的时
间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结
构实现。
三、测试数据
设 n=2,输入数据('A',1,5),('A',2,15),('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)。
四、实现思路
需要另设一个栈,临时停放为离去的汽车让路而从停车场退出来的汽车,也用顺序
存储结构实现。栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入
停车场的时刻。
概要设计与详细设计
一、栈的抽象数据类型
ADT stack{
数据对象:D={aiai∈charset,I=1,2,……,n,n=0}
数据关系:R1={ai-1,aiai-1,ai∈D,I=2……,n}
基本操作:
Initstack(&S)
操作结果:构造一个空栈 S。
DestroyStack(&S)
初始条件:栈 S 已经存在。
操作结果:操作结果:销毁栈 S。
ClaerStack(&S)
初始条件:栈 S 已经存在。
2
操作结果:将 S 清空为空栈。
StackLength(&S)
初始条件:栈 S 已经存在。
操作结果:返回栈 S 的长度。
StackEmpty(&S)
初始条件:栈 S 已经存在。
操作结果:若 S 为空栈,则返回 TURE,否则返回 FALSE。
GetTop(S,&e)
初始条件:栈 S 已经存在。
操作结果:若栈 S 不空,则以 e 返回栈顶元素。
Push(&S,e)
初始条件:栈 S 已经存在。
操作结果:在栈 S 的栈顶插入新的栈顶元素 e。
Pop(&S,&e)
初始条件:栈 S 已经存在。
操作结果:删除 S 的栈顶元素,并以 e 返回其值。
StackTraverse(S,visit())
初始条件:栈 S 已经存在。
操作结果:从栈底到栈顶依次对 S 中的每个元素调用函数 visit( )。
}ADT stack
二、链式队列的抽象数据类型
typedef struct Qnode{
data;
next;
QelemType
Struct Qnode
}Qnode,QueuePtr;
typedef struct{
QueuePtr
QueuePtr
ADT Queue{
数据对象:D={aiai∈ElemSet,i=1,2,……,n,n=0}
数据关系:R1={ai-1,aiai-1,ai∈D,i=2,……,n}
front; 队头指针
rear; 队尾指针
约定中端为队列头,后端为队列尾。
基本操作:
InitQueue(&Q)
操作结果:构造一个空队列 Q。
DestroyQueue(&Q)
初始条件:队列 Q 已经存在。
3
操作结果:队列 Q 被销毁,不再存在。
ClearQueue(&Q)
初始条件:队列 Q 已经存在。
操作结果:将 Q 清为空队列。
QueueEmpty(Q)
初始条件:队列 Q 已经存在。
操作结果:若 Q 为空队列,则返回 TRUE,否则 FALSE。
QueueLength(Q)
初始条件:队列 Q 已经存在。
操作结果:返回 Q 的元素个数,即队列的长度。
GetHead(Q,&e)
初始条件:Q 为非空队列。
操作结果:用 e 返回的 e 队头元素。
EnQueue(&Q,e)
初始条件:队列 Q 已经存在。
操作结果:插入元素 e 为 Q 的新的队尾元素。
DeQueue(&Q,&e)
初始条件:Q 为非空队列。
操作结果:删除 Q 的队头元素,并用 e 返回其值。
QueueTraverse(Q,visit())
初始条件:Q 已经存在且非空。
操作结果:从队头到队尾,依次对 Q 的每个数据元素调用函数 visit()。一旦 visit()失败,
则操作失败。
}ADT Queue
三、模块划分
1、主程序模块
main(){
初始化
while(重复条件){
接受命令;
switch(调用条件)
{
Case 调用条件’A’ 到达处理;break;
Case 调用条件’D’ 离开处理;break;
Case 调用条件’E’ 退出处理;
}
}
4
}
2、2 个栈模块---实现栈抽象数据类型
3、队列模块---实现队列抽象数据类型
四、详细设计
以栈模拟停车场,以队列模拟停车场外的便道,按照从终端读入的输入数据序列进行
模拟管理。另设一个栈,临时停放为离去的汽车让路而从停车场退出来的汽车。栈以顺
序存储结构实现,队列以链表存储结构实现。
停车场栈 park 模拟停车场。
临时栈 Aux-park 模拟倒车场。
便道队列 Road 模拟停车场外便道。
程序运行后,先设定停车时间单位和计费单位,再设定停车场容量(测试数据设定停车
场容量 n=2)。继续输入车辆数据:车辆属性(到达’A’或离开’D’)、车牌号、时间(到
达时间或离开时间)。程序根据输入数据中的“车辆属性”进入该属性程序模块。输出
车辆停放位置或离开时的收据。然后循环,继续输入车辆数据。当输入车辆数据为’E’时,
程序自动退出。
五、模块调用关系
主程序模块
栈模块 1
队列模块
栈模块 2
图 3-1 模块调用关系
栈模块 1----模拟停车场
栈模块 2----模拟倒车场
队列模块----模拟车道
调试过程中的问题及系统测试情况
1、编程过程中忽略头文件的作用,导致漏掉了一个头文件,以致产生下列
错误提示。
错误提示:error C2065: 'malloc' : undeclared identifier
5
error C2065: 'exit' : undeclared identifier
执行 cl.exe 时出错.
在代码中加上#define〈stdlib.h〉,解决此问题。
2、没有良好的编程习惯,没有合适的缩进及换行,给程序的调试带来了比较多的困
难。
3、编程过程中比较粗心,一些程序结束的分号和成对出现的大括号忘记写。
总结与体会
通过这次 C++课程设计,我认识到从课本上学到的知识是远远不够的。本次设计使
我深入的了解了栈与队列的建立、插入、删除和在实际问题下灵活运用它们,另一方面
使我对栈和队列的抽象数据类型有了进一步的认识。
虽然经过努力终于把该系统完成,可是该系统还是不完善,程序中的一些算法还不
是很清楚,只不过把简单的功能实现了出来,这些缺憾归根结底都是因为我的 C++语言
和数据结构的水平还不是很高 ,还需要经过不懈的努力才能做出比较完善的系统。这次
课程设计让我明白要真正的掌握一门编程语言需要的不仅仅是课本上的东西,还要在实
际的编程过程中慢慢的掌握其中的奥妙。同时我明白了,要成为一名优秀的编程人员必
须具备坚实的编程语言基础、熟练的调试程序的技能,耐心也很重要、同时细心也是不
可缺少的。所以为了自己的梦想,在以后的学习过程中,我要不断的充实自己,努力的
学习。通过本次课程设计让我熟悉了软件开发的基本过程;初步掌握了软件开发过程的
问题分析、系统设计、程序编码、测试等阶段的基本任务和技能方法;培养了我的算法
设计和算法分析的能力;提高了综合运用所学的理论知识和方法以及独立分析和解决问
题的能力。
虽然课程设计的过程是艰辛的,但是当看着自己的程序能够运行的瞬间,无限的满
足感会让自己感到从未有过的兴奋。
参考文献
[1] 郑莉 李宁编著:《C++教程》人民邮电出版社 2010 版
[2] 耿国华主编:《数据结构》(C 语言描述)高等教育出版社 2005 版
6
[3] 金远平著:《数据结构》(C++描述)清华大学出版社 2005 版
附录一:源程序代码
#include//定义输入/输出函数
#include//数据流输入/输出
#include//字符串处理
#include//定义数学函数
#include //定义杂项函数及内存分配函数
#define size 2
//模拟停车场的堆栈的性质
typedef struct zanlind{
//停车场位置数
int number;
int ar_time;
}zanInode;
typedef struct{
//汽车车号
//汽车到达时间
//停车场的堆栈底
//停车场的堆栈顶
zanInode
zanInode
int stacksize_curren;
*base;
*top;
}stackhead;
//堆栈的基本操作;
void initstack(stackhead &L)
{
//构造一个空栈
L.base=(zanInode*)malloc(size*sizeof(zanlind));
if(!L.base)exit(0);
L.top=L.base;
L.stacksize_curren=0;
//存储分配失败
}
void push(stackhead &L,zanInode e) //把元素 e 压入 L 栈成为新的栈顶元素
{
*L.top++=e;
L.stacksize_curren++;
}
7