停车场管理系统说明书
中 北 大 学
课程设计说明书
学 院、系: 专 业: 班 级: 学 生 姓 名: 设 计 题 目:
软件学院 软件工程
学 号: 停车场管理系统
起 迄 日 期: 2016年12月16日~2016年12月29日 指 导 教 师:
日期: 2016年12月29日
一 设计目的
《数据结构》课程主要介绍最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。进行数据结构课程设计要达到以下目的:
了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
1. 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; 2. 提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
3. 训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
二 任务概述 2.1、问题描述
设有一个可以停放n 辆汽车的狭长停车场, 它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面) 。如果停车场已放满n 辆车, 则后来的车辆只能在停车场大门外的便道上等待, 一旦停车场内有车开走, 则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走, 在他之后进入停车场的车都必须先退出停车场为它让路, 待其开出停车场后, 这些车辆在依原来的次序进场。每辆车在离开停车场时, 都应依据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去, 允许其离去, 不收停车费, 并且仍然保持在便道上等待的车辆的次序。编制一程序模拟该停车场的管理。 2.2、目的
具有操作简单、使用方便、功能先进等特点,停车场使用者可以在最短的时间进入或离开停车场,从而提高停车场的管理水平,取得更高的经济效益和良好的社会效益。位于停车通道处等候车位的用户能快速找到车位。用户取车离开时能安全有序的离开。同时辅以智能化设备和完善的管理软件来简化人的劳动,实现停车场车辆进入、场内监控以及计费收费等全过程的完全无人化管理;另一方面通过网络化管理实现能够在一个相对广阔的地域内(例如一个城市)了解多个停车场情况,提前了解停车情况,最终实现“随意”停车。 2.3、系统(或用户) 特点
停车场管理系统利用现代科技技术管理车辆,提高了车辆管理的高效性、实用性、安全性、可靠性和车辆自动化管理的能力。有效的减少了人工的参与,从而最大限度的减少了人员费用以及由人员失误或人员舞弊造成的损失,大大提高整个停车场的经济性、安全性与使用效率。 2.4、基本要求
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据列:汽车“到达”或“离去”信息,汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:在停车场内停留的时间和应缴纳的费用(在便道上停留的时间不收费) 。栈以顺序结构实现,队列以链表结构实现。
3 模块划分
停车场管理系统
到达停车场离开停车场
停车况场存放情
退出管理系统
图3.1 停车场管理系统主菜单
车辆到达停车场
录入车辆信息
打印车辆信息
停车场已满,车辆停入便道
图3.2 车辆到达停车场
车辆正常驶入停车场
车辆离开停车场
输入离息开车辆信
计算费用并提示车辆取出
车辆正常驶出停车场
未在停车场内,车辆驶出便
道
图3.3 车辆离开停车场
图3.4 停车场车辆存放情况
4 主要函数说明及其N-S 图
Ⅰ. 主函数
(1) 主函数的主要流程。
1) 初始化栈和队列,定义变量和指针。 2) 根据用户的输入,调用相关的处理函数。 (2) 函数说明。
1) 函数原型:int main(); 2) 功能:主函数。 3) 返回值:有。 (3) 主函数N-S 图。
图4.1 主函数N-S 图
Ⅱ. 主菜单模块
(1) 主要流程
1) 输入3个菜单项(退出、车辆到达、车辆离开) 。 2) 循环等待用户输入菜单项。
3) 如果用户输入在0~2之间,返回菜单号。 (2) 功能:显示主菜单
Ⅲ. 车辆到达模块
主要流程。
1) 输入2个停放车辆的信息(车牌号、车辆到达时间) 。 2) 判断停车场是否已满。
3) 如果停车场未满,打印车辆的车牌号、存车时间、停车位置。
4) 如果停车场已满,车辆停放于便道,打印车辆的车牌号、存车时间、停车位置。
Ⅳ. 车辆离开模块
主要流程。
1) 输入2个驶离车辆的信息(车牌号、车辆驶离时间) 。 2) 判断停车场是否为空。
3) 如果停车场为空,提示用户停车场未停放车辆。
4) 如果停车场不为空,且不为满,根据车牌号查找车辆,如果存在,计算停车所用费
用,打印车辆信息,该车辆驶离停车场,让便道上的第一辆车辆驶入停车场;如果 不存在,提示用户车辆未在停车场停放。
5) 如果停车场已满,根据车牌号查找车辆,如果停车场内部不存在,继续在便道查询, 如果存在于便道上,直接驶离便道即可;如果存在于停车场内,计算停车所用费 用,打印车辆信息,该车辆驶离停车场,让便道上的第一辆车辆驶入停车场。
Ⅴ. 停车场车辆停放情况
主要流程。
1) 输入该命令所对应的选择(3)。 2) 打印停车场的车位的停放情况。
Ⅵ. 设计中用到的一些函数定义(栈、队列的定义) 。
①设定链式栈的抽象数据类型为: InitStack(&S)
操作结果:构造一个空栈S 。 DestroyStack(&S)
初始条件:栈S 已经存在。 操作结果:销毁栈S 。 ClearStack(&S)
初始条件:栈S 已经存在。 操作结果:将S 清空为空栈。 StackLength(&S)
初始条件:栈S 已经存在。 操作结果:返回栈S 的长度。 StackEmpty(&S)
初始条件:栈S 已经存在。
操作结果:若S 为空栈,则返回TURE ,否则返回FALSE 。 GetTop(S,&e)
初始条件:栈S 已经存在。
操作结果:若栈S 不空,则以e 返回栈顶元素。 Push(&S,e)
初始条件:栈S 已经存在。
操作结果:在栈S 的栈顶插入新的栈顶元素e 。 Pop(&S,&e)
初始条件:栈S 已经存在。
操作结果:删除S 的栈顶元素,并以e 返回其值。 StackTraverse(S,visit()) 初始条件:栈S 已经存在。
操作结果:从栈底到栈顶一次对S 中的每个元素调用函数visit()。 }ADT stack
②设定链式队列的抽象数据类型为: typedef struct Qnode{
QelemType data; Struct Qnode *next; }Qnode,*QueuePtr;
typedef struct{
QueuePtr front; QueuePtr teat; }
ADT Queue{
数据对象:D={ai |ai ∈ElemSet ,i=1,2,„,n ,n>=0} 数据关系:R1={/ai-1,a i ∈D ,i=2,„,n } 约定其中一端为队列头,一端为队列尾。 基本操作 InitQueue(&Q)
操作结果:构造一个空队列Q 。 DestroyQueue(&Q)
初始条件:队列Q 已经存在。
操作结果:队列Q 被销毁,不再存在。 ClearQueue(&Q)
初始条件:队列Q 已经存在。 操作结果:将Q 清空为空队列。 QueueLength(Q)
初始条件:队列Q 已经存在。
操作结果:返回Q 的元素个数,即队列的长度。 QueueEmpty(Q)
初始条件:队列Q 已经存在。
操作结果:若Q 为空队列,则返回TURE ,否则返回FALSE 。 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()失败,则操作失败。 }ADT Queue
Ⅶ. 总的程序设计流程图
图4.1 停车场管理系统流程图
5 程序运行数据及其结果
1. 主界面:四个选项(到达、离开、显示停车场信息和退出程序)
2. 选择数字1后,点击回车,界面会提示请输入车牌号和车辆进站时间。
然后点击回车,显示车辆停放信息,并再次显示主界面,然用户输入要选择的数字。
3. 输入多辆车辆的信息,然后通过主界面的第1个选项,如果车辆信息多于停车场的车辆位置,便提示
停车场已满,可以把车辆免费停放到便道上。
4. 在主界面上输入3,然后显示停车场里面停放的所有车辆信息,如果因车辆过多而停放于便道的车辆,
则不会显示。
5. 在主界面选择数字2后,界面会提示用户输入车辆的车牌号和车辆离开时间,如果车辆在停车场内,
系统会自动提示出车辆的信息,并计算出车辆应该缴纳的费用,并提示让便道上停放的第一辆车进入停车场。
如果起初就停放于便道上,则输入车辆的车牌号和车辆的离开时间后,界面会提示您的车辆停放于便道
上,本次停车免费。
6 课程设计心得
通过本次课程设计,发现了许多原来自己并不知道的问题,巩固了许多以前学过的知识以及新学了许多技能,总之,这次课程设计收获颇丰。
在本次课程设计刚刚开始时,由于设计的是一个综合性比较强的程序,所以显得有点不知所措,但在查找了部分资料和询问了周围的老师同学后,渐渐的对这个题目有了些许眉目,最终将题目分解成了一个个小模块,再通过这几周的努力,终于做出了这个不是特别完善的程序。
在这次课程设计中,遇到了很多问题,也犯了很多错误,尤其是在文件这方面,自己掌握的还是很不熟练,走了很多弯路。所以今后应该加强这方面的练习,争取能够熟练的运用这方面知识,不过再最后做出这个程序时,还是很有成就感的,相信自己以后肯定会对C 语言更加感兴趣,会更努力的去学习!
附录:
//停车场管理系统
#include
#include
#define OVERFLOW 0
#define ERROR 0
#define OK 1
#define STACKSIZE 2 //车库容量
//时间节点
typedef struct time{
int hour; int min;
}Time;
//车辆信息
typedef struct{
char CarNum; float time; int pos_a; //车在停车场中的位置 int pos_b; //车在便道上的位置 int flag;
}Car,Car2;
//车库信息 (顺序栈)
typedef struct{
Car *top; Car *base;
int stacksize;
}SqStack;
//初始化
int InitStack(SqStack &S){
}
//判空
int StackEmpty(SqStack S){
}
//判满
int StackFull(SqStack S){
}
//入栈
int Push(SqStack &S,Car e){
if(S.top-S.base==S.stacksize) return ERROR; *S.top++=e; if(S.top-S.base>=S.stacksize) return OK; else r eturn ERROR; if(S.top==S.base) return OK; else r eturn ERROR; S.base=new Car[STACKSIZE]; if(!S.base) exit(OVERFLOW); S.top=S.base; S.stacksize=STACKSIZE; return OK;
}
return OK;
//出栈
int Pop(SqStack &S,Car &e){
}
//遍历栈
int StackTraverse(SqStack S) {
Car *p=S.top; Car *q=S.base; int l=1; if(StackEmpty(S)){ f or(int j=1;j
p rintf("\t车牌: %d",car.CarNum);
p rintf("\t\t到达时间:%5.2f",car.time); p rintf("\t\t位置:%d",l++);
p rintf("\n");
q ++;
}
r eturn OK;
}
//备用车道 (顺序栈)
typedef struct {
Car2 *top2;
Car2 *base2; // int stacksize2;
}SqStack2;
//初始化
int InitStack2(SqStack2 &S2){
S2.base2=new Car2[STACKSIZE];
if(!S2.top2) exit(OVERFLOW); // S2.top2=S2.base2;
S2.stacksize2=STACKSIZE;
return OK;
}
//判空
int StackEmpty2(SqStack2 S2){
}
else return ERROR;
//进栈
int Push2(SqStack2 &S2,Car2 e2){
}
//出栈
int Pop2(SqStack2 &S2,Car2 &e2){
}
//车道信息(链队)
typedef struct QNode{
Car data; struct QNode *next; if(S2.top2==S2.base2) return ERROR; e2=*--S2.top2; return OK; if(S2.top2-S2.base2==STACKSIZE) return ERROR; *S2.top2++=e2; return OK;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front; QueuePtr rear;
}LinkQueue;
//初始化
int InitQueue(LinkQueue &Q){
}
//进队
int EnQueue(LinkQueue &Q,Car e){
}
//判空
int QueueEmpty(LinkQueue Q){
}
//出队
int DeQueue(LinkQueue &Q,Car &e){ if(Q.front==Q.rear) return OK; else return ERROR; QueuePtr p; p=new QNode; p->data=e; p->next=NULL; Q.rear->next=p; Q.rear=p; return OK; Q.front=Q.rear=new QNode; Q.front->next=NULL; return OK;
}
if(Q.front==Q.rear) return ERROR; p=Q.front->next; e=p->data; Q.front->next=p->next; delete p; return OK;
//主函数
int main(){
int i=1; int j=1; int status; float time,money; LinkQueue Q; Car car_I,car_D,car_M; SqStack S; SqStack2 S2;
InitStack(S);
printf("\t\t\t欢迎来到XXX 停车场!\n"); InitStack2(S2); InitQueue(Q); while(1){ p rintf("*****************************************************************\n"); p rintf("\t\t\t1--车辆到达停车场\n");
p rintf("\t\t\t3--停车场存放车辆情况\n"); p rintf("\t\t\t0--退出程序\n"); p rintf("*****************************************************************\n"); p rintf("选择(0-3):\n"); s canf("%d",&status) ; i f(status==1){ printf("\t请输入车牌号:"); scanf("%d",&car_I.CarNum); printf("\t请输入车到达的时间:"); scanf("%f",&car_I.time); if(!StackFull(S)){ Push(S,car_I); //车进入车库 car_I.pos_a=i; car_I.flag=1; i=i+1; for(int m=1;m
} for(int m=1;m
} e lse if(status==2){ //指令为 2, 开车离去(如果车在车库里收取
停车费;在便道上则免费)
printf("请输入客户的车牌号:"); scanf("%d",&car_D.CarNum); printf("请输入现在的时间:"); scanf("%f",&car_D.time); i=i-1; int flag=0; //判断车是否在便道上 if(StackFull(S)){ Car *p=S.top; Car *q=S.base; while(p!=q){ Car car=*(q); if(car.CarNum!=car_D.CarNum){ } q++; flag++; } //while if(flag>=STACKSIZE){ } printf("\n"); printf("\n"); printf("\n"); printf("您的车停在便道上,所以免费!!!");
else{ do{ //挡在前面的车给要出去的车让路 Pop(S,car_M); //加一个判断,判断是不是停车场里的车
if(car_D.CarNum!=car_M.CarNum){
Push2(S2,car_M);
}
else{
car_I.time=car_M.time;
}
}while(car_D.CarNum!=car_M.CarNum);
while(!StackEmpty2(S2)){
Pop2(S2,car_M);
Push(S,car_M);
}
while(!QueueEmpty(Q)&&!StackFull(S)){
if(!StackFull(S)){
DeQueue(Q,car_M); //
面的车的位置都得变。
car_M.flag=1;
}
//让路的车返回去 便道上的车离开后进入停车场,那么后
printf("车牌为%d的车离开车库,车道上车牌为%d的车进入车库
\n",car_D.CarNum,car_M.CarNum);
} e lse if(status==3) { //指令为 3 ;查看车库停车情况; } e lse if(status!=1&&status!=2&&status!=3&&status!=0){ StackTraverse(S); } printf("\n"); printf("\n"); printf("\n"); time=car_D.time-car_I.time; if(time0.0&&time
} } } else if(status==0) break;