1、数 据 结 构 课 程 设 计停车场管理系统计算机与通信工程学院 2015 级数据结构课程设计实验报告第 1 页目 录一、课设目的 .2二、问题描述 .2三、基本要求 .2四、详细设计 .3(1)原理分析 .3(2)功能模块 .3(3)用户手册 .6(4)流程图 .6(5)测试用例 .7(6)测试目的 .7计算机与通信工程学院 2015 级数据结构课程设计实验报告第 2 页(7)测试要求 .7五、程序源码 .7六、测试结果 .13七、课设总结 .15八、参考文献 .15一、课设目的(1)了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;(2)初步掌握软件开发过程中的问题分析,系
2、统设计,程序编码,测试等基本方法和技能;(3)提高综合应用所学的理论知识和方法独立分析和解决问题的能力;计算机与通信工程学院 2015 级数据结构课程设计实验报告第 3 页(4)训练用系统的观点和软件开发和一般规范进行软件开发,培养软件工作者所应具有的 科学的工作方法和作风。二、问题描述设停车场内只有一个可停放 n 辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端) ,若车场内已停满 n 辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某
3、辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。三、基本要求以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,对每一组输入数据进行操作后的输出数据为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费) 。栈以顺序结构实现,队
4、列以链表实现。4、详细设计(1)原理分析:栈是一种只能在一段进行输入和输出操作的线性表,表尾称为栈顶,表头称为栈底。栈的主要特计算机与通信工程学院 2015 级数据结构课程设计实验报告第 4 页点是“后进先出” ,即后进栈的元素先处理,停车场的容量即为栈的存储空间。队列是限定仅能在表的一段进行插入,在表的另一端进行删除的线性表。队列中可以插入的一段称为队尾,可以删除的一端称为队首。队列的主要特点是“先进先出” 。停车场管理系统是充分利用数据结构中栈和队列的思想实现的,用到两个堆栈,一个用来模拟停车场,另一个为临时栈,存储为离开停车场的车辆让道的其他车辆;一个队列结构,存储便道的车辆信息。typ
5、edef struct/定义栈,表示停车场CarNode *base;/停车场的堆栈底CarNode *top;/停车场的堆栈顶int stacksize;/停车场的容量Park;typedef struct/定义队列,表示便道CarPtr front;/便道的队列的队头CarPtr rear;/便道的队列的队尾int length;Shortcut;(2)功能模块: 车辆到达:a、若栈不满,车辆进栈,停到停车场;b、若栈满,车辆入队,停到便道;计算机与通信工程学院 2015 级数据结构课程设计实验报告第 5 页Status Arrival(Park /对进站车辆的处理: printf(“请输
6、入车牌号:“); /记录车牌号,时间,并根据停车场 scanf(“%d“, /是否满来判断入栈还是入队列printf(“进场的时刻:“);scanf(“%d“,if(P.stacksizenumber;Push(P,m); /便道中的车开入停车场free(w);printf(“车牌号为%d 的车已由便道进入停车场n“,m.number);printf(“停车费为%d, 占用车位数为%dn“,money,P.stacksize);else printf(“停车场不存在牌号为%d 的车n“, number);return OK;计算机与通信工程学院 2015 级数据结构课程设计实验报告第 8 页(
7、3)用户手册: 输出菜单选项;请选择(A,D,E):如果选择 A,即车辆到达:若栈不满,车辆进栈,停到停车场;若栈满,车辆入队, 停到便道;如果选择 D,即车辆离开:计算时间及费用;如果队列不空且栈不满,队列上的车 出队入栈;如果选择 E,则退出程序。(4)流程图:主函数I n i t S t a c k ( P )I n i t S t a c k ( Q ) I n i t Q u e u e ( S )A r r i v a l ( P , S )L e a v e ( P , Q , S )图一、函数关系调用图计算机与通信工程学院 2015 级数据结构课程设计实验报告第 9 页开始主菜
8、单 D 离开 A 到达 E 结束栈是否满进栈 进队列 队列是否空队列中的车进栈计算费用回主菜单结束否是否是图二、操作流程图(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)测试要求:测试用
9、例要合理并足够,既要有正确用例,也要有错误用例,检验程序的正确性和健壮性。计算机与通信工程学院 2015 级数据结构课程设计实验报告第 10 页五、程序源码#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 2typedef int Status;/栈,模拟停车场typedef struct Car1 /定义一
10、个结构体来表示停车场中的车int number;/汽车车号int ar_time;/汽车到达时间CarNode;typedef struct/定义栈,表示停车场计算机与通信工程学院 2015 级数据结构课程设计实验报告第 11 页CarNode *base;/停车场的堆栈底CarNode *top;/停车场的堆栈顶int stacksize;/停车场的容量Park;typedef int Status;/队列,模拟便道typedef struct Car2/用另一个结构体来表示便道中停放的车int number;/汽车车号int ar_time;/汽车到达时间struct Car2 *next
11、;*CarPtr;typedef struct/定义队列,表示便道CarPtr front;/便道的队列的队头CarPtr rear;/便道的队列的队尾int length;Shortcut;Status InitStack(Park if(!P.base) exit(OVERFLOW);P.top=P.base;计算机与通信工程学院 2015 级数据结构课程设计实验报告第 12 页P.stacksize=0;return OK;Status Push(Park +P.stacksize;return OK;Status Pop(Park else e=*-P.top;-P.stacksize
12、;return OK;Status InitQueue(Shortcut /初始化便道if(!S.front|!S.rear) exit(OVERFLOW);计算机与通信工程学院 2015 级数据结构课程设计实验报告第 13 页S.front-next=NULL;S.length=0;return OK;Status EnQueue(Shortcut /车进入便道,队列的输入操作p=(CarPtr)malloc(sizeof(Car2);if(!p) exit(OVERFLOW);p-number=number;p-ar_time=ar_time;p-next=NULL;S.rear-next
13、=p;S.rear=p;+S.length;return OK;Status DeQueue(Shortcut else w = S.front-next;计算机与通信工程学院 2015 级数据结构课程设计实验报告第 14 页S.front-next=S.front-next-next;-S.length;return OK;Status Arrival(Park /对进站车辆的处理: printf(“请输入车牌号:“); /记录车牌号,时间,并根据停车场 scanf(“%d“, /是否满来判断入栈还是入队列printf(“进场的时刻:“);scanf(“%d“,if(P.stacksizen
14、umber;Push(P,m); /便道中的车开入停车场free(w);printf(“车牌号为%d 的车已由便道进入停车场n“,m.number);printf(“停车费为%d, 占用车位数为%dn“,money,P.stacksize);else printf(“停车场不存在牌号为%d 的车n“, number);return OK;计算机与通信工程学院 2015 级数据结构课程设计实验报告第 17 页int main() int m=1;char flag;/选项Park P,Q;Shortcut S;InitStack(P);InitStack(Q);InitQueue(S);whil
15、e(m) printf(“n 停车场管理程序 n“);printf(“n“);printf(“请选择(A,D,E): “);scanf(“%c“,switch(flag) caseA:casea: Arrival(P,S);break; /车进入停车场caseD:cased: Leave(P,Q,S);break; /车离开停车caseE:casee: m=0; break;计算机与通信工程学院 2015 级数据结构课程设计实验报告第 18 页default: printf(“Input error!n“);break; caseE:while (flag != n)scanf(“%c“,六、
16、测试结果计算机与通信工程学院 2015 级数据结构课程设计实验报告第 19 页七、课设总结计算机与通信工程学院 2015 级数据结构课程设计实验报告第 20 页通过这次课程设计,我充分理解了用栈和队列实现模拟停车场的基本原理,探究了栈的顺序存储结构和队列的链式存储结构的定义和算法描述,同时也学会了编写停车场问题的程序。虽然此次的程序比较简单,没有加入一些更完善的功能,但总体上来说比较完整,实现了基础功能。在实践的过程中,我了解到了自己的一些不足,因为很多书写错误导致花费大量的时间去纠正,对课本知识掌握的不是很熟练。经过长达几天的准备,提高了自己的动手能力和独立思考能力,加深了对知识的理解和记忆。编程是一项枯燥乏味的工作,但只要认真专研,我们会从中学到很多课本上学不到或课堂上无法掌握的东西,同时也能从中体会到编程的乐趣。通过与同学相互交流经验,取长补短,达到共同进步的学习效果。兴趣是可以培养的,只要坚持下去,面对困难总会找到解决的办法。八、参考文献1、 C 语言程序设计清华大学出版社;2、 数据结构 (严蔚敏版)清华大学出版社;3、上网查阅停车场管理系统的相关资料。