停车管理系统的说明书内页.docx
《停车管理系统的说明书内页.docx》由会员分享,可在线阅读,更多相关《停车管理系统的说明书内页.docx(25页珍藏版)》请在冰豆网上搜索。
停车管理系统的说明书内页
目录
一、设计目的2
二、设计内容2
三、设计分析2
四、总体设计3
五、详细设计5
六、程序调试6
七、总结18
八、参考文献18
1、设计目的
1.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
2、设计内容
设计一个停车场,停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等待,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。
基本要求是以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。
每一组输入数据包括三个数据项:
汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。
对每一组输入数据进行操作后的输出信息为:
若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。
栈以顺序结构实现,队列以链表结构实现。
3、设计分析
这个设计要实现的是停车场的模拟系统的一些功能。
功能如下:
1、车辆进入停车场,要给出其停车位置或停于便道上。
2、车辆离开停车场,要给出其停车时间及停车费用的多少。
3、停车场满时,一旦有车开走,则排在便道上的第一辆车即可开入。
4、车辆退出停车场,在它之后进入的车辆必须先退出车场为它让路,待该车开出大门外,再按原次序进入车场。
四、总体设计
1、模块之间的主要关系和调用关系的流程图
N
Y
2、抽象数据类型的定义
①设定栈的抽象数据类型定义为:
ADTstack{
数据对象:
D={ai|ai∈charset,i=1,2,……,n,n>=0}
数据关系:
R1={|ai-1,ai∈D,i=2……,n}
基本操作:
InitStack(&S)
操作结果:
构造一个空栈S。
Push(&S,e)
初始条件:
栈S已经存在。
操作结果:
在栈S的栈顶插入新的栈顶元素e。
Pop(&S,&e)
初始条件:
栈S已经存在。
操作结果:
删除S的栈顶元素,并以e返回其值。
StackTraverse(S,visit())
初始条件:
栈S已经存在。
操作结果:
从栈底到栈顶依次对S中的每一个元素调用函数visit().
}ADTstack
②设定队列的抽象数据类型定义为:
数据对象:
D={ai|ai∈Elemset,i=1,2,……,n,n>=0}
数据关系:
R1={|ai-1,ai∈D,i=2……,n}
约定其中ai为队列头,an为队列尾.
基本操作:
InitQueue(&Q)
操作结果:
构造一个空队列Q.
DestroyQueue(&Q)
初始条件:
队列Q已存在.
操作结果:
队列Q被销毁,不再存在.
ClearQueue(&Q)
初始条件:
队列Q已存在.
操作结果:
将Q清为空队列.
QueueEmpty(Q)
初始条件:
队列Q已存在.
操作结果:
若Q为空队列,则返回True,否则返回False.
QueueLength(Q)
初始条件:
队列Q已经存在.
操作结果:
返回Q的元素个数,即队列的长度.
GetHead(Q,&e)
初始条件:
Q为非空队列.
操作结果:
用e返回Q的对头元素.
EnQueue(&Q,e)
初始条件:
队列Q已存在.
操作结果:
插入元素e为Q新的队尾元素.
DeQueue(&Q,&e)
初始条件:
Q为非空队列.
操作结果:
删除Q的队头元素,并用e返回其值.
QueueTraverse(Q,visit())
初始条件:
Q已存在且非空.
操作结果:
从队头到队尾,依次对Q的每一个数据元素调用函数
visit().一旦visit()失败,则操作失败.
}ADTQueue
5、详细设计
1.时间结点类型
typedefstructtime{
inthour;
intmin;
}Time;/*时间结点*/
2.车辆进出站信息类型
typedefstructnode{
charnum[10];
Timereach;
Timeleave;
}CarNode;/*车辆信息结点*/
3.停车场和便道信息类型
typedefstructNODE{
CarNode*stack[Max+1];
inttop;
}SeqStackCar;/*模拟车站*/
typedefstructcar{
CarNode*data;
structcar*next;
}QueueNode;
typedefstructNode{
QueueNode*head;
QueueNode*rear;
}LinkQueueCar;/*模拟通道*/
voidInitStack(SeqStackCar*,intn);/*声明栈*/
//初始化,创建两个新栈S,S1
intInitQueue(LinkQueueCar*);/*声明便道*/
//初始化,创建一个队列Q用于便道
intArrival(SeqStackCar*,LinkQueueCar*,intn);/*车辆进站*/
voidLeave(SeqStackCar*,SeqStackCar*,LinkQueueCar*,intn);/*车辆出站*/
voidList(SeqStackCar,LinkQueueCar);/*显示存车信息*/
voidInitStack(SeqStackCar*s,intn)/*初始化栈*/
4.主函数和其它函数的伪码算法
voidmain()
{//主程序
initialization();//初始化
while
(1){
scanf(...................);//根据提示信息输入想要的操作
switch(k){//根据输入的数调用不同的函数
case1:
case2:
....................
}
}
}
typedefstruct**{
//用于创建不同结构体类型的指针与变量
}
voidPRINT(CarNode*p){
//调用输出函数
Leave(*p,n)...................
根据求解时间值来求得费用,并通过收据打印出来
}
六、程序调试
程序完整代码如下:
#include
#include
#include
#include
#defineMax20
intgetn()
{
intn;
printf("欢迎光临本停车场,");
printf("本停车场管理实行24小时制,停车每分钟0.1
元.\n");
printf("请输入停车场可容纳的车(最多20辆):
");
scanf("%d",&n);
while(n<1||n>20)
{
printf("输入的车辆数不在要求范围内,请重新输入!
");
scanf("%d",&n);
}
returnn;
}
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*,intn);/*声明栈*/
intInitQueue(LinkQueueCar*);/*声明便道*/
intArrival(SeqStackCar*,LinkQueueCar*,intn);/*车辆进站*/
voidLeave(SeqStackCar*,SeqStackCar*,LinkQueueCar*,intn);/*车辆出站*/
voidList(SeqStackCar,LinkQueueCar);/*显示存车信息*/
voidInitStack(SeqStackCar*s,intn)/*初始化栈*/
{
inti;
s->top=0;
for(i=0;i<=n;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)/*打印出站的车的信息*/
{
intA1,A2,B1,B2;
inta,b,c;
printf("\n请输入离开的时间:
/**:
**/");
scanf("%d:
%d",&(p->leave.hour),&(p->leave.min));
while(p->leave.hourreach.hour
||(p->leave.hour==p->reach.hour
&&p->leave.minreach.min))
{
printf("输入离开时间比进站时间早,请重新输入!
\n");
scanf("%d:
%d",&(p->leave.hour),&(p->leave.min));
}
while(p->leave.hour<0||p->leave.hour>=24
||p->leave.min<0||p->leave.min>=60)
{
printf("输入的时间格式有错,请重新输入!
");
scanf("%d:
%d",&(p->leave.hour),&(p->leave.min));
}
A1=p->reach.hour;
A2=p->reach.min;
B1=p->leave.hour;
B2=p->leave.min;
a=(B1-A1)*60+B2-A2;
if(a>=60)
{
b=a/60;
c=a-60*b;
}
else
{
b=0;
c=a;
}
printf("====================================================\n");
printf("出车场车车牌号:
");
puts(p->num);
printf("\n");
printf("停留时间:
%d:
%d应付(元):
%2.1f\n",b,c,0.1*a);
printf("====================================================\n");
free(p);
}
intArrival(SeqStackCar*Enter,LinkQueueCar*W,intn)/*车辆到达*/
{
CarNode*p;
QueueNode*t;
p=(CarNode*)malloc(sizeof(CarNode));
printf("\n请输入车牌号(4位数,例:
1234):
\n");
gets(p->num);
fflush(stdin);
if(Enter->top{
Enter->top++;
printf("\n车辆在车场第%d位置.",Enter->top);
fflush(stdin);
printf("\n请输入到达时间,形如|**:
**|:
");
scanf("%d:
%d",&(p->reach.hour),&(p->reach.min));
fflush(stdin);//清除缓冲区
while(p->reach.hour<0||p->reach.hour>=24
||p->reach.min<0||p->reach.min>=60)
{
printf("输入的时间格式有错,请重新输入!
");
scanf("%d:
%d",&(p->reach.hour),&(p->reach.min));
fflush(stdin);
}
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,intn)
{/*车辆离开*/
introom;
CarNode*p,*t;
QueueNode*q;
/*判断车场内是否有车*/
if(Enter->top>0)/*有车*/
{
while
(1)/*输入离开车辆的信息*/
{
printf("\n请输入要离开的车在车场的位置/1--%d/:
",Enter->top);
scanf("%d",&room);
fflush(stdin);
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);
/*判断通道上是否有车及车站是否已满*/
if((W->head!
=W->rear)&&Enter->top{
q=W->head->next;
t=q->data;
Enter->top++;
printf("\n现在便道上的车牌号为:
");
puts(t->num);
printf("进入车场第%d位置.",Enter->top);
printf("\n请输入现在的时间(即该车进站的时间)/**:
**/:
");
scanf("%d:
%d",&(t->reach.hour),&(t->reach.min));
fflush(stdin);
do{
if(t->reach.hour<0||t->reach.hour>=24
||t->reach.min<0||t->reach.min>=60)
{
printf("输入的时间格式有错,请重新输入!
");
scanf("%d:
%d",&(t->reach.hour),&(t->reach.min));
fflush(stdin);
}
else
break;
}while(t->reach.hour<0||t->reach.hour>=24
||t->reach.min<0||t->reach.min>=60);
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;
printf("\n");
}
}
elseprintf("\n目前便道里没有车.");
}
voidList(SeqStackCarS,LinkQueueCarW)
{
intflag,tag;
flag=1;
while(flag)
{
printf("\n1.车场2.便道3.返回\n");
while
(1)
{printf("\n请选择1|2|3:
");
scanf("%d",&tag);
fflush(stdin);
do{
if(tag<1||tag>3)
{
printf("输入有误,请按要求重新输入!
");
scanf("%d",&tag);
fflush(stdin);
}
else
break;
}while(tag>3&&tag<1);
break;
}
switch(tag)
{
case1:
List1(&S);break;/*列表显示车场信息*/
case2:
List2(&W);break;/*列表显示便道信息*/
case3:
flag=0;break;/*返回*/
default:
break;
}
}
}
voidmain()
{
SeqStackCarEnter,Temp;
LinkQueueCarWait;
intch;
intn;
printf("============================================================\n");
n=getn();
InitStack(&Enter,n);/*初始化车场*/
InitStack(&Temp,n);/*初始化让路的临时栈*/
InitQueue(&Wait);/*初始化便道*/
while
(1)
{
printf("\n1.车辆进站");
printf("2.车辆出站");
printf("3.存车信息");
printf("4.退出系统\n");
while
(1)
{printf("请选择:
1|2|3|4.\n");
scanf("%d",&ch);
fflush(stdin);
do{
if(ch>4||ch<1){
printf("输入有误,请重新输入!
");
scanf("%d",&ch);
fflush(stdin);
}
else
break;
}while(ch>4||ch<1);
break;
}
switch(ch)
{
case1:
Arrival(&Enter,&Wait,n);break;/*车辆进站*/
case2:
Leave(&Enter,&Temp,&Wait,n);break;/*车辆出站*/
case3:
List(Enter,Wait);break;/*存车信息*/
case4:
exit(0);/*退出系统*/
default:
break;
}
}
}
系统测试:
图一
图二
图三
说明:
输入车牌号为1657,得到第1位置停车位,输入到达时间10:
00
图四
说明:
再进一辆车,车牌号为1789,停在第2位置,到达时间为12:
00,
此时,停车场内为满。
图五
说明:
再进一辆车牌号为1679的车,该车只能在便道等待了。
图六
说明:
选择2,出一辆车,出的是第2位置的车,离开实践为16:
00,得到停留时间和应付的费用为24元。
便道上的第一辆车进入车场第二位置。
图七
说明:
选择3存车信息,再选择1显示车场存车情况。
图八
说明:
选择2显示目前便道里没有车,再选择3返回主菜单。
最后选择4退出系统。
7、结论
经过本次设计发现了自己很多的不足之处,充分掌握了了自己的总体水平是多少。
程序设计需要严密的谨慎的思维