文档库 最新最全的文档下载
当前位置:文档库 › 停车场管理系统数据结构课设报告

停车场管理系统数据结构课设报告

停车场管理系统数据结构课设报告
停车场管理系统数据结构课设报告

. ..

数据结构课程设计

停车场管理系统

目录

一、课设目的 (2)

二、问题描述 (2)

三、基本要求 (2)

四、详细设计 (2)

(1)原理分析 (2)

(2)功能模块 (3)

(3)用户手册 (5)

(4)流程图 (6)

(5)测试用例 (7)

(6)测试目的 (7)

(7)测试要求 (7)

五、程序源码 (7)

六、测试结果 (13)

七、课设总结 (14)

八、参考文献 (15)

一、课设目的

(1)了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;

(2)初步掌握软件开发过程中的问题分析,系统设计,程序编码,测试等基本方法和技能;

(3)提高综合应用所学的理论知识和方法独立分析和解决问题的能力;

(4)训练用系统的观点和软件开发和一般规进行软件开发,培养软件工作者所应具有的科学的工作方法和作风。

二、问题描述

设停车场只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。

三、基本要求

以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照及到达或离去的时刻,对每一组输入数据进行操作后的输出数据为:

若是车辆到达,则输出汽车在停车场或便道上的停车位置;

若是车离去,则输出汽车在停车场停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表实现。

四、详细设计

(1)原理分析:

栈是一种只能在一段进行输入和输出操作的线性表,表尾称为栈顶,表头称为栈底。栈的主要特点是“后进先出”,即后进栈的元素先处理,停车场的容量即为栈的存储空间。

队列是限定仅能在表的一段进行插入,在表的另一端进行删除的线性表。队列中可以插入的一段称为

队尾,可以删除的一端称为队首。队列的主要特点是“先进先出”。

停车场管理系统是充分利用数据结构中栈和队列的思想实现的,用到两个堆栈,一个用来模拟停车场,另一个为临时栈,存储为离开停车场的车辆让道的其他车辆;一个队列结构,存储便道的车辆信息。

typedef struct{//定义栈,表示停车场

CarNode *base;//停车场的堆栈底

CarNode *top;//停车场的堆栈顶

int stacksize;//停车场的容量

}Park;

typedef struct{//定义队列,表示便道

CarPtr front;//便道的队列的队头

CarPtr rear;//便道的队列的队尾

int length;

}Shortcut;

(2)功能模块:

车辆到达:a、若栈不满,车辆进栈,停到停车场;

b、若栈满,车辆入队,停到便道;

Status Arrival(Park &P,Shortcut &S)

