完整word版课程设计停车场管理系统.docx
《完整word版课程设计停车场管理系统.docx》由会员分享,可在线阅读,更多相关《完整word版课程设计停车场管理系统.docx(21页珍藏版)》请在冰豆网上搜索。
完整word版课程设计停车场管理系统
学号1011200142
数据结构课程设计
设计说明书
停车场管理系统
起止日期:
年月至年月日
学生姓名
班级
成绩
指导教师(签字)
年月日
停车场管理系统
一、引言
随着现代化信息技术的发展,人民生活水平快速提高,汽车的数量也飞速增长,于此同时,停车问题越来越受人们的关注,为了使停车场有效管理,停车场管理的信息化成为必然。
我们可以利用所学的知识,编写一个停车场管理系统,以提高管理的效率,提升停车场的竞争力。
本次课程设计,我运用C语言编写停车场管理系统,主要实现汽车停车,离开,收费,停车信息查询,显示等功能,主要实现方式是用栈和队列.下面对栈和队列进行一下简单介绍.
栈(stack)是一种仅允许在一端进行插入和删除运算的线性表。
栈中允许插入和删除的那一端,称为栈顶(top)。
栈顶的第一个元素称为栈顶元素。
栈中不可以插入和删除的那一端称为栈底.在一个栈中插入元素,即把新元素放到当前栈顶元素的上面,使其称为新的栈顶元素,即进栈(push)。
从一个栈中删除一个元素,即把栈顶元素删除掉,使其下面的元素成为新的栈顶元素,称为出栈(pop)。
栈遵循后进先出的原则,即后进栈的元素必先出栈.其中顺序栈是利用一组地址连续的存储单元依次存放从栈底到栈顶的元素。
在C语言中,可以用一维数组描述顺序栈中数据元素的存储区域,并预设一个数组的最大空间。
栈底设置在0下标端,栈顶随着插入和删除元素而变化,可以用一个整形变量top来指示栈顶的位置.
队列是一种限定在表的一端进行插人而另一端进行删除的线性表,与栈相反,队列遵循先进先出的原则.允许删除的一端,称为队头(front)。
允许插入的一端称为队尾(rear)。
向队列中插入新的元素称为入队,新元素进队后就成为了新的队尾元素;从队列中删除元素,称为出队,元素离队后,其后继元素就成为了新的队头元素.其中链队列就是用链表表示的队列,需要两个分别指示队头和队尾的指针(分别称为头指针和尾指针).为了操作方便,给链队列添加一个头结点,并令头指针指向头结点,尾指针指向队尾元素结点,判断队列为空的条件是头指针和尾指针均指向头结点。
停车场的管理系统正好利用栈和队列的这些特点来实现模拟停车场和便道.
停车场管理主要实现以下几个功能:
(1)、停车场车位的划分。
(2)、车辆进出管理及收费功能。
(3)、停车场车辆信息查询功能。
(4)、退出系统。
二、系统总体设计
1、设计思路
停车场采用栈式结构,便道采用队列结构(即便道就是等候队列)。
停车场的管理流程如下:
(1)当车辆要进入停车场时,检查停车场是否已满,如果未满则车辆进栈(车辆进入停车场);如果停车场已满,则车辆进入等候队列(车辆进入便道等待)。
(2)当车辆要求出栈时,该车到栈顶的那些车先出栈(在它之后进入的车辆必须先退出车场为它让路),在让该车出栈,其他车辆再按原次序进栈(进入车场)。
当车辆出栈完毕后,检查等候队列(便道)中是否有车,有车则从队头取出,压入栈中.
用栈模拟停车场,用队列模拟便道,按照从终读入的输人数据序列的进行模拟管理,每一组输入数据包含三个数据项:
汽车到达或汽车离去的信息,汽车车牌号以及汽车到达或离去的时刻。
每次输完,进行输出操作:
若是车辆到达,输出汽车在停车场内或者便道上停车的信息;若是车辆离去,输出停留时间和需缴纳的费用(在便道上停留的时间不收费),其中栈以顺序结构实现,队列以链表结构实现.
2、系统总体框架图
主函数流程图
图1系统总体框图
3、系统流程图
实现对一级菜单:
模拟停车场,便道,实现车辆停车、离开、列表显示停车场信息、退出系统功能的控制,调用各个子函数。
程序流程图如图2所示。
图2主函数流程图
三、详细设计
1、车辆停车函数及流程图
车辆停车函数实现:
记录停车信息包括车辆车牌号、停车时刻、停车车位等。
其流程如图3所示
图3车辆停车流程图
2、车辆离开函数及流程图
车辆离开函数主要实现:
记录车辆离开的信息,以及便道上的车是否进入车库中。
其流程如图4所示。
图4车辆离开流程图
3、列表显示车场信息函数及流程图
该函数主要判断停车场是否有车,如果有车就显示停车场车辆的信息,没车显示无车.其流程如图5所示。
图5列表显示停车场信息流程图
4、列表显示便道信息
判断便道上是否有车,如果有车,输出车辆的车牌号,如果没有车,显示无车,其流程如图6所示
图6列表显示便道信息
5列表显示菜单函数及流程图
示实现列表显示功能的控制,调用显示停车场信息、便道信息的函数,程序流程图如图7所示
结束
图7列表显示菜单及流图
四、总结
通过本次课程设计,我对数据结构的理解进一步加深,我理解和掌握了每一段程序代码的功能及含义,并且能够实现模拟停车场管理的主要功能:
利用栈实现车的入库问题,利用队列完成车在便道上停放的问题,主要是通过栈和队列的初始化,调用等函数来模拟停车问题。
学习数据结构,我学会如何将所学的知识运用到实际中,解决一些实际的问题,这才是学习的根本。
当然在实验中我也遇到了不少实际性的问题,比如车辆停车的时间hour限制在24小时,min限制在60分钟之内,如果加入日期计算就更好了;在便道上等待的车辆,车主不可能无限制的等待,应该编写一个便道上车辆离开的函数更合理些。
编写的程度要与实际有联系,这就不能只依赖于课本,还要联系实际多多思考,重复调试,不断改进,才能编出一个符合实际的有价值的系统。
参考文献
[1]冯燕,陈越。
数据结构课程设计[M].第一版。
浙江大学出版社,2007
[2]李春葆,尹为民,李蓉蓉.数据结构教程上机指导。
第三版.清华大学出版社,2008
五、附录
#include”stdio.h"
#include"stdlib.h”
#include”string。
h”
#defineMAX2//车库容量
#defineprice0。
2//停车收费按分计
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*front;
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(”\n\n***************************欢迎使用停车场管理系统*******************************”);
printf(”\n1-—-——-—-车辆停车”);
printf(”\n2—-——---—车辆离开”);
printf("\n3-—-——---列表显示”);
printf("\n4—-—-—---退出系统\n");
printf("\n停车费用:
0。
2元/分”);
printf(”\n********************************************************************************");
printf("\n请选择您要服务的项目1—2-3—4:
”);
while
(1)
{scanf(”%d",&ch);
if(ch〉=1&&ch<=4)break;
elseprintf("\n请选择:
1-2—3—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->front=(QueueNode*)malloc(sizeof(QueueNode));
if(Q-〉front!
=NULL)
{Q—>front—>next=NULL;
Q—〉rear=Q->front;
return
(1);}
elsereturn(-1);}
voidDisplay(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("\n〉>离开时间为:
%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〉〉应交费用为:
%.1f元\n”,((B1—A1+24)%24*60+(B2—A2+60)%60)*price);
free(p);
}
intArrival(SeqStackCar*Enter,LinkQueueCar*W)//车辆到达
{CarNode*p;
QueueNode*t;
p=(CarNode*)malloc(sizeof(CarNode));
flushall();
printf("\n请输入车牌号:
”);
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>>车位已满,请在便道等待!
\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("请输入离开车的车位号/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)
{Temp-〉top++;
Enter—>stack[Enter—〉top]=Temp-〉stack[Temp->top];
Temp—〉stack[Temp—>top]=NULL;
Temp-〉top—-;}
Display(p,room);
//判断通道上是否有车及停车位是否已满
if((W->front!
=W->rear)&&Enter—>top〈MAX)
{q=W->front-〉next;
t=q—>data;
Enter—>top++;
printf(”>〉便道车牌号为%s的车进入%d号车位停车”,t-〉num,Enter-〉top);
printf(”\n请输入现在的时间/**:
**/”);
scanf("%d:
%d”,&(t—〉reach。
hour),&(t—〉reach.min));
W->front->next=q-〉next;
if(q==W—〉rear)
W—〉rear=W->front;
Enter—>stack[Enter—〉top]=t;
free(q);}
elseprintf(”>〉便车道里没有车\n");}
elseprintf(”>〉车位里没有车\n”);}
voidList1(SeqStackCar*S)
{inti;
if(S—>top〉0)
{
printf("\n>>车牌号车位停车时刻\n");
for(i=1;i<=S->top;i++)
{printf("%s”,S->stack[i]->num);
printf(”%d”,i);
printf(”%d:
%d\n”,S—>stack[i]->reach。
hour,S—>stack[i]-〉reach.min);
}}
elseprintf("\n>>车位里没有车”);}
voidList2(LinkQueueCar*W)
{QueueNode*p;
p=W-〉front->next;
if(W-〉front!
=W-〉rear)
{printf(”>〉等待车辆的车牌号为:
”);
while(p!
=NULL)
{puts(p—>data-〉num);
p=p-〉next;}}
elseprintf(”\n>〉便道里没有车\n");
}
voidList(SeqStackCarS,LinkQueueCarW)
{intflag=1,tag;
while(flag)
{printf(”\n\n请选择:
1-2—3:
");
printf("\n1.车位信息\n2。
便道信息\n3.返回主菜单\n”);
while
(1)
{scanf(”%d”,&tag);
if(tag〉=1||tag〈=3)break;
elseprintf("\n请选择:
1-2—3");
}
switch(tag)
{case1:
List1(&S);break;
case2:
List2(&W);break;
case3:
flag=0;break;
default:
break;}}}
相关运行结果如下