数据结构课程设计停车场管理系统.docx
《数据结构课程设计停车场管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计停车场管理系统.docx(22页珍藏版)》请在冰豆网上搜索。
数据结构课程设计停车场管理系统
学号:
0121210340426
课程设计
课程名称
数据结构
设计题目
停车场管理
学院/专业
计算机学院计算机
班级
计科1204班
姓名
何铮杰
指导教师
杜海涛
日期
2014年6月12日
实践教学任务书
学生姓名:
何铮杰专业班级:
1204班
指导教师:
杜海涛工作单位:
计算机科学系
题目:
停车场管理
初始条件:
设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。
试为停车场编制按上述要求进行管理的模拟程序。
测试用例自己设计;
要求完成的主要任务:
(包括实践教学工作量及其技术要求,以及说明书撰写等具体要求)
实践教学报告按学校规定格式用A4纸打印(书写),并应包含如下内容:
1、问题描述
简述题目要解决的问题是什么。
2、设计
存储结构设计、主要算法设计(用类C语言或用框图描述)、测试用例设计;
3、调试报告
调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。
4、经验和体会(包括对算法改进的设想)
5、附源程序清单和运行结果。
源程序要加注释。
如果题目规定了测试数据,则运行结果要包含这些测试数据和运行输出,
6、设计报告、程序不得相互抄袭和拷贝;若有雷同,则所有雷同者成绩均为0分。
时间安排:
1、第17周完成。
2、6月13日14:
00到计算中心检查程序、交实践教学报告、源程序(CD盘)。
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
正文
一、问题描述
设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。
试为停车场编制按上述要求进行管理的模拟程序。
二、课程设计内容
1.设计思路
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。
每一组输入数据包括两个数据项:
汽车牌照号码以及到达或离去的时刻。
对每一组输入数据进行操作后的输出信息为:
进入的车辆输出停车的位置,离开的车辆输出在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。
当车辆要进入停车场时,检查停车场是否已满,如果未满则车辆进入停车场;如果停车场已满,则车辆进入便道等候。
当车辆要求出栈时,先让在它之后进入停车场的车辆退出停车场为它让路,再让该车退出停车场,让路的所有车辆再按其原来进入停车场的次序进入停车场。
之后,再检查在便道上是否有车等候,有车则让最先等待的那辆车进入停车场。
栈,队列都以顺序结构实现。
2.存储结构设计
Car类
classCar
{
Public:
voidcreateArriveCar();//构建进入停车场车辆信息
voidcreateLeaveCar();//构建离开停车场车辆信息
voidprint();//打印车辆信息
stringcarNumber;//车牌号
inthour;
intminute;//到达的时间
boolstatus=false;//true代表进入停车场,false代表处停车场
};
栈
template
classStack
{
public:
Stack();//构造空栈
~Stack(){delete[]stack;}
boolisEmpty()//判断栈是否为空
boolisFull()//判断栈是否满
TgetTop()//返回栈顶元素
Stack&push(T&x)//入栈
Stack&pop(T&x)//出栈
private:
inttop;//栈顶
intmaxTop;//最大栈顶值
T*stack;//动态数组存储元素
};
循环队列:
template
classQueue//循环队列
{
public:
Queue()//构造空队列
~Queue(){delete[]queue;}
boolisEmpty()//判断队列是否为空
boolisFull()//判断队列是否满
Tfirst()//返回对首元素
Tlast()//返回队尾元素
Queue&push(T&x)//入队
Queue&pop(T&x)//出队
private:
intfront;//队首
intrear;//队尾
intmaxSize;//队列大小
T*queue;
};
3.算法设计(程序框图)
(1)主流程:
(2)进入停车场
(3)离开停车场
4.测试用例设计
假定停车场和通道的容量都为5,现有车牌分别为he123,he124,he125,he126,he128,he129,依次进入停车场,然后车牌为he125的车离开停车场。
三、调试报告
1.主程序switch语句,忘记在每个case里加上break,导致无限循环输出。
2.构建Car类,原本有一个构造函数,但由于在栈中用到了这个,每次构建栈,先要构建一个Car的数组,就会调用Car类的构造函数进行输入,与目的不符,于是删去构造函数,改为createArriveCar()和createLeaveCar()。
3.对于列表输出,当有车位没有车时,不会输出车的信息,一开始会输出一串乱码,于是加上一个status标志,初始为false,一旦入栈,则改为true。
4.当位于栈中的车辆要出栈,其之前的元素要先出栈,用一个临时的栈temporaryStack来保存出栈的车辆,等需要出栈的车辆出栈后,再将这个临时栈中的元素依次入栈。
四、经验和体会
通过这次数据结构课程设计,我认识到从课本上学到的知识是远远不够的。
本次设
计使我深入的了解了栈与队列的建立、插入、删除和在实际问题下灵活运用它们,另一方面使我对栈和队列的抽象数据类型有了进一步的认识。
虽然经过努力终于把该系统完成,可是该系统还是不完善,程序中的一些算法还不是很清楚,只不过把简单的功能实现了出来,这些缺憾归根结底都是因为我的C++语言和数据结构的水平还不是很高 ,还需要经过不懈的努力才能做出比较完善的系统。
这次课程设计让我明白要真正的掌握一门编程语言需要的不仅仅是课本上的东西,还要在实际的编程过程中慢慢的掌握其中的奥妙。
同时我明白了,要成为一名优秀的编程人员所要具备的各种条件,坚实的编程语言基础、熟练的调试程序的技能、重要的是要有耐心、同时细心也是不可缺少的。
所以为了自己的梦想,在以后的学习过程中,我要不断的充实自己,努力的学习。
通过这次课程设计,对数据结构的特点以及存储表示方式的认识有了明显的提高,同时还对在具体应用中选择合适的数据结构和存储结构的能力有了进一步的提升。
熟悉了软件开发的基本过程;初步掌握了软件开发过程的问题分析、系统设计、程序编码、测试等阶段的基本任务和技能方法;培养了我的算法设计和算法分析的能力;提高了综合运用所学的理论知识和方法以及独立分析和解决问题的能力。
通过课程设计,我明白,数据结构就是要培养我们的数据抽象能力,它用规范的数学语言来描述数据结构的定义,以突出这门课程的特性。
总之,数据结构是计算机专业的一门不可缺少的专业课。
虽然课程设计的过程是艰辛的,但是当看着自己的程序能够运行的瞬间,无限的满足感会让自己感到从未有过的兴奋
五、源程序
#include
usingnamespacestd;
constintMAX_PARKING_SIZE=5;
constintMAX_PASS_SIZE=5;
classCar
{
public:
/*Car()
{
intx;
cout<<"请输入车牌号:
";
cin>>carNumber;
cout<<"请选择离开还是到达(1为到达,0为离开):
";
cin>>x;
status=x;
cout<<"请输入到达或离开的时间:
";
cin>>hour>>minute;
}*/
voidcreateArriveCar()
{
intx;
cout<<"请输入车牌号:
";
cin>>carNumber;
status=true;
cout<<"请输入到达的时间:
";
cin>>hour>>minute;
}
voidcreateLeaveCar()
{
cout<<"请输入车牌号:
";
cin>>carNumber;
status=false;
cout<<"请输入离开的时间:
";
cin>>hour>>minute;
}
voidprint()
{
if(status)
cout<<"车牌号:
"<"<elsecout<<"空"<}
stringcarNumber;//车牌号
inthour;
intminute;//到达的时间
boolstatus=false;//true代表进入停车场,false代表处停车场
};
template
classStack
{
public:
Stack()
{//构造空栈
maxTop=MAX_PARKING_SIZE-1;
stack=newT[MAX_PARKING_SIZE];
top=-1;
}
~Stack(){delete[]stack;}
boolisEmpty()
{//判断栈是否为空
returntop==-1;
}
boolisFull()
{//判断栈是否满
returntop==maxTop;
}
TgetTop()
{//返回栈顶元素
if(isEmpty())cout<<"栈为空"<elsereturnstack[top];
}
Stack&push(T&x)
{//入栈
if(isFull())cout<<"栈已满"<else
{
top++;
stack[top]=x;
}
return*this;
}
Stack&pop(T&x)
{//出栈
if(isEmpty())cout<<"栈为空"<else
{
x=stack[top];
top--;
}
return*this;
}
//private:
inttop;//栈顶
intmaxTop;//最大栈顶值
T*stack;//动态数组存储元素
};
template
classQueue//循环队列
{
public:
Queue()
{//构造空队列
maxSize=MAX_PASS_SIZE+1;
queue=newT[maxSize];
front=rear=0;
}
~Queue(){delete[]queue;}
boolisEmpty()
{//判断队列是否为空
returnfront==rear;
}
boolisFull()
{//判断队列是否满
if((rear+1)%maxSize==front)returntrue;
elsereturnfalse;
}
Tfirst()
{//返回对首元素
if(isEmpty())cout<<"队列为空"<elsereturnqueue[(front+1)%maxSize];
}
Tlast()
{//返回队尾元素
if(isEmpty())cout<<"队列为空"<elsereturnqueue[rear];
}
Queue&push(T&x)
{//入队
if(isFull())cout<<"队列已满"<else
{
rear=(rear+1)%maxSize;
queue[rear]=x;
}return*this;
}
Queue&pop(T&x)
{//出队
if(isEmpty())cout<<"队列为空"<else
{
front=(front+1)%maxSize;
x=queue[front];
}return*this;
}
//private:
intfront;//队首
intrear;//队尾
intmaxSize;//队列大小
T*queue;
};
classParking
{
public:
voidcarArrive(Carcar)
{
if(!
parkingStack.isFull())
{
parkingStack.push(car);
cout<<"车辆进入停车场,在停车场的位置为:
"<}
elseif(parkingQueue.isFull())
cout<<"停车场和通道中都没有位置"<else
{
parkingQueue.push(car);
cout<<"停车场已满,车辆进入等待通道,在通道中的位置为:
"<}
}
voidcarLeave(Carcar)
{
CarleaveCar;
CartemporaryCar;
inttime;//以分钟记的停留时间
doublemoney;//收费
StacktemporaryStack;
while(car.carNumber!
=parkingStack.getTop().carNumber)
{
parkingStack.pop(leaveCar);
temporaryStack.push(leaveCar);
if(parkingStack.isEmpty())
{
cout<<"车站中没有这辆车"<break;
}
}
if(!
parkingStack.isEmpty())
{
parkingStack.pop(leaveCar);
time=(car.hour-leaveCar.hour)*60+(car.minute-leaveCar.minute);
money=time*1;
cout<<"离开的车辆在停车场里停留了"<