1、 目 录1 实习目的 .12 问题描述 .13.1 设计基本要求 .13.2 停车场管理系统的主要功能 .24 概要设计 .24.1 设计思想 24.2 函数及功能要求 25 详细设计 .35.1 数据结构的设计 .35.2 算法的设计思想及流程图 .45.2.1 主要函数的功能说明 45.2.2 停车场管理系统流程图 55.2.3 主要模块算法描述 66 测试分析 .66.1 测试用例 .66.1.1 第一组测试用例 66.1.2 第二组测试用例 86.1.3 第三组测试用例 96.2 测试结果分析 107 使用说明 118 总结 12参考文献 14附录 15德州学院 2012 级 信息管理
2、学院 计算机科学与技术 数据结构课程设计1停车场管理系统1 实习目的通过本次课程设计,了解并初步掌握设计、实现系统的完整过程,包括系统分析、编码设计、以及调试分析,熟练掌握数据结构的选择、设计、实现以及操作方法,为进一步的应用开发打好基础。2 问题描述停车场是一条可以停放 n 辆车的狭窄通道,且只有一个大门。汽车停放安到达时间的先后依次由北向南排列(大门在最南端,最先到达的第一辆车停在最北端)若停车场已经停满 n 辆车,后来的汽车在便道上等候,一旦有车开走,排在便道上的第一辆车可以开入;当停车场的某辆车要离开时,停在他后面的车要先后退为他让路,等它开出后其他车在按照原次序开入车场,每两停在车场
3、的车要安时间长短缴费。3 需求分析停车场是一条可以停放 n 辆车的狭窄通道,且只有一个大门。汽车停放按到达时间的先后排列。若停车场已经停满 n 辆车,后来的汽车在便道上等候。一旦有车开走,排在便道上的第一辆车可以开入;当停车场的某辆车要离开时,停在他后面的车要先后退为他让路。等它开出后,其他车再按照原次序开入车场,每辆停在车场的车要按时间长短缴费。3.1 设计基本要求(1) 以栈模拟停车场,以队列模拟车场外的便道,按照从终端输入的数据序列进行模拟管理。每一组数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码、以及到达或离去的时刻。对每一组数据进行操作后的信息为:若是车辆到达,则输出汽
4、车在停车场的内或便道上的位置:若是车辆离去则输出汽车在停车场内的停留时间和应缴纳的费用(在便道上的停留时间不收费)。栈以顺序结构实现,队列以链表结构实现。(2) 友好性:界面要友好,输入有提示,尽量展示人性化。(3) 可读性:源程序代码清晰、有层次,必要时给出注释。(4) 健壮性:用户输入非法数据时,系统要及时给出警告信息。(5) 测试数据:要求使用全部合法数据、整体非法数据、局部非法数据进行程序测德州学院 2012 级 信息管理学院 计算机科学与技术 数据结构课程设计2试,以保证程序的稳定。测试数据及测试结果请在上交的资料中写明。德州学院 2012 级 信息管理学院 计算机科学与技术 数据结
5、构课程设计33.2 停车场管理系统的主要功能(1) 根据车辆到达停车场到车辆离开停车场时所停留的时间进行计时收费。(2) 该程序设计能够通过车牌号查到该车辆在停车场或便道中的位置。(3) 当有车辆从停车场离开时,等待的车辆按顺序进入停车场停放。实现停车场的调度功能。该程序设计可以完整的模拟停车场的管理过程。4 概要设计4.1 数据库设计(1)栈的抽象数据类型定义AST Stack 数据对象:D=ai|aiElemSet,i=1,2,.,n, n0数据关系:R1=|ai-1,aiD,i=2,.,n约定 an 端为栈顶,a1 端为栈底。基本操作:InitStack(int InitQueue(Li
6、nkQueueCar *Q);option();int Arrival(SeqStackCar *Enter,LinkQueueCar *W);void Leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W);void PRINT(CarNode *p);void List(SeqStackCar S,LinkQueueCar W);void List1(SeqStackCar *S);void List2(LinkQueueCar *W);5 详细设计5.1 数据结构的设计程序中使用了一个类,五个结构体,两个栈(模拟停车场,其中
7、一个为临时栈) ,一个队列(模拟便道)。(1)车辆信息的表示车辆可看成是一个节点,设计成一个结构体,车辆信息包括:车牌号码,车辆的进站时间和离开停车场的时间,定义如下:typedef struct nodechar num10; /车牌号码 Time reach; /到站时间Time leave; /离开时间CarNode;(2)时间、栈和队列的定义德州学院 2012 级 信息管理学院 计算机科学与技术 数据结构课程设计6时间是由小时和分钟表示的,有两部分数据,设计两个变量分别存储小时和分钟,定义如下:typedef struct timeint hour; int min;Time;停车场内
8、用栈表示:typedef struct NODECarNode *stackMAX+1; /栈用顺序表示 int top;SeqStackCar;SeqStackCar Enter,Temp; InitStack( / 便道上的车用链表表示 struct car *next;QueueNode;typedef struct NodeQueueNode *head;/设置头指针、尾指针 QueueNode *rear;LinkQueueCar;5.2 算法的设计思想及流程图5.2.1 主要函数的功能说明(1)void InitStack(SeqStackCar *);/车辆节点进栈。即当栈未满时
9、,就把到达的车辆进栈。(2)int InitQueue(LinkQueueCar *);/车辆节点进队列。即当栈已满时,车辆就进入便道上的队列中(3)int Arrival(SeqStackCar *,LinkQueueCar *);/车辆到达登记。即车辆到达时,先登记车辆车牌号码。然后再判断停车场有没有停满,没停满就进栈,停满了就停在便道上,即进队列。(4)void Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *);/车辆离开处德州学院 2012 级 信息管理学院 计算机科学与技术 数据结构课程设计7理。即通过输入离开车辆的位置处理,然后调用
10、 PRINT(CarNode *p,int room);函数进行收费。然后再判断便道上有没有车,如果有,就把便道上的车进停车场内。(5)void List(SeqStackCar,LinkQueueCar);/显示车场内和便道上的车辆情况。利用 switch();函数选择显示车场内或是便道上的车辆情况,包括对下面两个子函数的调用: void List1(SeqStackCar *S);void List2(LinkQueueCar *W);/分别用来显示车场和便道上的车辆情况(6)void PRINT(CarNode *p,int room);/车辆离开时的收费。即这个函数由车辆离开的函数调用
11、,以分钟计时算费,但只能计算当天之内的费用,如果第二天的话会导致计费为负或减少。即只能当天停,当天开走。5.2.2 停车场管理系统流程图经过对车辆的进出分析以及对该系统的详细设计,绘制停车场管理系统流程图德州学院 2012 级 信息管理学院 计算机科学与技术 数据结构课程设计8图 1 停车场管理系统流程图德州学院 2012 级 信息管理学院 计算机科学与技术 数据结构课程设计95.2.3 主要模块算法描述本程序最主要的算法就是车辆到达登记的和车辆离开时的登记。(1)车辆到达:int Arrival(SeqStackCar *Enter,LinkQueueCar *W)/首先定义一个栈和队列的结
12、构体指针为:*p , *t 。然后申请一个车辆信息的内存空间,并把它赋给栈指针。车辆到达时就输入车牌号,并通过 if(Enter-toptop0) 确保栈不空,然后用个 while(1) 确保输入的车辆离开位置的合法性。如果不合法,显示输入有误,要重新输入。通过while(Enter-toproom) 判断离开车辆的位置,如果是中间位置,就要再用一个临时栈放置前面临时开出来的车,等要开出的车开出后,再把临时栈内的车开进停车场内,并调用 PRINT(p,room);这个函数计算显示费用。然后还要用 if(W-head!=W-rear)int min;Time;/定义车辆信息结构体typedef
13、struct node char num10;Time reach;Time leave;CarNode;typedef struct NODECarNode *stackMAX+1;int top;SeqStackCar;/模拟停车场德州学院 2012 级 信息管理学院 计算机科学与技术 数据结构课程设计18typedef struct carCarNode *data;struct car *next;QueueNode;typedef struct NodeQueueNode *head;QueueNode *rear;LinkQueueCar;/模拟便道/方法声明void InitSt
14、ack(SeqStackCar *);/初始化栈 int InitQueue(LinkQueueCar *);/初始化便道int Arrival(SeqStackCar *,LinkQueueCar *); /车辆到达 void Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *);/车辆离开void PRINT(CarNode *p,int room);/车辆收费void List1(SeqStackCar *S);/显示车场里的车辆情况 void List2(LinkQueueCar *W);/显示便道上的车辆情况void List(SeqSt
15、ackCar,LinkQueueCar);/显示信息/void savecar(CarNode *);/保存车辆信息/自定义函数/*void savecar(CarNode *p1)/保存车辆信息FILE *fp1;if(fp1=fopen(“car1.txt“,“w“)=NULL)printf(“nt不能保存车辆信息n“);return;德州学院 2012 级 信息管理学院 计算机科学与技术 数据结构课程设计19while(p1)fwrite(p1,sizeof(struct node),1,fp1);p1=p1-next;*/栈的初始化void InitStack(SeqStackCar
16、*s) 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);elsereturn(-1);/车辆收费void PRINT(CarNode *p,int room)德州学院 2012 级 信息管理学院 计算机科学与技术 数据结构课程设计20int A1,A2,B1,B2;printf(“n请输入车
17、辆离开的时间:(小时:分钟)“);scanf(“%d:%d“,while(p-leave.hourleave.hour23)printf(“您的输入有误!“);printf(“请重新输入离开时间的时(0-23):“);scanf(“%d“,if(p-leave.minleave.min59)printf(“您的输入有误!“);printf(“请重新输入离开时间的分(0-59):“);scanf(“%d“,printf(“n离开车辆的车牌号为:“);puts(p-num);printf(“n该车到达时间为: %d:%d“,p-reach.hour,p-reach.min);printf(“n该车
18、离开时间为: %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应交费用为: %2.1f 元!“,(B1-A1)*60+(B2-A2)*price);free(p);/车辆的到达登记int Arrival(SeqStackCar *Enter,LinkQueueCar *W)/char num10;德州学院 2012 级 信息管理学院 计算机科学与技术 数据结构课程设计21/int a;CarNode *p;QueueNode *t;p=
19、(CarNode *)malloc(sizeof(CarNode);flushall();/清空缓存输入的作用printf(“n请输入车牌号(例:豫 B1234):“);gets(p-num);/*a=Enter-top;loop:scanf(“%s“,if(a=0)strcpy(p-num,num);a+;while(a)if(strcmp(num,Enter-stacka-num)=0)printf(“您输入的车牌号重复,请重新输入!“);goto loop;*/if(Enter-toptop+;printf(“n车辆在车场第%d 位置.“,Enter-top);printf(“n车辆到达
20、时间:“);scanf(“%d:%d“,while(p-reach.hourreach.hour23) /控制时间格式正确德州学院 2012 级 信息管理学院 计算机科学与技术 数据结构课程设计22printf(“您的输入有误!“);printf(“请重新输入到达时间的时(0-23):“);scanf(“%d“,while(p-reach.minreach.min59) /控制分钟输入正确printf(“您的输入有误!“);printf(“请重新输入到达时间的分(0-59):“);scanf(“%d“, Enter-stackEnter-top=p;printf(“n恭喜您登记成功!“);/s
21、avecar(?);printf(“n“);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)德州学院 2012 级 信息管理学院 计算机科学与技术 数据结构课程设计23
22、 int room;CarNode *p,*t;QueueNode *q;if(Enter-top0)/判断停车场是否为空 while(1)/输入离开车辆的信息 printf(“n请输入车在车场的位置/1-%d/:“,Enter-top);scanf(“%d“,if(room=1elseprintf(“n您的输入有误,请重新输入: “);while(Enter-toproom)/把要离开车辆前面的车开出来,进临时栈。Temp-top+;/临时通道的栈顶指针Temp-stackTemp-top=Enter-stackEnter-top;Enter-stackEnter-top=NULL;Ente
23、r-top-; p=Enter-stackEnter-top;/把要删除的车辆节点赋给 p。 Enter-stackEnter-top=NULL;Enter-top-;while(Temp-top=1)/判断临时通道上是否有车。Enter-top+;Enter-stackEnter-top=Temp-stackTemp-top;Temp-stackTemp-top=NULL;Temp-top-;德州学院 2012 级 信息管理学院 计算机科学与技术 数据结构课程设计24PRINT(p,room);/调用计费函数计费。 。if(W-head!=W-rear)t=q-data; Enter-top
24、+; printf(“n便道上的%s 号车进入停车场内第%d 位置.“,t-num,Enter-top);printf(“n请输入%s 号车进入停车场的时间:“,t-num);scanf(“%d:%d“,while(t-reach.hourreach.hour23) /控制时间格式正确printf(“您的输入有误!“);printf(“请重新输入到达时间的时(0-23):“);scanf(“%d“,while(t-reach.minreach.min59) /控制分钟输入正确printf(“您的输入有误!“);printf(“请重新输入到达时间的分(0-59):“);scanf(“%d“,W-
25、head-next=q-next;if(q=W-rear)W-rear=W-head;Enter-stackEnter-top=t;printf(“n恭喜您登记成功!“);free(q);德州学院 2012 级 信息管理学院 计算机科学与技术 数据结构课程设计25elseprintf(“n您好,便道上没有车!n“); printf(“n“);elseprintf(“n您好,停车场内没有车!“); printf(“n“);/显示停车场里的车辆情况void List1(SeqStackCar *S) int i;printf(“t您请求的查看停车场内停车情况为:“);if(S-top0)/判断停车
26、场内是否有车 for(i=1;itop;i+)printf(“nt车位位置: %d “,i);printf(“nt到达时间: %d:%d “,S-stacki-reach.hour,S-stacki-reach.min);printf(“nt车牌号: %sn“,S-stacki-num);elseprintf(“n您好,停车场内没有车!无法进行车辆离开登记操作!n“);printf(“n“);/显示便道上的车辆情况void List2(LinkQueueCar *W) 德州学院 2012 级 信息管理学院 计算机科学与技术 数据结构课程设计26 QueueNode *p;int i;print
27、f(“您所请求的查看便道上停车的情况为:“);p=W-head-next;if(W-head!=W-rear)/判断便道上是否有车printf(“n等待车辆的车牌号码为:“);for(i=1;p!=NULL;i+)printf(“n第 %d 车辆.“,i);puts(p-data-num);p=p-next ;elseprintf(“n您好,便道上没有车!“);printf(“n“);/列表界面void List(SeqStackCar S,LinkQueueCar W) int flag,tag;flag=1;while(flag)/列表显示循环控制printf(“nt= 欢迎使用停车场系统
28、= n“);printf(“nt 查看车辆列表显示 “);printf(“nt|*|n“);printf(“nt| 1.停车场列表 |n“);德州学院 2012 级 信息管理学院 计算机科学与技术 数据结构课程设计27printf(“nt| 2.便道列表 |n“);printf(“nt| 3.返回主菜单 |n“);printf(“nt|*|n“);printf(“nt= 欢迎使用停车场系统= n“);printf(“n请选择您所需要的服务(13):“);while(1) scanf(“%d“,if(tag=1 elseprintf(“n 您的输入有误!请您重新选择(14):“);scanf(“%d“,switch(ch) case 1:Arrival(break;/车辆到达case 2:Leave(break;/车辆离开case 3:List(Enter,Wait);break;/列表显示车辆信息case 4:exit(0);/退出主程序default: break;