1、数据结构课程设计报告题目 停车场管理系统程序班级 _姓名 _学号 _停车场管理系统1 问题描述设停车场是一个可停放 n 辆汽车的狭长通道,且只有一个门可供出入。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(门在最南端,最先到达的第一辆车停放在车场的最北端) ,若车场内已停满 n 辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆汽车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原顺序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。2 需求分析(1)根据车辆到达停车
2、场到车辆离开停车场时所停留的时间进行计时收费。(2)当有车辆从停车场离开时,等待的车辆按顺序进入停车场停放。实现停车场的调度功能。(3)用顺序栈来表示停车场,链队表示停车场外的便道。(4)显示停车场信息和便道信息。(5)程序执行的命令为: 车辆进入停车场 车辆离开停车场 显 1 2 3示停车场的信息。(以栈 S 作为停车场,栈 S1 作为让路的临时停车点,队列 Q 作为车等待时用的便道。stackMax+1作为车场能够容纳的车辆数,num10作为车所在位置的编号,并且限定车场最多能够容纳 10 辆车.(2).用户根据系统所规定并提示的要求输入有关内容,车场所能容纳的车辆数由收费人员来确定,车辆
3、离开时,车主还可以得到收据,便于收费的管理使用;并且系统程序所提供的一些信息可通过特殊硬件显示出来,供车主了解信息,准确有效的停车。(3).程序应该能够显示当前存车信息以及等待车的信息,便于管理人员对车辆进行管理,并且能够给等待的车提供一些信息,便于他们能够及时的停车。(4).程序执行的命令为:输入进站信息-输入出站信息-打印收据(5).改程序系简单的用于运用栈与队列基本知识的工具,不能用于现实中,特别是栈“先进后出”的规则大大限定了该程序的推广,现实世界的车站管理系统比这个远远复杂的多。二概要设计:1.设定栈的抽象数据类型定义为:ADT stack数据对象:D=ai|aicharset,i=
4、1,2,n,n=0数据关系:R1=|ai-1,aiD,i=2,n基本操作:InitStack( int min; Time; /*时间结点*/ 2.车辆进出站信息类型typedef struct node char num10;Time reach; Time leave; CarNode; /*车辆信息结点*/ 3.停车场和便道信息类型typedef struct NODE CarNode *stackMax+1;int top; SeqStackCar; /*模拟车站*/typedef struct car CarNode *data;struct car *next; QueueNode
5、; typedef struct Node QueueNode *head; QueueNode *rear; LinkQueueCar; /*模拟通道*/ void InitStack(SeqStackCar *,int n); /*声明栈*/初始化,创建两个新栈 S,S1int InitQueue(LinkQueueCar *); /*声明便道*/初始化,创建一个队列 Q 用于便道int Arrival(SeqStackCar *,LinkQueueCar *,int n); /*车辆进站*/void Leave(SeqStackCar *,SeqStackCar *,LinkQueueC
6、ar *,int n); /*车辆出站*/void List(SeqStackCar,LinkQueueCar); /*显示存车信息*/ void InitStack(SeqStackCar *s,int n) /*初始化栈*/4.主函数和其它函数的伪码算法void main()/主程序initialization(); /初始化while(1)scanf(.);/根据提示信息输入想要的操作switch(k)/根据输入的数调用不同的函数case 1:case 2:typedef struct */用于创建不同结构体类型的指针与变量void PRINT(CarNode *p)/调用输出函数Lea
7、ve(*p,n).根据求解时间值来求得费用,并通过收据打印出来5.主要函数思想本程序是个简单的栈与队列的应用程序,其所用的函数也是栈与队列的基本函数, 但在编写函数时应特别注意它的面向对象性与窗口化设计,切身为使用者着想. 所以在运用一些函数时调用的基本语句有太多的重复,其目的在于实现它本来的基本目的.四调试分析:1. 本次作业比较简单,只是栈与队列的复习应用,所以总的调试比较顺利,只是在调用栈与队列的函数时遇到一些问题,比如我想通过键盘输入来确定停车场的停车数,所以初始化时那些操作函数必须带有停车数这个参数。2. 在定义栈的元素最大空间时如果使用顺序栈必须先给它赋初值,但如果通过链表就可以实
8、现动态分配内存,为栈动态开辟新空间。3. 在判断键盘输入是否符合要求时,如果不符合要求应循环赋值,直到符合要求为止,在此利用的 do-while 循环语句与外部 while 语句套用时应使用两次 break 语句,才能跳出循环,否则会造成死循环。4. 经验体会:通过 DEBUG 调试器和数据观察窗口,可以加快找到程序中的疵点。五软件使用说明书:本系统为存车信息管理软件,能实现车场存车及便道存车信息的输入,输出,查找等功能,并建立和更新的存车费用信息保存于文件输出或打印。对于查找等功能能够按存车位置及车牌号分别进行。每辆车的相关信息包括:车牌号,进站时间,出站时间,存车位置,停车费用等。本系统功
9、能还需完善,操作简单,只是供学习之用,并不能作为实际生活使用。下面介绍了此软件的使用说明:1.停车场.exe;2.进入演示系统后首先是一个用户及管理员使用注意事项界面,进入后会出现菜单选项。1.车辆进站 2.车辆出站 3.存车信息 4.离开系统请选择: 1|2|3|4.这时可按照提示进行你想要的操作。3.对于 14 的具体操作与内容请详见前面的调试分析,您便可以轻松操作了!六总结:经过这次课程设计,通过对程序的编制,调试和运行,使我更好的掌握了栈和队列基本性质和有关它们之间关系使用问题的解决方法,熟悉了各种调用的数据类型,在调试和运行过程中使我更加的了解和熟悉程序运行的环境,提高了我对程序调试
10、分析的能力和对错误的纠正能力。这次数据结构的程序设计,对于我来说是一个挑战。我对数据结构的学习在程序的设计中也有所体现。课程设计是培养学生综合运用所学知识、发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握计算机开发技术是十分重要的。七附录所用到的库函数:Stdio.h /*标准输入/输出头文件*/String.h /*包含字符串处理函数头文件*/Stdlib.h /*包含动态存储与释放函数头文件*/Malloc.h /*包含内存分配头文件*/该
11、停车场管理系统的主要程序如下:/*停车场管理系统*/#include#include #include#include/*-*/ #define Max 10int getn()int n;printf(“欢迎您光临顺风停车场,“);printf(“本停车场管理实行 24 小时制,停车每分钟 0.1 元.n“);printf(“请输入停车场可容纳的车(最多 10 辆):“);scanf(“%d“,fflush(stdin);doif(n10)printf(“输入的车辆数不在要求范围内,请重新输入!“);scanf(“%d“,fflush(stdin);else break;while(n10)
12、;return n;typedef struct time int hour; int min; Time; /*时间结点*/ typedef struct node char num10;Time reach; Time leave; CarNode; /*车辆信息结点*/ typedef struct NODE CarNode *stackMax+1;int top; SeqStackCar; /*模拟车站*/typedef struct car CarNode *data;struct car *next; QueueNode; typedef struct Node QueueNode
13、 *head; QueueNode *rear; LinkQueueCar; /*模拟通道*/ void InitStack(SeqStackCar *,int n); /*声明栈*/int InitQueue(LinkQueueCar *); /*声明便道*/int Arrival(SeqStackCar *,LinkQueueCar *,int n); /*车辆进站*/void Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *,int n); /*车辆出站*/void List(SeqStackCar,LinkQueueCar); /*显示存
14、车信息*/ void InitStack(SeqStackCar *s,int n) /*初始化栈*/ int i; s-top=0; for(i=0;istacks-top=NULL; int InitQueue(LinkQueueCar *Q) /*初始化便道*/ Q-head=(QueueNode *)malloc(sizeof(QueueNode); if(Q-head!=NULL) Q-head-next=NULL; Q-rear=Q-head; return(1); else return(-1); void PRINT(CarNode *p) /*打印出站车的信息*/ int A
15、1,A2,B1,B2;int a,b,c; printf(“n 请输入离开的时间:/*:*/“); scanf(“%d:%d“,fflush(stdin);doif(p-leave.hourreach.hour | (p-leave.hour=p-reach.hour scanf(“%d:%d“,fflush(stdin);if(p-leave.hourleave.hour=24 | p-leave.minleave.min=60)printf(“输入的时间格式有错,请重新输入!“);scanf(“%d:%d“,fflush(stdin);else break;while(p-leave.ho
16、urreach.hour | (p-leave.hour=p-reach.hour printf(“车场现在有一辆车离开,请便道里的第一辆车进入车场!n“);printf(“出站的车的车牌号为:“);puts(p-num);printf(“n“);A1=p-reach.hour; A2=p-reach.min; B1=p-leave.hour; B2=p-leave.min;a=(B1-A1)*60+B2-A2;if(a=60)b=a/60;c=a-60*b;elseb=0;c=a;printf(“ 祝您一路顺风,欢迎您下次光临.“);printf(“n 收 据n“);printf(“= 车牌
17、号: “);puts(p-num);printf(“n“);printf(“=n“);printf(“|进车场时刻 | 出车场时刻 | 停留时间 | 应付(元)|n“);printf(“=n“);printf(“| %d:%d“,p-reach.hour,p-reach.min);printf(“ | %d:%d“,p-leave.hour,p-leave.min);printf(“ | %d:%d“,b,c);printf(“ | %2.1f“,0.1*a);printf(“ |n“);printf(“-n“);free(p); int Arrival(SeqStackCar *Enter,
18、LinkQueueCar *W,int n) /*车辆到达*/ CarNode *p; QueueNode *t; int a,b;p=(CarNode *)malloc(sizeof(CarNode); flushall(); printf(“n 请输入车牌号(七位,例:陕 A1234):n“);printf(“请严格按照要求输入车牌号,否则系统会出错!n“);doa=strlen(“陕 A1234“);b=strlen(gets(p-num);fflush(stdin);if(a!=b)printf(“输入车牌号格式错误,请重新输入(七位)!n“);gets(p-num);fflush(s
19、tdin);else break;if(a!=b)printf(“输入车牌号格式错误,请重新输入(七位)!n“);while(a!=b);if(Enter-toptop+; printf(“n 车辆在车场第%d 位置.“,Enter-top); fflush(stdin);printf(“n 请输入到达时间:/*:*/“); scanf(“%d:%d“,fflush(stdin);doif(p-reach.hourreach.hour=24 | p-reach.minreach.min=60)printf(“输入的时间格式有错,请重新输入!“);scanf(“%d:%d“,fflush(std
20、in);elsebreak;while(p-reach.hourreach.hour=24 | p-reach.minreach.min=60);Enter-stackEnter-top=p; return(1); else /*车场已满,车进便道*/ printf(“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,L
21、inkQueueCar *W,int n) /*车辆离开*/ int i, room; CarNode *p,*t; QueueNode *q; /*判断车场内是否有车*/ if(Enter-top0) /*有车*/ while(1) /*输入离开车辆的信息*/ printf(“n 请输入要离开的车在车场的位置/1-%d/:“,Enter-top);scanf(“%d“,fflush(stdin); if(room=1 while(Enter-toproom) /*车辆离开*/ Temp-top+; Temp-stackTemp-top=Enter-stackEnter-top; Enter-
22、stackEnter-top=NULL; Enter-top-; p=Enter-stackEnter-top; Enter-stackEnter-top=NULL; Enter-top-; while(Temp-top=1) Enter-top+; Enter-stackEnter-top=Temp-stackTemp-top; Temp-stackTemp-top=NULL; Temp-top-; PRINT(p);/*判断通道上是否有车及车站是否已满*/ if(W-head!=W-rear) t=q-data; Enter-top+; printf(“n 现在请便道上的车进入车场.该车的
23、车牌号为:“);puts(t-num);printf(“n 该车进入车场第%d 位置.“,Enter-top);printf(“n 请输入现在的时间(即该车进站的时间)/*:*/:“);scanf(“%d:%d“,fflush(stdin); doif(t-reach.hourreach.hour=24 | t-reach.minreach.min=60)printf(“输入的时间格式有错,请重新输入!“);scanf(“%d:%d“,fflush(stdin);elsebreak;while(t-reach.hourreach.hour=24 | t-reach.minreach.min=6
24、0);W-head-next=q-next; if(q=W-rear) W-rear=W-head; Enter-stackEnter-top=t; free(q); else printf(“n 目前便道里没有车.n“); else printf(“n 目前车场里没有车,来车请直接进入车场!“); /* 没车*/ void List1(SeqStackCar *S) /*列表显示车场存车信息*/ int i; if(S-top0) /*判断车站内是否有车*/ printf(“n 车场:“); printf(“n 位置 到达时间 车牌号n“); for(i=1;itop;i+) printf(
25、“ %d “,i); printf(“%d:%d “,S-stacki-reach.hour,S-stacki-reach.min); puts(S-stacki-num); else printf(“n 目前车场里没有车“); void List2(LinkQueueCar *W) /*列表显示便道信息*/ QueueNode *p; p=W-head-next; if(W-head!=W-rear) /*判断通道上是否有车*/ printf(“n 目前正在等待车辆的号码为:“);while(p!=NULL) puts(p-data-num); p=p-next; printf(“n“);
26、else printf(“n 目前便道里没有车.“); void List(SeqStackCar S,LinkQueueCar W) int flag,tag; flag=1; while(flag) printf(“n1.车场n2.便道n3.返回n“); while(1) printf(“n 请选择 1|2|3:“); scanf(“%d“,fflush(stdin);doif(tag3)printf(“输入有误,请按要求重新输入!“);scanf(“%d“,fflush(stdin);elsebreak;while(tag3 break;switch(ch) case 1:Arrival
27、(break; /*车辆进站*/case 2:Leave(break; /*车辆出站 */case 3:List(Enter,Wait);break; /*存车信息*/case 4:exit(0); /*退出系统*/default:break; 6 课程设计总结通过这次课程设计使我充分的理解了用栈和队列实现模拟停车场的基本原理,知道了栈的顺序存储结构和队列的链式存储结构的定义和算法描述,同时也学会了编写停车场问题的程序。虽然此次的程序不是很完备,没有加入一些更完善的功能,但是总体还是一个比较能体现数据结构知识点能力的程序了,当然只是相对于我这个初学者来说。在刚开始编程的时候,我感到有点无从下手
28、,但经过对题目的详细分析和思考之后,我就知道具体应该做什么,怎么做了。经过几天和同组同学的一起研究,我们分工完成了这个程序,完成这个程序,我学到了很多东西,这是在课堂上无法做到的。在此我非常要感谢的是我的指导老师老师,感谢老师的细心认真的辅导,让我对数据结构这门课程掌握得更好,懂得更多,她教我怎么分析问题,应该要注意些什么,最后还指出我存在的问题。参考文献1 黄同成,黄俊民,董建寅数据结构M 北京:中国电力出版社, 20082 董建寅,黄俊民,黄同成数据结构实验指导与题解M 北京:中国电力出版社,20083 严蔚敏,吴伟民. 数据结构(C 语言版)M. 北京:清华大学出版社,20024 刘振鹏,张晓莉,郝杰数据结构M 北京:中国铁道出版社, 2003