{int number,ar_time; //对进站车辆的处理:

printf("请输入车牌号:"); //记录车牌号,时间,并根据停车场

scanf("%d",&number); //是否满来判断入栈还是入队列

printf("进场的时刻:");

scanf("%d",&ar_time);

if(P.stacksize

{ CarNode c;

c.number=number;

c.ar_time=ar_time;

Push(P,c);

printf("该车应停在第%d号车道.\n",P.stacksize);

}

else

{

EnQueue(S,number,ar_time);

printf("停车场已满,请暂时停在便道的第%d个位置.\n",S.length);

}

return OK;

}

车辆离开:如果队列不空且栈不满,队列上的车出队入栈。

Status Leave(Park &P,Park &P1,Shortcut &S)

{ int number,le_time,flag=1,money,ar_time; //对离站车辆的处理:printf("请输入车牌号:"); // 记录车牌号,时间,停车费用scanf("%d",&number);

printf("出场的时刻:");

scanf("%d",&le_time);

CarNode e,m;

CarPtr w;

while(P.stacksize)

{ Pop(P,e);

if(e.number==number)

{ flag=0;

money=(le_time-e.ar_time)*PRICE;

ar_time=e.ar_time;

break;

}

Push(P1,e); //后面的车开出停车场让路,进入备用栈

}

while(P1.stacksize)

{

Pop(P1,e);

Push(P,e); //备用栈中的车开入停车场

}

if (flag == 0)

{

if(S.length!=0)

{

DeQueue(S,w);

m.ar_time=le_time;

m.number=w->number;

Push(P,m); //便道中的车开入停车场

free(w);

printf("车牌号为%d的车已由便道进入停车场\n",m.number);

}

printf("停车费为%d, 占用车位数为%d\n",money,P.stacksize);

}

else

{ printf("停车场不存在牌号为%d的车\n", number);

}

return OK;

}

(3)用户手册: ①输出菜单选项;请选择(A,D,E):

②如果选择A,即车辆到达:若栈不满,车辆进栈,停到停车场;若栈满,车辆入队,

停到便道;

③如果选择D,即车辆离开:计算时间及费用;如果队列不空且栈不满,队列上的车

出队入栈;

④如果选择E,则退出程序。

(4)流程图:

图一、函数关系调用图

图二、操作流程图

(5)测试用例:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3,20),(‘A’,4,25),(‘A’,5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。每一组输入数据包括三个数据项:

汽车“到达”或“离去”信息、汽车牌照及到达或离去的时刻,其中,‘A’表示到达,

‘D’表示离去,‘E’表示输入结束。

(6)测试目的:测试菜单显示方法,到达方法和离开方法能否正确完成,时间和费用计算是否正确。

(7)测试要求:测试用例要合理并足够,既要有正确用例,也要有错误用例,检验程序的正确性和健壮性。

五、程序源码

#include

#include

#include

#define OK 1 //函数返回状态代码,宏定义

#define ERROR 0

#define TRUE 1

#define FALSE 0

#define INFEASIBLE -1

#define OVERFLOW -2

#define SIZE 2 //停车场位置数

#define PRICE 2

typedef int Status;

//栈,模拟停车场

typedef struct Car1{ //定义一个结构体来表示停车场中的车

int number;//汽车车号

int ar_time;//汽车到达时间

}CarNode;

typedef struct{//定义栈,表示停车场

CarNode *base;//停车场的堆栈底

CarNode *top;//停车场的堆栈顶

int stacksize;//停车场的容量

}Park;

typedef int Status;

//队列,模拟便道

typedef struct Car2{//用另一个结构体来表示便道中停放的车

int number;//汽车车号

int ar_time;//汽车到达时间

struct Car2 *next;

}*CarPtr;

typedef struct{//定义队列,表示便道

CarPtr front;//便道的队列的队头

CarPtr rear;//便道的队列的队尾

int length;

}Shortcut;

Status InitStack(Park &P)

{ //初始化停车场P.base=(CarNode*)malloc(SIZE*sizeof(Car1));

if(!P.base) exit(OVERFLOW);

P.top=P.base;

P.stacksize=0;

return OK;

}

Status Push(Park &P,CarNode e)

{ //车进入停车场,栈的输入操作*P.top++=e;

++P.stacksize;

return OK;

}

Status Pop(Park &P,CarNode &e)

{ if(P.top==P.base) //车离开停车场,栈的输出操作

printf("停车场为空.");

else

{ e=*--P.top;

--P.stacksize;

}

return OK;

}

Status InitQueue(Shortcut &S)

{ S.front=S.rear=(CarPtr)malloc(sizeof(Car2)); //初始化便道if(!S.front||!S.rear) exit(OVERFLOW);

S.front->next=NULL;

S.length=0;

return OK;

}

Status EnQueue(Shortcut &S,int number,int ar_time)

{ CarPtr p; //车进入便道,队列的输入操作p=(CarPtr)malloc(sizeof(Car2));

if(!p) exit(OVERFLOW);

p->number=number;

p->ar_time=ar_time;

p->next=NULL;

S.rear->next=p;

S.rear=p;

++S.length;

return OK;

}

Status DeQueue(Shortcut &S,CarPtr &w)

{ if(S.length == 0) //车离开便道,队列的输出操作printf("通道为空.");

else

{ w = S.front->next;

S.front->next=S.front->next->next;

--S.length;

}

return OK;

}

Status Arrival(Park &P,Shortcut &S)

{int number,ar_time; //对进站车辆的处理:

printf("请输入车牌号:"); //记录车牌号,时间,并根据停车场scanf("%d",&number); //是否满来判断入栈还是入队列printf("进场的时刻:");

scanf("%d",&ar_time);

if(P.stacksize

{ CarNode c;

c.number=number;

c.ar_time=ar_time;

Push(P,c);

printf("该车应停在第%d号车道.\n",P.stacksize);

}

else

{EnQueue(S,number,ar_time);

printf("停车场已满,请暂时停在便道的第%d个位置.\n",S.length);

}

return OK;

}

Status Leave(Park &P,Park &P1,Shortcut &S)

{ int number,le_time,flag=1,money,ar_time; //对离站车辆的处理:printf("请输入车牌号:"); // 记录车牌号,时间,停车费用scanf("%d",&number);

printf("出场的时刻:");

scanf("%d",&le_time);

CarNode e,m;

CarPtr w;

while(P.stacksize)

{ Pop(P,e);

if(e.number==number)

{ flag=0;

money=(le_time-e.ar_time)*PRICE;

ar_time=e.ar_time;

break;

}

Push(P1,e); //后面的车开出停车场让路,进入备用栈}

while(P1.stacksize)

{

Pop(P1,e);

Push(P,e); //备用栈中的车开入停车场

}

if (flag == 0)

{ if(S.length!=0)

{

DeQueue(S,w);

m.ar_time=le_time;

m.number=w->number;

Push(P,m); //便道中的车开入停车场

free(w);

printf("车牌号为%d的车已由便道进入停车场\n",m.number);

}

printf("停车费为%d, 占用车位数为%d\n",money,P.stacksize);

}

{ printf("停车场不存在牌号为%d的车\n", number); }

return OK;

}

int main()

{ int m=1;

char flag;//选项

Park P,Q;

Shortcut S;

InitStack(P);

InitStack(Q);

InitQueue(S);

while(m)

{ printf("\n 停车场管理程序\n");

printf("\n");

printf("请选择(A,D,E): ");

scanf("%c",&flag);

switch(flag)

{ case'A':

case'a': Arrival(P,S);break; //车进入停车场

case'D':

case'd': Leave(P,Q,S);break; //车离开停车

case'E':

case'e': m=0; break;

default: printf("Input error!\n");break;

}case'E':

while (flag != '\n')

scanf("%c",&flag);

}

六、测试结果

七、课设总结

通过这次课程设计,我充分理解了用栈和队列实现模拟停车场的基本原理,探究了栈的顺序存储结构和队列的链式存储结构的定义和算法描述,同时也学会了编写停车场问题的程序。虽然此次的程序比较简单,没有加入一些更完善的功能,但总体上来说比较完整,实现了基础功能。

在实践的过程中,我了解到了自己的一些不足,因为很多书写错误导致花费大量的时间去纠正,对课本

知识掌握的不是很熟练。经过长达几天的准备,提高了自己的动手能力和独立思考能力,加深了对知识的理解和记忆。

编程是一项枯燥乏味的工作,但只要认真专研,我们会从中学到很多课本上学不到或课堂上无法掌握的东西,同时也能从中体会到编程的乐趣。通过与同学相互交流经验,取长补短,达到共同进步的学习效果。兴趣是可以培养的,只要坚持下去,面对困难总会找到解决的办法。

八、参考文献

1、《C语言程序设计》清华大学出版社;

2、《数据结构》(严蔚敏版)清华大学出版社;

3、上网查阅停车场管理系统的相关资料。

相关文档