程序说明书.doc
《程序说明书.doc》由会员分享,可在线阅读,更多相关《程序说明书.doc(32页珍藏版)》请在冰点文库上搜索。
目录
摘要 2
前言 3
正文 4
1. 采用类c语言定义相关的数据类型 4
2. 各模块的流程图 4
3. 函数的调用关系图 8
4. 调试分析 9
5. 测试结果 10
6. 源程序(带注释) 16
总结 27
参考文献 28
致谢 31
摘要
因为停车场车辆繁多,停车与取车频繁,计算金额要准确无误所以良好的停车管理系统便应运而生,使车辆能够更便捷的管理。
本系统使用C语言作为开发工具,利用栈与队列简化了停车场停车与取车计费的过程,停车时使用栈作为存储结构,实行顺序停放,取车并且便道车进入时利用了栈与队列惊醒有序的存取,最后利用时间进行停车余额结算。
如果停车场的空间已满则进入便道进行停车。
运用系统自动获取时间,如果在停车场内则进行收费,如果在便道上则不收费。
若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在他之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开车场时必须按它停留的时间长短交纳费用。
关键词:
停车;简化;c语言
前言
停车场管理系统是现代化高科技社会不可或缺的一部分,在运输业高速发展的现今社会中,良好的停车管理系统方便了大家,使车辆能够更便捷的管理,由于有了良好的管理系统,使得生活节奏井然有序这也是编写本系统的目的所在,目前的停车场管理系统都是人工的,本系统可以大大提高停车场管理员工作效率,节省工作时间,节省人力,物力。
根据课程设计任务书要求,本系统开发主要完成以下功能和性能。
停车场车辆信息管理:
信息包括a车牌号,b车位置,c停车时间,d停车所用的花费。
用户根据系统所规定并提示的要求输入有关内容,车场所能容纳的车辆数由收费人员来确定,车辆离开时,车主还可以得到收据,便于收费的管理使用;并且系统程序所提供的一些信息可通过特殊硬件显示出来,供车主了解信息,准确有效的停车。
改程序系简单的用于运用栈与队列基本知识的工具,不能用于现实中,特别是栈“先进后出”的规则大大限定了该程序的推广,现实世界的车站管理系统比这个远远复杂的多
正文
1.采用类c语言定义相关的数据类型
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)/*初始化栈*/
2.各模块的流程图
车辆进入停车场和便道系统模块:
该系统要输入停车场所停车的车牌号码,让后输入要选择的菜单项,进行停车。
填写停车时间。
该模块功能图如图1所示:
图1车辆进入停车场和便道系统模块图
车辆离开停车场和便道系统模块:
该系统需要输入离开车的车牌号。
判断是车所在的位置,系统自动输出离开时间。
该模块功能图如图2,3所示:
图2车辆离开停车场系统模块图
图3车辆离开便道系统模块图
车辆收费系统模块:
该系统通过判断汽车所在的位置来收费,如果汽车在停车场则收费,如果汽车在便道则不收费用。
功能模块图如图4所示:
图4车辆收费模块图
3.程序的算法的设计框架及函数的调用关系图
图5程序算法的设计框架
图6函数调用关系图
4.调试分析
1、调试中遇到的问题及对问题的解决方法
(1)程序不能按原顺序输出。
原因是出站时存储变量指针方向弄反了,导致车出站后原顺序错误。
(2)输入时,无论输入车牌号码正确与否,全部能显示。
原因是没有清除输入缓存区,导致输入不是本来行啊要的输入的树,运用flushall()函数解决了问题。
2、调试分析
(1)进栈:
车辆进入
出栈:
车辆离开
查找:
允许排中间的车辆先离开停车场,因此需要在栈中进行查找。
(2)进栈:
车辆进入
出栈:
车辆离开
查找:
允许排中间的车辆先离开停车场,因此需要在栈中进行查找。
(3)在定义栈的元素最大空间时如果使用顺序栈必须先给它赋初值,但如果通过链表就可以实现动态分配内存,为栈动态开辟新空间。
(4)在判断键盘输入是否符合要求时,如果不符合要求应循环赋值,直到符合要求为止,在此利用的do-while循环语句与外部while语句套用时应使用两次break语句,才能跳出循环,否则会造成死循环。
5.测试结果
图7登录界面
图8进入停车场界面
图9离开停车场界面
图10显示离开停车场的金额及信息
图11进入便道界面
图12存车信息显示界面
图13退出系统界面
6.源程序(带注释)
#include
#include
#include
#include
#defineMax10
intgetn()
{
intn;
printf("欢迎您光临兰州理工大学技术工程学院停车场,");
printf("本停车场管理实行24小时制,停车每分钟0.1元.\n");
printf("请输入停车场可容纳的车(最多10辆):
");
scanf("%d",&n);
fflush(stdin);
do
{
if(n<1||n>10)
{
printf("输入的车辆数不在要求范围内,请重新输入!
");
scanf("%d",&n);
fflush(stdin);
}
elsebreak;
}
while(n<1||n>10);
returnn;
}
typedefstructtime//节点类型
{
inthour;//小时节点
intmin;//分钟节点
}Time;//时间结点
typedefstructnode//节点类型
{
charnum[10];//车牌节点
Timereach;//到达时间节点
Timeleave;//离开时间节点
}CarNode;//车辆信息结点
typedefstructNODE//节点类型
{
CarNode*stack[Max+1];//数据域指针
inttop;//头指针
}SeqStackCar;//模拟车站
typedefstructcar//节点类型
{
CarNode*data;//数据域指针
structcar*next;//指针域
}QueueNode;//车道结点
typedefstruct//队列的定义
{
QueueNode*head;//队头指针
QueueNode*rear;//队尾指针
}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));
fflush(stdin);
do{
if(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));
fflush(stdin);
}
if(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));
fflush(stdin);
}
elsebreak;
}
while(p->leave.hourreach.hour||(p->leave.hour==p->reach.hour&&p->leave.minreach.min));
printf("车场现在有一辆车离开,请便道里的第一辆车进入车场!
\n");
printf("出站的车的车牌号为:
");
puts(p->num);
printf("\n");
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("祝您一路顺风,欢迎您下次光临.");
printf("\n收据\n");
printf("==================================车牌号:
");
puts(p->num);
printf("\n");
printf("===================================================\n");
printf("|进车场时刻|出车场时刻|停留时间|应付(元)|\n");
printf("====================================================\n");
printf("|%d:
%d",p->reach.hour,p->reach.min);
printf("|%d:
%d",p->leave.hour,p->leave.min);
printf("|%d:
%d",b,c);
printf("|%2.1f",0.1*a);
printf("|\n");
printf("-----------------------------------------------------\n");
free(p);
}
intArrival(SeqStackCar*Enter,LinkQueueCar*W,intn)/*车辆到达*/
{
CarNode*p;
QueueNode*t;
inta,b;
p=(CarNode*)malloc(sizeof(CarNode));
flushall();
printf("\n请输入车牌号(七位,例:
陕A1234):
\n");
printf("请严格按照要求输入车牌号,否则系统会出错!
\n");
do{
a=strlen("陕A1234");//a表示车牌号的长度
b=strlen(gets(p->num));
fflush(stdin);
if(a!
=b)
{
printf("输入车牌号格式错误,请重新输入(七位)!
\n");
gets(p->num);
fflush(stdin);
}
elsebreak;
if(a!
=b)
printf("输入车牌号格式错误,请重新输入(七位)!
\n");
}
while(a!
=b);
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);
do{
if(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);
}
elsebreak;
}
while(p->reach.hour<0||p->reach.hour>=24||p->reach.min<0||p->reach.min>=60);
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)
{/*车辆离开*/
inti,room;
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("\n该车进入车场第%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);
}
elsebreak;
}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.车场\n2.便道\n3.返回\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);
}
elsebreak;
}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