停车场管理说明书.docx
《停车场管理说明书.docx》由会员分享,可在线阅读,更多相关《停车场管理说明书.docx(21页珍藏版)》请在冰豆网上搜索。
停车场管理说明书
目录
摘要1
前言2
正文3
1.采用类c语言定义相关的数据类型3
2.各模块的伪码算法3
3.函数的调用关系图3
4.调试分析3
5.测试结果3
6.源程序(带注释)3
总结4
参考文献5
致谢6
附件Ⅰ部分源程序代码7
摘要
循环队列是一种环状的队列并且对头元素指向队尾元素,停车场管理问题是典型的只有采用循环队列和栈才能解决的问题,实验表明该算法的空间复杂度优于其他算法。
关键词:
数据结构;空间复杂度;循环队列;栈
前言
随着汽车工业的迅猛发展,我国汽车拥有量急剧增加,停车场作为交通设施的组成部分,随着交通运输的繁忙和不断发展,人们对其管理的要求也不断提高,都希望管理能够达到方便,快捷以及安全的效果。
停车场的规模各不相同,对其进行管理的模式也有不同之处,管理者需要根据自身的条件,选择应用经济,稳定的管理程序,以免选择了高成本的管理系统。
本论文旨在设计一个简洁、稳定、实用的停车场管理系统,希望在容错性,实用性,易用性等方面具有自己的特色,并且保持一定的可扩展性,以满足不同停车场的信息管理需求。
一个典型的停车场管理信息系统需要包括车辆进入管理及收费功能,停车场车牌号及查询功能和系统设置以及管理功能。
正文
1.采用类c语言定义相关的数据类型
Char;
SeqStack;
Int;
LinkQueue;
2.各模块的伪码算法
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)/*打印出站车的信息*/
{
intArrival(SeqStackCar*Enter,LinkQueueCar*W)/*车辆到达*/
{
CarNode*p;
QueueNode*t;
p=(CarNode*)malloc(sizeof(CarNode));
flushall();
printf("\n请输入车牌号(例:
甘M1823):
");
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;
}
}
}
3.函数的调用关系图
4.调试分析
a、调试中遇到的问题及对问题的解决方法
1.问题:
字符和括号的输写错误
解决方法:
把中文输入字母切换成英文输入
2.问题:
括号的对应
解决方法:
一个一个的补充括号和调整括号
b、算法的时间复杂度和空间复杂度
程序转化为EXE文件后的空间复杂度为205KB。
车辆到达离开的时间复杂度为O(n)。
5.测试结果
车牌号甘M6789的存入,开出
6.源程序(带注释)
#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请输入车牌号(例:
甘M1823):
");
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;
}
}
}
总结
本次课程设计花费我三周时间来完成。
从课题的布置到完成课程设计,按时完成了相关任务。
通过这次课程设计,我学习到了很多算法与数据结构的知识,同时对本学期的课本所学知识有了进一步巩固,特别是对栈和队列等的熟练运用。
这次课程设计之后,我发现,动手比看书更能获取实际有用的知识。
很多知识,在书本上看似很有道理,可是这些知识在与实际情况结合起来往往就会出现书本上没有见过的情况,或者说之前的理解与实际的使用是截然不同的。
所以,真理是从实践中得知的,而且也只有实践才能检验真理。
而这次课设也加强了我们这些方面的理解能力,对书面上的东西实际操作在具体项目上有了一个更加清晰的认识。
我们还意识到一个大的程序,在写代码前,一定要有良好的需求分析和结构设计,应该占整个程序设计的大部分时间,一个好的程序,分析设计应该要非常充分,这样才不至于代码写了一半才发现很多错误。
在具体代码操作之前的设计规划与构建才是一个优秀的程序设计的灵魂。
设计过程中,我另一个大的体会就是要及时参考图书馆借来的书,通过教程,大大的提高了工作的效率。
同时我也发现自己的不足之处。
对于很多自己以为很熟悉的东西,在细节上的把握有许多不足:
有些想当然,认为它应该是这样,而忽略的事实。
这也让我明白,做事细心是必须的,所谓细节决定成败!
程序还有好多不足,在今后的日子里,我会虚心向老师同学请教,尽自己最大的努力做到最好。
参考文献
1.严蔚敏,吴伟民.《数据结构(C语言版)》.清华大学出版社.
2.严蔚敏,吴伟民.《数据结构题集(C语言版)》.清华大学出版社.
3.《DATASTRUCTUREWITHC++》.WilliamFord,WilliamTopp.清华大学出版社(影印版).
4.谭浩强.《c语言程序设计》.清华大学出版社.
5.数据结构与算法分析(Java版),APracticalIntroductiontoDataStructuresandAlgorithmAnalysisJavaEditionCliffordA.Shaffer,张铭,刘晓丹译 电子工业出版社2001年1月
致谢
首先,我们要感谢学校给我们提供了此次课程设计的机会,能让同学们在一起学习与研究,让我们有机会对所学的理论知识进行实践。
其次,我们还要特别感谢我们的辅导老师王旭阳老师,在他的精心辅导和帮助下,我的设计才得以顺利完成。
对他为我的设计所提出的宝贵意见表示忠心的感谢!
最后、在论文的写作过程中,也得到了许多同学的宝贵建议,同时还到许多校友的支持和帮助,在此一并致以诚挚的谢意。
附件Ⅰ部分源程序代码
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;
}
}
}