数据结构应用设计报告停车场系统模拟.docx
《数据结构应用设计报告停车场系统模拟.docx》由会员分享,可在线阅读,更多相关《数据结构应用设计报告停车场系统模拟.docx(14页珍藏版)》请在冰豆网上搜索。
![数据结构应用设计报告停车场系统模拟.docx](https://file1.bdocx.com/fileroot1/2022-11/27/084e058b-4d4e-4fa5-9ba5-d88586d27af3/084e058b-4d4e-4fa5-9ba5-d88586d27af31.gif)
数据结构应用设计报告停车场系统模拟
数据结构应用设计设计报告
题目名称:
停车场系统模拟
设计环境:
指导教师:
专业班级:
姓名:
学号:
联系电话:
电子邮件:
设计日期:
2009年12月12日至2009年12月28日
设计报告日期:
2009年 12月 29日
停车场系统模拟
摘要:
一个比较好的停车场管理系统可以给管理方带来极大便利,系统可以提供的一些关于停车场信息查询服务包括:
车辆进出信息,显示车场内停车信息,退出系统服务等。
主要设计一个栈模拟停车场,一个队列模拟便道,以实现停车场系统的功能。
关键词:
栈;队列;链式结构
1.题目
2.需求分析
2.1输入数据及判错………………………………………………
2.2输出的形式…………………………………………………………………
2.3程序功能………………………………………………………
2.4测试数据……………………………………………………………………
3.详细设计
3.1数据类型……………………………………………………………………
3.2基本操作……………………………………………………………………
3.3其他模块伪码算法…………………………………………………………
4.调试分析
5.测试结果和分析
5.1输入车场,便道基本息……………………………………………………
5.2选择服务功能……………………………………………………………………
5.3车入场信息……………………………………………………………………
5.4车出场…………………………………………………………
5.5车辆显示信息………………………………………………………………
5.6退出
6.案例总结18
1.题目
模拟校园导游系统。
以图中顶点表示校内各景点,存放景点名称、代号、间介等信息;以边表示路径,存放路径长度等相关信息,通过这种方法实现为来访的客人提供各种信息查询服务。
2.需求分析
本演示程序用C++编写,完成一个停车场程序编码
2.1输入的形式和输入值的范围:
将要提供的服务,停车场及便道车辆信息查询,车辆进出操作及收费,退出系统服务。
输入数据类型是字符串,用于输入车辆牌号;输入数据类型是整型;用于输入停车场及便道容量;输入数据类型是单精度,用于输入收费单价及车辆到达和离去时间。
2.2输出的形式:
在所有操作中都显示操作是否正确以及操作后显示用户想得到的内容,输入不正确时,进行报错并提醒继续正确输入操作提示。
选择服务操作后,进入相应的更进一步的操作;当输入车辆牌号及到达时间,得到相应的车辆在车场或便道的停放位置;当输入车牌号及离开时间,如果存在相应的车,输出此车的停车费用;当选择显示停车场状况,会输出所有停放车辆信息
2.3程序所能达到的功能:
完成进入四种服务功能:
车辆入场,车辆出场,车辆显示,退出系统服务。
2.4测试数据:
A.测试输入停车场,便道容量及相应的收费单价信息。
B.测试车辆入场信息输入。
输入Num,即字符串类型,车牌号.输入Cometime单精度型,到达时间。
显示车辆在车场或便道停放信息。
C.测试车出场信息输入。
输入Num,即字符串类型,车牌号.输入Leavetime单精度型,到达时间。
如果存在相应车辆,显示车辆应付费信息。
D.测试车辆显示信息输入。
直接输入相应的主菜单选择项相对应的M,就会显示车辆停放信息
E.测试输入非法数据时提示正确的输入操作。
对于程序中任意数据的错误输入,都要相应的处理,并且提示用户请输入正确数据。
F.测试退出系统功能。
输入4,退出系统
3.详细设计
实现概要设计中定义的所有的数据类型,对每个操作给出伪码算法。
对主程序和其他模块写出伪码算法。
3.1数据类型
//用类LinStack设计链式栈
classLinStack
{
private:
StackNode*top;//指向栈顶的指针
intsize;//数据元素个数
public:
LinStack(void);//01堆栈类的构造函数
~LinStack(void);//02堆栈类的析构函数
intStackSize(void)const;//03取元素个数
intStackEmpty(void)const;//04判断堆栈是否为空
voidPush(constT&item);//05入栈****(重点)
TPop(void);//06出栈****(重点)
TPeek(void);//07取栈顶元素
voidClearStack(void);//08清空堆栈
用类LinQueuee设计链式栈
private:
QueueNode*front;//指向队头结点
QueueNode*rear;//指向队尾结点
intsize;//元素个数
public:
LinQueue(void);//01队列类的构造函数
~LinQueue(void);//02析构函数
voidQinsert(constT&item);//03入队列****(重点)
TQDelete(void);//04出队列****(重点)
TQFront(void)const;//05取队头元素
intQueueEmpty(void)const//06判断队列是否为空
{
returnsize<=0;
};//注意这个有分号
voidClearQueue(void);//07清空队列****(重点)
intGetSize(void)const//08取队列元素个数
{
returnsize;
};
};
用结构体Car实现车辆信息
structCar
{
stringNum;
floatCometime;
floatLeavetime;
floatCometime1;
}
3.2基本操作
//车辆入场函数
voidparking(LinStack&s,LinQueue&q,Carb,intn,intj,float&max);{
{
charNum='1';
charM[100];
if(q.GetSize()>=j)
{
cout<cout<<"车场车位已满!
请等待!
"<}
else
{//
while(Num=='1'&&q.GetSize(){////
cout<<"请输入车牌号和到达时间"<cout<<"";
cin>>b.Num;
while
(1)
{
cin>>b.Cometime;
if(!
cin.good())
{
cout<<"输入错误!
输入数据不符合要求!
请重新输入入场时间!
"<<"";
cin.clear();
fflush(stdin);
continue;
}
break;
}
if(b.Num!
="##")////////
{
if(s.StackSize(){
if(s.StackEmpty()==0&&s.Peek().Cometime>b.Cometime)cout<<"车到达时间输入有误!
(时间要小于之前车辆到达的时间)"<else
{
b.Cometime1=b.Cometime;
max=b.Cometime;
s.Push(b);
cout<<"车牌为";
cout<cout<}
}
else
{
if((!
q.QueueEmpty()&&q.QFront().Cometime>b.Cometime)||b.Cometime(时间要小于之前车辆到达的时间)"<elseif(q.GetSize(){
max=b.Cometime;
b.Cometime1=b.Cometime;
q.Qinsert(b);
cout<<"车牌为";
cout<cout<}
else
cout<<"停车场所有车位已满!
请稍候!
"<}
}
cout<<"****是否继续入场?
"<cout<<"1.继续入场"<<"2.返回主菜单"<cout<<"请输入你的操作编号:
"<<"";
cin>>M;
if(strcmp(M,"1")==0)Num='1';////////
elseif(strcmp(M,"2")==0)Num='2';
elseNum='0';
if(Num=='0')
{
cout<<"没有此选项!
退出此操作!
";
cout<}
}////
}//
}
//车辆出场函数
voidLeaveing(LinStack&s1,LinQueue&q,Carb,Car&a,float&k,float&k1,float&max)
CarT,c;
charNum='1';
charM[100];
LinStacks2;
while(Num=='1'&&b.Leavetime>=-1)
{//
floaty=0;
if(b.Leavetime>0)a.Leavetime=b.Leavetime;
cout<<"请输入车牌号和离开时间"<cout<<"";
cin>>b.Num;
while
(1)
{
cin>>b.Leavetime;
if(!
cin.good())
{
cout<<"输入错误!
输入数据不符合要求!
请重新输入出场时间!
"<<"";
cin.clear();
fflush(stdin);
continue;
}
break;
}
if(s1.StackEmpty()==1||b.Leavetime<-1)
{
cout<<"输入有误!
停车场无此车!
"<if(b.Leavetime>=-1)b.Leavetime=a.Leavetime;//
(1)
}
elseif((!
q.QueueEmpty()&&b.Leavetime{
cout<<"车离开时间输入有误!
不能小于所有已经入场和在便道车的到达时间!
"<(2)
if(b.Leavetime>=-1)b.Leavetime=a.Leavetime;
}
elseif(a.Leavetime!
=-1&&b.Leavetime{
cout<<"车离开时间输入有误!
不能小于所有已经离开的车的离开时间!
"<if(b.Leavetime>=-1)b.Leavetime=a.Leavetime;
}
else
{
while(s1.StackEmpty()==0&&b.Num!
=s1.Peek().Num)////////////////
{
T=s1.Pop();//查找车
s2.Push(T);
}
if(s1.StackEmpty()==1)
{
cout<<"输入有误!
停车场无此车!
4"<while(s2.StackEmpty()==0)
{
s1.Push(s2.Pop());
}
if(b.Leavetime>=-1)b.Leavetime=a.Leavetime;
}
else
{
T=s1.Pop();
y=(b.Leavetime-T.Cometime)*k+(T.Cometime-T.Cometime1)*k1;
cout<<"车牌为";
cout<cout<while(s2.StackEmpty()==0)
{
s1.Push(s2.Pop());
}
if(!
q.QueueEmpty())/////////////////////
{
CarT1;
T1=q.QDelete();
T1.Cometime=b.Leavetime;
max=b.Leavetime;//
s1.Push(T1);
}
}
}
cout<<"****是否继续出场?
"<cout<<"1.继续出场"<<"2.返回主菜单"<cout<<"请输入你的操作编号:
"<<"";
cin>>M;
if(strcmp(M,"1")==0)Num='1';////////
elseif(strcmp(M,"2")==0)Num='2';
elseNum='0';
if(Num=='0')
{
cout<<"没有此选项!
退出此操作!
";
cout<}
}//
}
//车辆显示函数
voidDisplaying(LinStack&s1,LinQueue&q1)
{
intk=q1.GetSize();
LinQueueq2;
LinStacks2;
if(s1.StackEmpty()==1)cout<<"停车场没有车辆!
"<else
{
while(s1.StackEmpty()==0)
{
s2.Push(s1.Pop());
}
while(s2.StackEmpty()==0)
{
s1.Push(s2.Pop());
cout<<"车牌为";
cout<cout<}
while(!
q1.QueueEmpty())
{
cout<<"车牌为";
cout<cout<q2.Qinsert(q1.QDelete());
}
while(!
q2.QueueEmpty())
{
q1.Qinsert(q2.QDelete());
}
}
}
3.3其他模块伪码算法
1.主函数中,使界面友好伪代码:
while(m!
='4')
{
cout<cout<<"*****************************"<cout<<"1车辆进场操作"<cout<<"2车辆出场操作"<cout<<"3显示停车情况操作"<cout<<"4退出操作"<cout<<"****************************"<cout<<"请输入选择.M"<<"";
cin>>M;
if(strcmp(M,"1")==0)m='1';////////
elseif(strcmp(M,"2")==0)m='2';
elseif(strcmp(M,"3")==0)m='3';
elseif(strcmp(M,"4")==0)m='4';
elsem='0';
switch(m)
{
case'1':
{cout<<"车入场项:
"<case'2':
{cout<<"车出场项:
"<case'3':
{cout<<"显示停车情况:
"<case'4':
break;
default:
cout<<"没有此选项!
"<break;
}
}
2.输入错误数据类型识别判断关键示范代码
While
(1)
cin>>k;
if(!
cin.good())
{
cout<<"输入错误!
输入数据不符合要求!
"<<"";
cin.clear();
fflush(stdin);
continue;
}
break;
4.调试分析
开始调试时,比如整形单精度型,能用各种数据类型输入,而不会使程序崩溃,同时给出错误提醒。
其他数据输入时也有相同的判别。
但在输入整形数据n,j时,设计中所使用的错误判别代码并不能判别把单精度当作整型输入判错,所以想到这时在错误判别代码后,加上强制类型转换代码,这样就巧妙解决了那个问题。
5.测试结果和分析
5.1输入车场,便道容量信息及各自收费单价信息:
输入四个数据并被输入数据判别代码通过后,进入主菜单选择操作
5.2选择服务功能:
输入1时,在switch中比较匹配后,进入车辆进场操作
输入2时,在switch中比较匹配后,进入车辆出场操作
输入3时,在switch中比较匹配后,进入车辆显示操作
输入4时,在switch中比较匹配后,进入退出系统操作
输入其他数据时,提示没有此操作
5.3车辆入场及信息显示:
输入正确的数据类型后,输出相应的车在车场或便道停放的基本信息,并返回到选择是否继续入场提示服务操作;如果输入的选择非法或没有此选项,会推出此操作项,返回主菜单
5.4车辆出场及信息显示:
输入正确的数据类型后,如果找到相应的车,会输出相应的车需要的费用信息,否则输出没有此车;并返回到选择是否继续出场提示服务操作;如果输入的选择非法或没有此选项,会推出此操作项,返回主菜单
5.5显示车辆停放情况
在主菜单选择时,如果输入‘3’,会输出所有车辆在车场或便道的停放信息
5.6退出程序
在主菜单选择服务时,输入4,在switch中比较匹配后,退出该系统。
6.案例总结
主要通过设计一个栈模拟停车场,一个队列模拟便道,以实现停车场系统的基本功能。
通过栈的先进后出特点模拟停车场,通过队列的先进先出模拟便道,巧妙实现的车的入场,出场及显示功能。
此停车场模拟系统把停车场主要功能基本实现了,可以实现四种服务功能:
车入场选择,车出场选择,显示选择,退出系统服务,基本可以满足必要的的需求,但是还有很多方面可以改进,增加更多的功能。
比如车辆的型号不同单价费用不同,车场可以有捷径问题,最重要的是由于以前做的案例不太重视考虑界面友好问题,所以在这块可以增加更多的一些改变界面的功能,使界面变得比较友好。