停车场管理模拟程序的设计.docx
《停车场管理模拟程序的设计.docx》由会员分享,可在线阅读,更多相关《停车场管理模拟程序的设计.docx(43页珍藏版)》请在冰豆网上搜索。
停车场管理模拟程序的设计
重庆科技学院
课程设计报告
院(系):
电气与信息工程学院_专业班级:
物联网一班
学生姓名:
明航学号:
2013441495
设计地点(单位)_____计算机基础自主学习中心___
设计题目:
_____停车场管理模拟程序的设计___
完成日期:
2014年7月3日
指导教师评语:
_______________________________________
____________________________________________________________________________________________________________________________________________________________________________________________________________________
成绩(五级记分制):
________________
指导教师(签字):
________________
重庆科技学院
课程设计任务书
设计题目:
停车场管理模拟程序的设计
学生姓名
明航
课程名称
数据结构课程设计
专业班级
物联网2013级
地点
计算机基础自主学习中心
起止时间
2014.6.23-2014.7.4
设计内容及要求
假设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆车,那么后来的车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开时必须按它停留的时间长短交纳费用(在便道上停车不收费)。
试为停车场编制按上述要求进行管理的模拟程序。
要求:
以栈模拟停车场,以队列模拟便道。
每一组输入数据包括三个数据项:
汽车“到达”或“离去”信息、汽车牌照号码、到达或离去的时刻。
对每一组输入数据进行操作后的输出信息为:
若是车辆到达,则输出汽车在停车场内或便道上的停车位置(停车位从北向南依次编号);若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用。
程序退出时,应将停车场的当前情况保存在磁盘上,以便下次运行程序时能恢复到上次退出时的状态。
设计
参数
测试数据要求:
停车费用单价为每小时3元,不足一小时部分四舍五入,例如4.6小时按5小时收费。
程序运行时,n由键盘输入(6≤n≤20)。
进度
要求
2014.6.23完成任务的讲解、并接受课程设计任务,选定课程设计的题目
2014.6.24了解任务的算法、并画出算法的程序流程图,对任务的关键技术进行验证、并确定解决办法
2014.6.25-2014.6.30程序设计及编码,上机调试
2014.7.1对程序进行调试,设计测试用例进行测试
2014.7.2整理课程设计的过程、并进行总结,完善程序功能
2014.7.3编写课程设计报告初稿
2014.7.3完善课程设计报告、并准备答辨
2014.7.4提交课程设计报告和程序,进行答辨
参考资料
1.严蔚敏吴伟民,数据结构,清华大学出版社,2007.3
2.程杰,大话数据结构,清华大学出版社,2011.6
3.(美)StephenPrata,CPrimerPlus中文版(第五版),人民邮电出版社,2005.2
其它
说明
1.本表应在每次实施前一周由负责教师填写二份,学院审批后交学院教务办备案,一份由负责教师留用。
2.若填写内容较多可另纸附后。
3.一题多名学生共用的,在设计内容、参数、要求等方面应有所区别。
系主任:
雷亮指导教师:
向毅裴仰军2014年6月10日
摘要
随着经济的快速发展,人们生活水平提高,车辆的使用开始增多,停车场大量增加,于是,就不得不招聘较多的人员记录车辆的进出时间以及车辆的相关信息,并进行费用的计算,在整个过程中,不仅浪费人力资源,各种信息的记录也容易出错,因此,我们设计了该程序。
这个程序应用了栈和队列(以栈模拟停车场,以队列模拟通道),包含了到达、离去、依次显示停车场内停放车辆、依次显示便道上停放车辆、读取5大功能。
并运用了TC制作了菜单。
在运行的过程中会自动保存信息到txt文档,再次启动程序时即可读取信息恢复之前的停车场以及通道的情况。
关键词:
栈队列停车场通道
1设计内容与要求
1.1设计内容
假设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆车,那么后来的车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开时必须按它停留的时间长短交纳费用(在便道上停车不收费)。
试为停车场编制按上述要求进行管理的模拟程序。
1.2基本设计要求
以栈模拟停车场,以队列模拟便道。
每一组输入数据包括三个数据项:
汽车“到达”或“离去”信息、汽车牌照号码、到达或离去的时刻。
对每一组输入数据进行操作后的输出信息为:
若是车辆到达,则输出汽车在停车场内或便道上的停车位置(停车位从北向南依次编号);若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用。
程序退出时,应将停车场的当前情况保存在磁盘上,以便下次运行程序时能恢复到上次退出时的状态。
2总体设计思路
2.1功能介绍
本程序一共有5大功能,分别为到达、离去、依次显示停车场内停放车辆、依次显示便道上停放车辆、读取。
各种功能以满足使用者的需求。
通过以上功能可以记录车辆的到达时间、离去时间用以计算车辆的停车费用,还可以查看停车场的停车状况。
2.2定义栈和队列的结构体
根据题目要求,停车场只有一个大门,因此可用一个栈来模拟。
当栈满后,继续来到的车辆只能停在便道上,根据便道停车的特点,可知这可以用一个队列来模拟,先排队的车辆先离开便道,进入停车场。
当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场。
因此在一个栈和一个队列的基础上,还需要用一个栈来保存为了让路离开停车场的车辆。
所以本题要用两个栈和一个队列。
停车场定义为一个堆栈Stack,堆栈里面包含了车辆信息Car*Data[100],车辆信息包含车牌号No和时间信息TimeArrive和TimeLeave。
便道定义为一个队列LinkQueue,队列里面包含类型为QueueNode的队列头Front和尾Rear。
2.3车辆进入停车场
在选择车辆进入停车场后,程序运行到相应函数,输入车辆的车牌号,以及进入的时间。
然后判断停车场是否满,如果不满则将之前存放车辆信息的堆栈Park的栈顶加一,再将该车辆信息存入,并将车辆停在停车场的位置输出到屏幕,并将车辆信息保存到当前目录Park.txt。
如果停车场已满,则将会把车辆停放到便道,并输出在屏幕,保存车辆信息到Wait.txt。
2.4车辆离开停车场
在停车场里的车辆想要离开时,程序运行到相应函数,输入将要离开的车牌号,输入现在的时间,则系统会自动提取车辆的相应信息,并且根据车辆进入停车场的信息和现在的时间计算出车辆应该缴纳的费用,显示到屏幕。
同时,将该车辆离开停车场的信息存入到Park.txt文件中,当再次读取时则删除相应的信息。
如果此时便道上有车,则将便道上最靠前的车辆驶入停车场,记录相应信息到Park.txt。
2.5从txt文件读入停车场信息
在程序重新被打开时,则需要读取停车场信息恢复之前的情况,首先判断每组数据的标记是y还是n,y代表该车辆在停车场内,n代表该车辆已离开。
如果某辆已离开的车辆在栈中间,则需要把它之后的车辆暂存在另外一个临时栈里,当该栈元素被删除后,再把临时栈里的元素重新依次压进栈。
2.6从txt文件读入通道信息
在程序重新被打开时,则需要读取通道信息恢复之前的情况,首先判断每组数据的标记是y还是n,y代表该车辆在通道内,n代表该车辆已离开通道进入停车场。
标记为y的车辆直接从队尾插入。
标记为n的车辆则需要从队头开始查找它的位置,找到了就修改连接关系删除它。
2.7查看停车场信息
如果查看停车场信息,则将会堆栈Part中的信息以及车辆在停车场的位置输出到屏幕,让人们了解到停车场的现况。
如果停车场里面没有车,则会输出“Pempty”。
另外还可以在Park.txt中查看停车场的进出情况。
2.8查看通道信息
如果查看便道信息,则将会把便道Wait中的信息输出到屏幕,方便人们了解便道中的相关信息。
如果便道里面没有车,则将会输出“Queuehasnocar”。
另外还可以在Wait.txt中查看通道的进出情况。
2.9总体程序框图
图1-1
3功能模块的具体设计
说明:
为了简化去掉了部分printf,fpirntf以及菜单的代码,具体代码见后面
3.1Arrival函数(处理进入车辆)
if(l->Top{
Push(l,p);//压栈
printf("No=%d,ArriveTime=%d:
%d,Parkin%d\n",p->No,p->Arrive.Hour,p->Arrive.Min,l->Top);
}
Else//栈满,进入队列中等待
{
InsertQueue(s,p);//入队
printf("Stackisfull.ParkinQueue\n");
}
If(l->Top进栈
Else
进队列
Car类型的P指针
图2-1
3.2Leave函数(处理离开的车辆)
if(l->Top!
=-1)//如果栈不为空,弹出栈顶元素保存在e中
e=Pop(l);
if(e->No==z->No)//如果e与自己输入的汽车z相同则离开
{
flag=0;
e->Leave.Hour=z->Leave.Hour;
e->Leave.Min=z->Leave.Min;
printf("WritetheoverDay:
");
scanf("%d",&Day);
if((e->Leave.Min)-(e->Arrive.Min)<=30)
Cost=(3*((e->Leave.Hour)-(e->Arrive.Hour)+(Day*24)));
else
Cost=(3*((e->Leave.Hour+1)-(e->Arrive.Hour)+(Day*24)));
break;
}
Push(k,e);//离开操作
while(k->Top!
=-1)//如果临时备用栈里有元素
{
e=Pop(k);
Push(l,e);//覆盖掉要删除的元素
}
if(flag==0)//在停车场中找到了要离开的车辆
{
if(s->count!
=0)//如果队列里有等待的车辆则依次进入
{
w=(Car*)malloc(sizeof(Car));
w=DeletQueue(s);//取出队列队头元素
w->Arrive.Hour=z->Leave.Hour;//将停车场离开车辆的时间复制给进入的时间
w->Arrive.Min=z->Leave.Min;
Push(l,w);//将队列取出的元素压栈
}
}
如果不为空
拷贝时间
如果不为空
通道(队列)
从队列中离开的车辆
从停车场离开的车辆
停车场(栈)
图2-2
3.3loadP函数(从文件中读取停车场信息)
while(fscanf(fp1,"%c\t",&i)!
=EOF)//读取停车场的信息
{
while(i=='y')//标记为y则在停车场但也可能后面离开
{
p=(Car*)malloc(sizeof(Car));
fscanf(fp1,"%d\t",&(p->No));//从文件中读取
fscanf(fp1,"%d:
%d\n",&(p->Arrive.Hour),&(p->Arrive.Min));
Push(l,p);//压栈
break;
}
while(i=='n')//标记为n则已离开执行删除
{
q=(Car*)malloc(sizeof(Car));
fscanf(fp1,"%d\t",&(q->No));//从文件中读取
fscanf(fp1,"%d:
%d\n",&(q->Leave.Hour),&(q->Leave.Min));
while(l->Top!
=-1)//栈不为空
{
if(l->Data[l->Top]->No==q->No)//如果找到要离开的车辆则删除
{
l->Data[l->Top]=NULL;
l->Top--;
break;
}
Else//没找到把当前元素拷贝到临时备用栈里
{
k->Top++;
k->Data[k->Top]=l->Data[l->Top];
l->Data[l->Top]=NULL;
l->Top--;
}
}
}
while(k->Top!
=-1)//如果临时备用栈不为空则依次压栈
{
l->Top++;
l->Data[l->Top]=k->Data[k->Top];
k->Data[k->Top]=NULL;
k->Top--;
}
}
不是栈顶元素则把栈顶元素放入备用栈
刚好是当前栈顶元素则删除
压栈
临时备用栈
停车场(栈)
读取元素的标记为n
读取元素的标记为y
图2-3
3.4loadwait函数(从文件提取通道信息)
while(fscanf(fp2,"%c\t",&j)!
=EOF)
{
while(j=='y')//标记为y则在通道内但后面可能离开
{
x=(Car*)malloc(sizeof(Car));
fscanf(fp2,"%d\n",&(x->No));
InsertQueue(s,x);//插入队列队尾
break;
}
while(j=='n')//标记为n则离开通道
{
p=s->Front->Next;//p指向第二个元素
y=(Car*)malloc(sizeof(Car));
fscanf(fp2,"%d\n",&(y->No));
while(s->Front!
=s->Rear)//如果队列不为空
{
if(p->Data->No==y->No)//找到了则执行删除
{
s->Front->Next=p->Next;
If(s->Rear==p)//如果队列只有一个元素
s->Rear=s->Front;
s->count--;
break;
}
else//没找到则指向下一个
p=p->Next;
}
}
没找到p指向下一个结点
找到了就执行删除
插入队列队尾
通道(队列)
读取元素的标记为n
读取元素的标记为y
图2-4
4功能模块的调试及测试
4.1主菜单
按下ALT_M进入第一个主菜单,其中有4个下拉子菜单,一个为读入停车场信息,第二个为读入通道信息,第三个处理来的车,第四个处理离开的车。
主菜单第二个是查看停车场信息,第三个是查看通道信息,第四个是退出程序。
图3-1主菜单
4.2读入停车场信息
这里在Park.txt里面存放了5组数据,之前设置的停车场大小也为5,所以停车场已满。
图3-2读入停车场信息
4.3读入通道信息
这里在Wait.txt里存放了4组数据,通道里有4辆车等待。
图3-3读入通道信息
4.4处理进入停车场的车
按照提示,输入车辆的车牌号和车辆进入停车场的时间,程序将会自动进行相应的运算,并保存数据到Park.txt。
如果停车场已将满了,则将会提示车辆停在通道,并保存数据到Wait.txt。
输入车牌号为30,输入到达时间为20:
30,停在了通道。
图3-4进入停车场
4.5处理离开停车场的车
因为之前读取时停车场已满,所以离开后,通道里排在第一的车会进入,另外在出停车场时,在他后面的车会让道。
然后计算花费。
图3-5离开停车场
图3-6离开停车场
4.6查看停车场信息
因为之前No为20的车已离开停车场,在通道排在第一的25号车进入了停车场,所以此时停车场信息为。
图3-7查看停车场
4.7查看通道信息
因为之前25号车已进入了停车场,所以现在只有以下几辆车在等待
图3-8查看通道
5总结
在选题目的时候,有难度较大的图,赫夫曼,也有简单的成绩管理系统,在纠结了很久后,选了这个课题,主要是栈和队列我们不熟,决定利用这次机会学习一下。
在构思这个程序时要注意如何利用栈和队列来模拟停车场和通道,停车场里的车辆只能从入口进入和出去这就类似于栈只能从栈定加入和剪掉数据一样,而队列模拟通道也是一样,车辆只能从一个方向进入,另一个方向则是通往停车场,所以在构思时把握住这一点将有利于程序的编写。
在编写程序的时候要注意当有车辆离开停车场的时候后面的车辆会前进一步,便道内的车也会开进停车场,这样需要重新编号。
这个程序的因为使用了TC做主菜单,做主菜单我也花费了大量时间,在调试的时候应先从VC开始,调好了再去TC调试,这样可以减少时间的浪费。
但同时在编写或者修改的时候带来很多的方便,这个程序的功能也十分强大除了模拟车辆进入和退出停车场二个功能外还附带了数据读取与保存,这使得用户在使用的时候更加方便快捷。
在学习上,通过本次课程设计使我更加熟练的使用栈和队列,数据结构也理解的更透彻。
程序也存在一定的缺陷,画面不够好看,在一些数据读取上没有确切的界限,这也导致了本程序的不完整性。
6致谢
感谢向毅老师和裴仰军老师的细心的指导,为我们讲解了栈和队列,讲了整个模拟的思路,虽然后面我们要求用TC做菜单我们都很厌烦,也不太会做,但老师们都有鼓励和支持,并细心指导,这才使我们不断完善。
另外感谢我的同学对我的讲解,很多知识点以前并不是很了解,通过他们的帮助,我掌握了一些不知晓的知识。
7参考资料
1.严蔚敏吴伟民,数据结构,清华大学出版社,2007.3
2.程杰,大话数据结构,清华大学出版社,2011.6
3.(美)StephenPrata,CPrimerPlus中文版(第五版),人民邮电出版社,2005.2
8附程序清单
#include
#include
#include
#include
#include
#include
#defineMAX5
#defineKey_UP0x4800
#defineKey_DOWN0x5000
#defineKey_RIGHT0x4b00
#defineKey_LEFT0x4d00
#defineKey_ALT_M0x3200
#defineKey_ALT_S0x1f00
#defineKey_ALT_T0x1400
#defineKey_ALT_E0x1200
#defineKey_ESC0x011b
#defineKey_ENTER0x1c0d
typedefstruct_Time{/*时间信息*/
intHour;
intMin;
}Time;
typedefstruct_CarInf{/*车辆信息*/
intNo;
TimeArrive;
TimeLeave;
}Car;
typedefstruct{/*停车场信息*/
Car*Data[100];
intTop;
}Stack;
typedefstruct_CarNode{/*队列结点*/
Car*Data;
struct_CarNode*Next;
}QueueNode;
typedefstruct{/*排队通道信息*/
QueueNode*Front;
QueueNode*Rear;
intcount;
}LinkQueue;
StackPark1,Park2;
LinkQueueWait;
voidbox(intstartx,intstarty,inthigh,intwidth);
voidInitiStack(Stack*l);/*初始化栈*/
voidInitiQueue(LinkQueue*s);/*初始化队列*/
voidPush(Stack*l,Car*x);/*压栈*/
Car*Pop(Stack*l);/*出栈*/
voidInsertQueue(LinkQueue*s,Car*x);/*进入通道*/
Car*DeletQueue(LinkQueue*s);/*离开通道*/
voidArrival(Stack*l,LinkQueue*s);/*处理进入车辆*/
voidLeave(Stack*l,Stack*k,LinkQueue*s);/*处理离开车辆*/
voidDispStack(Stack*l);/*显示停车场*/
voidDispQueue(LinkQueue*s);/*显示通道*/
voidloadP(Stack*l,Stack*k);/*读取停车场*/
voidloadwait(LinkQueue*s);/*读取通道*/
voidmain()
{
inti,key1,key2,x,y,l;
char*menu[]={"Manage","Stack","Tongdao","Exit"};/*主菜单各项*/
char*red[]={"M","S","T","E"};/*加上红色热键*/
char*f[]={"LoadP","Loadwait","Arrival","Leave"};/*Find项的子菜单*/
charbuf[80*1*2],buf1[5*10*2];/*定义保存文本的缓冲区*/
InitiStack(&Park1);
InitiStack(&Park2);
InitiQueue(&Wait);
while
(1)
{
textbackground(BLACK);
clrscr();
textmode(C80);
window(1,1,80,1);/*定义显示主菜单的窗口*/
textbackground(LIGHTGRAY);
textcolor(BLACK);
clrscr();
gotoxy(5,1);
for(i=0,l=0;i<4;i++)
{
x=wherex();/*