停车场.docx
《停车场.docx》由会员分享,可在线阅读,更多相关《停车场.docx(25页珍藏版)》请在冰点文库上搜索。
停车场
淮阴工学院
数据结构课程设计报告
选题名称:
停车场管理问题
系(院):
计算机工程系
专业:
网络工程方向
班级:
网络1091
姓名:
阿非斯学号:
25
指导教师:
学年学期:
2010~2011学年第1学期
2010年12月30日
摘要
随着私家车的愈来愈多,在各个公共场所的各式各样的停车场也应运而生,在这样的情况下,停车场的管理就显得尤为重要。
设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端)。
若停车场内已经停满n辆车,那么后来的车只能在门外的便道上等候。
一旦有车开走,则排在便道上的第一辆车即可开入。
当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场。
每辆停放在车场的车在它离开停车场时必须按它停留的时间长短缴纳费用。
本文介绍运用数据结构中所学的链表、栈等知识,在VisualC++6.0环境下开发一个行之有效的停车场管理系统,要求实现的功能的有:
车辆到达是的信息登记,车辆离开时的信息记录及停车费用的计算和停车场及便道的车辆信息的显示等功能。
关键词:
数据结构;停车场管理;栈;链表;队列
目录
1.需求分析1
1.1课程设计的目的1
1.2基本要求1
1.3课程设计的任务1
1.4软件运行和开发工具1
1.5课程设计的思想1
2.概要设计1
2.1程序整体描述1
2.2结构描述1
2.3栈描述3
2.4函数描述3
2.5数据结构与算法描述3
2.5功能模块4
3.详细设计和实现4
3.1车辆到达登记4
3.2车辆离开记录5
3.3车辆信息显示8
4.程序代码......................................................9
5.调试及操作说明17
总结20
致谢21
参考文献.........................................................,,22
1.需求分析
1.1课程设计的目的
运用数据结构编写一个C++程序,实现对停车场的管理。
主要包括:
车辆到达是的信息登记,车辆离开时的信息记录及停车费用的计算和停车场及便道的车辆信息的显示等功能。
1.2基本要求
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入数据的序列进行模拟管理。
每一组输入数据包括三个数据项:
汽车的“到达”(‘A’表示)或“离去”(‘D’表示)信息、汽车标识(牌照号)以及到达或离去的时刻。
对每一组输入数据进行操作后的输出信息为:
若是车辆到达,则输出汽车在停车场内或者便道上的停车位置;若是车辆离去,则输出汽车在停车场停留的时间和应缴纳的费用(便道上停留的时间不收费)。
栈以顺序结构实现,队列以链表结构实现。
1.3课程设计的任务
该系统主要实现以下几个功能:
a)车辆到达信息登记:
包括车牌号,到达时间,在停车场停放的位置等;
b)车辆离开记录:
包括离开时间,停车费用等;
c)信息显示:
显示停车场内和便到内的汽车到达时机急位置等基本信息;
1.4软件运行和开发工具
1.Windows2000以上操作系统
2.VisualC++6.0开发环境
1.5课程设计的思想
该程序应用栈来完成的汽车进停车场和出停车场就是一个数据进栈和出栈的过程。
如果停车场(栈)满了,就将车辆放在便到(临时的栈)里;在车辆离开时计算出使用费用,并将便到第一辆车停到该车位置。
2.概要设计
2.1程序整体描述
程序用了一个类,五个结构,两个栈(其中一个为临时栈),除主函数外用了八个函数;
2.2结构描述
结构:
Time-建立时间结点
CarNode-建立车辆信息结点
SeqStackCar-模拟车站
QueueNode
LinkQueueCar-模拟便道
typedefstructtime
{
inthour;
intmin;
}Time;
typedefstructnode
{
charnum[10];
Timereach;
Timeleave;
}CarNode;
typedefstructNODE
{
CarNode*stack[MAX+1];
inttop;
}SeqStackCar;
typedefstructcar
{
CarNode*data;
structcar*next;
}QueueNode;
typedefstructNode
{
QueueNode*head;
QueueNode*rear;
}LinkQueueCar;
2.3栈描述
(1)、在SeqStackCar中定义创建一个栈
CarNode*stack[MAX+1];
inttop;
(2)、SeqStackCarEnter,Temp
InitStack(&Temp)
在车辆离开时,应用temp临时把将要离开的车辆后续车辆压入,等车辆离开后压回原栈stack
voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W)
2.4函数描述
函数:
(1)、intArrival(SeqStackCar*Enter,LinkQueueCar*W)
(2)、intInitQueue(LinkQueueCar*Q)
(3)、voidInitStack(SeqStackCar*s)
(4)、voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W)
(5)、voidList(SeqStackCarS,LinkQueueCarW)
(6)、voidList1(SeqStackCar*S)
(7)、voidList2(LinkQueueCar*W)
(8)、voidPRINT(CarNode*p,introom)
2.5数据结构与算法描述
(1)、在SeqStackCar中定义创建一个栈
CarNode*stack[MAX+1];
inttop;
(2)、SeqStackCarEnter,Temp
InitStack(&Temp)
在车辆离开时,应用temp临时把将要离开的车辆后续车辆压入,等车辆离开后压回原栈stack
voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W)
2.5功能模块
图2.1功能模块
3.详细设计和实现
按照功能模块的描述主要实现三个功能
3.1车辆到达登记
intArrival(SeqStackCar*Enter,LinkQueueCar*W)
{
CarNode*p;
QueueNode*t;
p=(CarNode*)malloc(sizeof(CarNode));
flushall();
printf("\n请输入车牌号(例:
豫B1234):
");
gets(p->num);
if(Enter->top{
Enter->top++;
printf("\n车辆在车场第%d位置.",Enter->top);
printf("\n车辆到达时间:
");
scanf("%d:
%d",&(p->reach.hour),&(p->reach.min));
Enter->stack[Enter->top]=p;
return
(1);
}
else
{
printf("\n该车须在便道等待!
有车位时进入车场");
t=(QueueNode*)malloc(sizeof(QueueNode));
t->data=p;
t->next=NULL;
W->rear->next=t;
W->rear=t;
return
(1);
}
}
进停车场时候必须先判断停车场是不是满了,如果满了车就必须在便道里等候,等有空车位是才能进去。
图3.1进停车场流程
3.2车辆离开记录
voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W)
{
introom;
CarNode*p,*t;
QueueNode*q;
if(Enter->top>0)
{
while
(1)
{
printf("\n请输入车在车场的位置/1--%d/:
",Enter->top);
scanf("%d",&room);
if(room>=1&&room<=Enter->top)break;
}
while(Enter->top>room)
{
Temp->top++;
Temp->stack[Temp->top]=Enter->stack[Enter->top];
Enter->stack[Enter->top]=NULL;
Enter->top--;
}
p=Enter->stack[Enter->top];
Enter->stack[Enter->top]=NULL;
Enter->top--;
while(Temp->top>=1)
{
Enter->top++;
Enter->stack[Enter->top]=Temp->stack[Temp->top];
Temp->stack[Temp->top]=NULL;
Temp->top--;
}
PRINT(p,room);
if((W->head!
=W->rear)&&Enter->top{
q=W->head->next;
t=q->data;
Enter->top++;
printf("\n便道的%s号车进入车场第%d位置.",t->num,Enter->top);
printf("\n请输入%s号车进入车场的时间:
");
scanf("%d:
%d",&(t->reach.hour),&(t->reach.min));
W->head->next=q->next;
if(q==W->rear)W->rear=W->head;
Enter->stack[Enter->top]=t;
free(q);
}
elseprintf("\n便道里没有车.\n");
}
elseprintf("\n车场里没有车.");
}
离开的时候先判断停车场里有没有车。
有车:
输入离开的车的车位号,计算使用费用,同时释放该车位。
在判读便道里有没有车,有的话就将便道里的第一辆车停到该车位。
图3.2车辆离开流程
3.3车辆信息显示
voidList1(SeqStackCar*S)
{
inti;
if(S->top>0)
{
printf("\n车场:
");
printf("\n位置到达时间车牌号\n");
for(i=1;i<=S->top;i++)
{
printf("%d",i);
printf("%d:
%d",S->stack[i]->reach.hour,S->stack[i]->reach.min);
puts(S->stack[i]->num);
}
}
elseprintf("\n车场里没有车");
}
voidList2(LinkQueueCar*W)
{
QueueNode*p;
p=W->head->next;
if(W->head!
=W->rear)
{
printf("\n等待车辆的号码为:
");
while(p!
=NULL)
{
puts(p->data->num);
p=p->next;
}
}
elseprintf("\n便道里没有车.");
}
由于车辆可能在停车场或便道两个地方,所以,车辆信息的现实也有两个函数用来分别显示停车场和便道的车辆在停车场的基本信息
4.程序代码
#include
#include
#include
#defineMAX20
#defineprice0.05
typedefstructtime{
inthour;
intmin;
}Time;
typedefstructnode{
charnum[10];
Timereach;
Timeleave;
}CarNode;
typedefstructNODE{
CarNode*stack[MAX+1];
inttop;
}SeqStackCar;
typedefstructcar{
CarNode*data;
structcar*next;
}QueueNode;
typedefstructNode{
QueueNode*head;
QueueNode*rear;
}LinkQueueCar;
voidInitStack(SeqStackCar*);
intInitQueue(LinkQueueCar*);
intArrival(SeqStackCar*,LinkQueueCar*);
voidLeave(SeqStackCar*,SeqStackCar*,LinkQueueCar*);
voidList(SeqStackCar,LinkQueueCar);
voidmain()
{
SeqStackCarEnter,Temp;
LinkQueueCarWait;
intch;
InitStack(&Enter);
InitStack(&Temp);
InitQueue(&Wait);
while
(1)
{
printf("\n1.车辆到达登记");
printf("2.车辆离开登记");
printf("3.车辆列表显示");
printf("4.退出系统\n");
while
(1)
{
scanf("%d",&ch);
if(ch>=1&&ch<=4)break;
elseprintf("\n请选择:
1~4.");
}
switch(ch)
{
case1:
Arrival(&Enter,&Wait);break;
case2:
Leave(&Enter,&Temp,&Wait);break;
case3:
List(Enter,Wait);break;
case4:
exit(0);
default:
break;
}
}
}
voidInitStack(SeqStackCar*s){
inti;
s->top=0;
for(i=0;i<=MAX;i++)
s->stack[s->top]=NULL;
}
intInitQueue(LinkQueueCar*Q){
Q->head=(QueueNode*)malloc(sizeof(QueueNode));
if(Q->head!
=NULL)
{
Q->head->next=NULL;
Q->rear=Q->head;
return
(1);
}
elsereturn(-1);
}
voidPRINT(CarNode*p,introom){
intA1,A2,B1,B2;
printf("\n车辆离开的时间:
");
scanf("%d:
%d",&(p->leave.hour),&(p->leave.min));
printf("\n离开车辆的车牌号为:
");
puts(p->num);
printf("\n其到达时间为:
%d:
%d",p->reach.hour,p->reach.min);
printf("离开时间为:
%d:
%d",p->leave.hour,p->leave.min);
A1=p->reach.hour;
A2=p->reach.min;
B1=p->leave.hour;
B2=p->leave.min;
printf("\n应交费用为:
%2.1f元",((B1-A1)*60+(B2-A2))*price);
free(p);
}
intArrival(SeqStackCar*Enter,LinkQueueCar*W){
CarNode*p;
QueueNode*t;
p=(CarNode*)malloc(sizeof(CarNode));
flushall();
printf("\n请输入车牌号(例:
豫B1234):
");
gets(p->num);
if(Enter->top{
Enter->top++;
printf("\n车辆在车场第%d位置.",Enter->top);
printf("\n车辆到达时间:
");
scanf("%d:
%d",&(p->reach.hour),&(p->reach.min));
Enter->stack[Enter->top]=p;
return
(1);
}
else
{
printf("\n该车须在便道等待!
有车位时进入车场");
t=(QueueNode*)malloc(sizeof(QueueNode));
t->data=p;
t->next=NULL;
W->rear->next=t;
W->rear=t;
return
(1);
}
}
voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W)
{
introom;
CarNode*p,*t;
QueueNode*q;
if(Enter->top>0)
{
while
(1)
{
printf("\n请输入车在车场的位置/1--%d/:
",Enter->top);
scanf("%d",&room);
if(room>=1&&room<=Enter->top)break;
}
while(Enter->top>room)
{
Temp->top++;
Temp->stack[Temp->top]=Enter->stack[Enter->top];
Enter->stack[Enter->top]=NULL;
Enter->top--;
}
p=Enter->stack[Enter->top];
Enter->stack[Enter->top]=NULL;
Enter->top--;
while(Temp->top>=1)
{
Enter->top++;
Enter->stack[Enter->top]=Temp->stack[Temp->top];
Temp->stack[Temp->top]=NULL;
Temp->top--;
}
PRINT(p,room);
if((W->head!
=W->rear)&&Enter->top{
q=W->head->next;
t=q->data;
Enter->top++;
printf("\n便道的%s号车进入车场第%d位置.",t->num,Enter->top);
printf("\n请输入%s号车进入车场的时间:
");
scanf("%d:
%d",&(t->reach.hour),&(t->reach.min));
W->head->next=q->next;
if(q==W->rear)W->rear=W->head;
Enter->stack[Enter->top]=t;
free(q);
}
elseprintf("\n便道里没有车.\n");
}
elseprintf("\n车场里没有车.");
}
voidList1(SeqStackCar*S)
{
inti;
if(S->top>0)
{
printf("\n车场:
");
printf("\n位置到达时间车牌号\n");
for(i=1;i<=S->top;i++)
{
printf("%d",i);
printf("%d:
%d",S->stack[i]->reach.hour,S->stack[i]->reach.min);
puts(S->stack[i]->num);
}
}
elseprintf("\n车场里没有车");
}
voidList2(LinkQueueCar*W)
{
QueueNode*p;
p=W->head->next;
if(W->head!
=W->rear)
{
printf("\n等待车辆的号码为:
");
while(p!
=NULL)
{
puts(p->data->num);
p=p->next;
}
}
elseprintf("\n便道里没有车.");
}
voidList(SeqStackCarS,LinkQueueCarW)
{
intflag,tag;
flag=1;
while(flag)
{
printf("\n请选择1|2|3:
");
printf("\n1.车场列表\n2.便道列表\n3.返回主菜单\n");
while
(1)
{
scanf("%d",&tag);
if(tag>=1||tag<=3)break;
elseprintf("\n请选择1~3:
");
}
switch(tag)
{
case1:
List1(&S);break;
case2:
List2(&W);break;
case3:
flag=0;break;
default:
break;
}
}
}
5.调试及操作说明
执行程序后进入主菜单:
图4.1主菜单
选择“1”进入进停车场登记
图4.2车辆达到登记
选择“3”进入车辆显示,在选择“1”显示停车场车辆信息
图4.3车辆信息显示
选择“2”进入车辆离开管理
图4.4车辆离开
总结
本次课程设计我学会了很多知识,不仅在对数据结构这门课上有了一定的知识上的了解与认识,同时,也是巩固了C++的知识。
我所选择的课程设计是停车场的设计,这个课题在实用性与开放性上上有很多的扩张与发展空间。
在课程设计的时候,我遇到了很多的问题,在代码运行的时候问题则是更为集中,这体现出我在这门课上的学习过程中存在着许多的不足。
虽然,在过程中得到了老师与同学的帮助后,程序是完成了,但是许多的主要问题都是依靠老师与同学才得以完成,自己完成的很少。
希望自己能在这反面有所突破与改观。
本次课程设计的总体