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