【数据结构】A类停车场管理系统_第1页
【数据结构】A类停车场管理系统_第2页
【数据结构】A类停车场管理系统_第3页
【数据结构】A类停车场管理系统_第4页
【数据结构】A类停车场管理系统_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.东北大学信息科学与工程学院数据结构课程设计报告题目 立体化停车场管理课题组长 张晓峰课题组成员 曹乔家 王子骄专业名称 计算机科学与技术班级 计1307指导教师 杨雷2015 年 1月:课程设计任务书题目:立体化停车场管理问题描述:设停车场有地上和地下两层,统一管理。地下停车场采用单入口和单出口。地上停车场采用南北方向的双口,每个口都有一个入口和出口。停车顺序先地上,后地下。地上入口处各有一个单车道的等候通道,并允许等候的车辆因急事从等候通道直接开走。设计要求:设计停车场模拟管理程序。(1)采用栈、队列和有序表等数据结构。(2)等候车辆的管理。(3)地下、地上停车位的管理。(4)停车计费功能

2、。(5)其它完善性功能。指导教师签字:年月日 目录1 课题概述11.1 课题任务11.2 课题原理11.3 相关知识12 需求分析12.1 课题调研12.2 用户需求分析13 方案设计23.1 总体功能设计23.2 数据结构设计23.3 函数原型设计33.4 主算法设计43.5 用户界面设计44 方案实现44.1 开发环境与工具44.2 程序设计关键技术44.3 个人设计实现44.3.1 张晓峰设计实现44.3.2 曹乔家设计实现114.3.3 王子骄设计实现155 测试与调试195.1 个人测试195.1.1 张晓峰测试19 5.1.2 曹乔家测试205.1.3 王子骄测试215.2 组装与

3、系统测试215.3 系统运行226 课题总结246.1 课题评价246.2 团队协作256.3 团队协作256.4 个人设计小结256.4.1张晓峰设计小结25 6.4.2 曹乔家设计小结256.4.3 王子骄设计小结257 附录A 课题任务分工26A-1 课题程序设计分工26A-2 课题报告分工27 附录B 课题设计文档(光盘)28B-1课程设计报告(电子版)28B-2源程序代码(*.H,*.CPP)28B-3工程与可执行文件)28B-4屏幕演示录像文件(可选)28 附录C 用户操作手册(可选)28C.1 运行环境说明28C.2 操作说明28 1 课题概述1.1 课题任务【问题描述】设停车场

4、有地上和地下两层,统一管理。地下停车场采用单入口和单出口。地上停车场采用南北方向的双口,每个口都有一个入口和出口。停车顺序先地上,后地下。地上入口处各有一个单车道的等候通道,并允许等候的车辆因急事从等待通道直接开走。 【设计要求】设计停车场模拟管理程序。(1)采用栈、队列和有序表等数据结构。(2)等候车辆的管理。(3)地下、地上停车位的管理。(4)停车计费功能。(5)其它完善性功能。1.2 课题原理 本程序主要运用栈来模拟停车场,建立上下两个栈来模拟上下停车场,一列表模拟车场便道,按照从终端输入的数据序列进行模拟管理,把停车的车位信息保存在新建的链表中,每组输入的数据保存车牌号,自动生成车位号

5、和车辆到达时间保存在链表中,对每一组的数据输出信息,包括车辆到达时间,离开时间,及停车费用,用队列保存便车道停靠的车辆,以及车辆的登记和离开,最后的栈是以顺序栈结构实现,队列和链表以链式结构实现。1.3 相关知识 本实验主要运用链表、栈、队列等数据结构,运用C语言中的指针、数组字符串等相关知识。 2 需求分析2.1 课题调研 通过在网上对各个停车场的调查,我们查到停车场有车辆的入场登记,车辆的离开及费用,还有就是车辆的信息保存,每个车辆有车牌号,到达和离开时间及停车费用等等。2.2 用户需求分析 本程序采用简单的界面,使使用者可以简单可了解软件的使用,界面简单、大方。链表保存的车位信息,只需输

6、入车牌号,其他车位信息自动由系统生成,可以免去使用的其他操作,为使用者省事,省力。同时本软件的使用达到人性化,方便化,便于使用者的使用。 3 方案设计3.1 总体功能设计 本软件要实现对进入停车场的车辆登记功能,车辆离开的收费功能,以及车辆进入便车道的等待及从便车道,还有对车辆信息的查询和对车场进入和离开车辆的统计。3.2 数据结构设计(1)时间的结构体 struct now_timeint mday; int hour; int min; (2)车位信息的结构体struct information int setnumber; char num10; struct now_time reac

7、h; struct now_time leave; setMAX*2(3)便车道队列typedef struct char *base; int front; int rear; SqQueue(4)停车场的栈typedef structint *base; int *top; int stacksize;SqStack(5)车位信息的链表typedef struct LNodestructint stnumber; char num10; struct now_time reach; struct now_time leave; float fee; int totalhour;data;

8、struct LNode *next;LNode,*LinkList3.3 函数原型设计()void CreateList_L(LinkList &L) 建立车辆信息链表()Status initStack1(SqStack &S) 建立地上停车场的栈()Status initStack2(SqStack &S) 建立地下停车场的栈()Status Push(SqStack &S,int e) 车辆入栈即出场()Status Pop(SqStack &S,int &e) 车辆出栈即入场()Status initQueue(SqQueue &

9、;Q) 建立便车道的队列()Status QueueLength(SqQueue Q) 计算便车道的车辆数量()Status stack_empty(SqStack S) 判断停车场是否车满()void enterstop( LinkList clist,SqStack &S,char number10,int *come,int i) 车辆进入停车场 ()Status leavestop(LinkList llist,LinkList clist,SqStack &S,SqQueue &Q,int *come,int*leave,int i) 车辆离开停车场()voi

10、d ccord(LinkList clist,int i,int setnumber) 信息登记()Status ListInsert_Link(LinkList &L,int i,int setnumber) 保存车辆到来的信息()void copy(char *a,char *b) 进行车位号的比对()Status lListInsert_Link(LinkList &llist,int i,int lset,int totalhour,float fee,int day,int hour,int min) 保存车辆离开的信息()void showcome(LinkList

11、 list) 显示车辆到来时间()void showleave(LinkList list) 显示车辆离开时间3.4 主算法设计 程序运行时,当车辆入场时,车辆信息保存在链表里,并出栈来表示进入一辆车,其车位和时间自动生成,当汽车离场时,输入车位信息,显示时间,费用。并把车辆离开时间等保存在离开的链表里,然后通过车位信息的输入,即出场和离场链表表示输出。3.5 用户界面设计 主界面分别有车辆登记,车辆离场,车场信息,退出系统四个功能,进入车辆登记窗口输入车牌号,自动生成车位信息显示。车辆离场窗口进入输入车场及 车位信息,即弹出车位信息及停车费用。车位信息即显示地上下停车场进出车辆的车辆信息,包

12、括到达时间、离开时间、车位号、车牌号、停车费用等。退出系统即退出本软件。 4 方案实现4.1 开发环境与工具 本程序在window7下实现和运行,并使用Visual C+6.0编译的。4.2 程序设计关键技术 本程序主要用栈来保存车位车位的信息,当车场为空时,栈此时是满的,而当车场满时,栈是空的。所以当车辆入场时是出栈,而车辆进场时时出栈。此外就是车辆信息的保存在链表里。因为是地上下两个停车场,故我们采用两个栈和两个链表来保存其对应的信息,我们还采用了系统时间,减少了使用者的输入。4.3 个人设计实现4.3.1 张晓峰设计实现 设计时间车位两个结构体,以及时间函数。主函数的设计。保存车辆到达与

13、离开信息(利用链表)(1)时间与车位信息的结构体源程序:struct now_timeint mday; int hour; int min;struct information int setnumber; char num10; struct now_time reach; struct now_time leave; setMAX*2;(2)保存车辆到来信息源程序: 车辆信息,包括车牌号,到达时间。储存在链表中,后续查询车场信息中利用此函数。Status ListInsert_Link(LinkList &L,int i,int setnumber)LNode *p,*s;int

14、 j; p=L; j=0; while(p&&j<i-1)p=p->next; +j; if(!p|j>i-1)return ERROR; s=(LinkList)malloc(sizeof(LNode); s->data.stnumber=setsetnumber.setnumber; s->data.reach.hour=setsetnumber.reach.hour; s->data.reach.mday=setsetnumber.reach.mday; s->data.reach.min=setsetnumber.reach.m

15、in; copy(s->data.num,setsetnumber.num); s->next=p->next; p->next=s; return OK;(3)保存车辆离开 离开时,记录离开时间,算出总时间,为后续计算费用做铺垫。同样将信息储存在链表中,在离开停车场函数中利用该函数。Status lListInsert_Link(LinkList &llist,int i,int lset,int totalhour,float fee,int day,int hour,int min)LNode *p,*s; int j; p=llist; j=0; whi

16、le(p&&j<i-1)p=p->next; +j;if(!p|j>i-1)return ERROR; s=(LinkList)malloc(sizeof(LNode); s->data.fee=fee; s->data.totalhour=totalhour; s->data.stnumber=lset; s->data.leave.mday=day; s->data.leave.hour=hour; s->data.leave.min=min; copy(s->data.num,setlset.num); s-&g

17、t;next=p->next; p->next=s; return OK; (4)时间函数源代码: 采用系统时间,日小时分钟格式。分为入场时间和出场时间。void showcome(LinkList list)LNode *p; p=list->next; while(p) printf("n %st%d号t%d日%d时%d分",p->data.num,p->data.stnumber,p->data.reach.mday,p->data.reach.hour,p->data.reach.min);p=p->next;

18、void showleave(LinkList list)LNode *p;p=list->next;while(p)printf("n %st%d号t%d日%d时%d分",p->data.num,p->data.stnumber,p->data.leave.mday,p->data.leave.hour,p->data.leave.min);p=p->next;(5)主函数: 本程序的关键所在。对所有函数进行调用,并实现界面的显示。登记,离开,查询,退出四个部分。主菜单的建立,界面设计等。void main()int choice

19、1,choice2,choice3,wait,ture=1; int i; int come1=0;int leave2=0;int come3=0;int leave4=0; int *p1,*p2,*p3,*p4; p1=&come1;p2=&leave2; p3=&come3; p4=&leave4; char number10; SqStack stack_set1; SqStack stack_set2; SqQueue queue_turn; initStack1(stack_set1); initStack2(stack_set2); initQu

20、eue(queue_turn); LinkList llist1,llist2,clist1,clist2; CreateList_L(llist1); CreateList_L(clist1); CreateList_L(llist2); CreateList_L(clist2); for(i=1;i<=MAX+1;i+)seti.setnumber=i; seti.num1='#' system("color 3B"); printf("nnnnnnnnn*欢迎使用停车场管理系统,按任意键进入主菜单*"); do getchar

21、(); system("cls"); printf(" 欢迎使用停车场管理系统nnn");printf(" 主菜单nn"); printf(" *1* 汽车登记n"); printf(" *2* 汽车离场n"); printf(" *3* 车场信息n"); printf(" *0* 退出系统nn");printf("*请按提示输入:n"); scanf("%d",&choice1); switch(choic

22、e1)case 1:system("cls"); printf(" *汽车登记*nnn");if(!stack_empty(stack_set1)/进入停车场 printf("n *请输入您的车牌号(例:辽A3475):"); scanf("%s",number); enterstop(clist1,stack_set1,number,p1,1);else if(!stack_empty(stack_set2) printf("n *请输入您的车牌号(例:辽A3475):"); scanf(&q

23、uot;%s",number); enterstop(clist2,stack_set2,number,p3,2); else/进入便车道等待 wait=w_total(queue_turn); printf("*您好,当前停车场已满,有%d在等待!*n 您是否愿意进入便车道等待:n",wait);printf(" *1*:愿意等待!tt*2*:不愿意等待n"); while(ture=1)scanf("%d",&choice3); getchar(); switch(choice3)case 1:enterlane

24、(queue_turn,wait);/汽车进入便车道 printf("*您好,请进入便车道等待*!"); ture=0;break; case 2: printf("n*汽车离开!"); ture=0; break; default: printf("n*您好,输入错误,请重新输入!");ture=1;break;case 2:system("cls");printf("*汽车离场*nnn");printf(" *1* 地上车场n");printf(" *2* 地下

25、车场n"); scanf("%d",&choice2); switch(choice2)case 1:printf(" *地上停车场*n "); leavestop(llist1,clist1,stack_set1,queue_turn,p1,p2,1); break; case 2: printf(" *地下停车场*n "); leavestop(llist2,clist2,stack_set2,queue_turn,p3,p4,2); break; default: printf("*您输入的有误,请重

26、新输入:");break;case 3:/*今天信息的显示*/system("cls"); printf(" *车场信息*nn");if(come1+come3)=0)printf("*无车辆到达!n");else printf("*到达%d辆车:",come1+come3); printf ("n*汽车信息*车牌号*t*车位号*t*到达时间*t"); printf ("n*地上车场*t"); showcome(clist1); printf ("n*地下

27、车场*t"); showcome(clist2); printf("n");if(leave2+leave4)=0) printf("*无车辆离开!n");elseprintf("*离开%d辆车:",leave2+leave4); printf ("n*汽车信息: *车牌号*t*车位号*t*到达时间*t"); printf ("n*地上车场:t"); showleave(llist1); printf ("n*地下车场:t"); showleave(llist2);

28、 break;case 0:system("cls");printf(" *退出停车系统!*n"); break;default : printf("*您输入的有误,请重新输入:");getchar();while(choice1!=0);4.3.2 曹乔家设计实现 设计进入停车场和离开停车场函数,结合之前栈,链表,队列以及数组。(1)进入停车场源代码:void enterstop( LinkList clist,SqStack &S,char number10,int *come,int i) int e; *come=*c

29、ome+1; Pop(S,e); sete.setnumber=e;copy(sete.num,number);struct tm *newtime; char am_pm = "AM" time_t long_time; time( &long_time ); newtime = localtime( &long_time ); sete.reach.hour=newtime->tm_hour;sete.reach.mday=newtime->tm_mday; sete.reach.min=newtime->tm_min; printf(

30、"nn *请核对您的停车信息*n"); printf(" *停车牌号*: %sn",sete.num);if(i=1)printf(" *地上车场*: %dn",sete.setnumber);if(i=2)printf(" *地下车场*: %dn",sete.setnumber); printf(" *到达时间*: %d:%d:%dn", sete.reach.mday,sete.reach.hour,sete.reach.min); ccord(clist,*come,sete.setnum

31、ber); 利用出栈函数来表示车辆进入停车场,等同于车位出停车场。利用set数组,存储进入车场的车辆信息。包括进入时间,车号等。时间函数的时候,显示到达时间,并按先下后上的顺序,选择上下两个停车场,并输出。(2)离开停车场源代码:Status leavestop(LinkList llist,LinkList clist,SqStack &S,SqQueue &Q,int *come,int*leave,int i)char number10; int t,lset; int j=1; int totalhour; float fee; printf ("*请输入您的

32、停车位号:");doscanf ("%d",&lset); getchar();for(int i=0;i<=MAX;i+)if(setlset.num1='#')j=0;if(j=0)printf(" *车场并没有停车*n");return ERROR;elseif(lset>MAX |lset<1)printf("*您输入有误,该车号并不存在!*n*请重新输入您的车位号:n");t=1;elseif(setlset.num1='#')printf("*该

33、车位为空,不能进行离开操作!*n*请重新输入您的车位号:n");t=1;elsestruct tm *newtime;char am_pm = "AM"time_t long_time;time( &long_time ); newtime = localtime( &long_time ); totalhour=(newtime->tm_mday-setlset.reach.mday)*24*60+(newtime->tm_hour-setlset.reach.hour)*60+(newtime->tm_min-setlset.

34、reach.min); fee=price*totalhour; printf(" *以下是您本次停车的信息*n"); printf(" *停车牌号*:%sn",setlset.num); printf(" *停车位号*:%dn",setlset.setnumber); printf(" *到达时间*:%d:%d:%dn", setlset.reach.mday,setlset.reach.hour,setlset.reach.min); printf(" *离开时间*:%d:%d:%dn",

35、newtime->tm_mday,newtime->tm_hour,newtime->tm_min); printf(" *停车费用*:%f",fee); printf("nnnt*谢谢您的光临,祝您一路平安*!nn"); printf("nnnntttmention:press any key continue!"); getchar(); system("cls"); *leave=*leave+1; lListInsert_Link(llist,*leave,lset,totalhour,f

36、ee,newtime->tm_mday,newtime->tm_hour,newtime->tm_min); setlset.num1='#'Push(S,lset);if(!EmptyQueue(Q)DeQueue(Q); printf("n *请停在停车便道的客户进入停车场!*n");if(i=1)/判断车场printf("n*输入您的车牌号(例:辽A3475):");scanf("%s",number); enterstop(clist,S,number,come,1); t=0;if(i=2)

37、 printf("n*输入您的车牌号(例:辽A3475):"); scanf("%s",number); enterstop(clist,S,number,come,2); t=0;elset=0;while(t=1);return OK; 离开停车场,包括计费的显示,信息存储在链表中。其中包含出场费用的计算,按分钟计时。实现输入车位号即显示车辆信息(车号,进场时间)离开时,显示所需费用。最后利用一个便车道的判空,判断是否有车辆等待入场,如果有,则停在刚刚空出的车位上。若没有,返回0;4.3.3 王子骄设计实现 停车场栈的建立,便车道的建立,保存车位信息

38、,地上地下两个车场,判断车场是否已满,便车道上的车辆数目函数。(1)便车道的建立源代码:便车道用一队列表示。typedef struct char *base; int front; int rear; SqQueue;(2)代表停车场的栈建立源代码:typedef structint *base; int *top; int stacksize;SqStack;(3)保存车位信息: 在进入停车场时,要把车辆信息保存在链表中,调用此函数可以实现该功能。信息包括车牌号以及入场时间。typedef struct LNodestructint stnumber; char num10; struct

39、 now_time reach; struct now_time leave; float fee; int totalhour;data; struct LNode *next;LNode,*LinkList;void copy(char *a,char *b)int i;for(i=0;(ai=bi)!='0'i+); void CreateList_L(LinkList &L)L=(LinkList) malloc (sizeof(LNode); L->next=NULL;void ccord(LinkList clist,int i,int setnumb

40、er) ListInsert_Link(clist,i,setnumber);(4)建立地上地下两个停车场: 题目要求两个停车场,建立方法相同,最大车位号相等。Status initStack1(SqStack &S) int i;S.base=(int * )malloc(MAX * sizeof(int);if(!S.base)exit(OVERFLOW);S.top=S.base;S.stacksize=MAX;for(i=1;i<=MAX;i+)*S.top+=i; return OK;Status initStack2(SqStack &S) int i;S.b

41、ase=(int * )malloc(MAX * sizeof(int);if(!S.base)exit(OVERFLOW);S.top=S.base;S.stacksize=MAX;for(i=1;i<=MAX;i+)*S.top+=i;return OK;(5)便车道的建立与判断是否已满: 便车道在后续的离开停车场时调用。如车道上有车等待,当车场中有车离开时,进行一次车道判空。若非空,则进入车场并停在对应的车位。Status initQueue(SqQueue &Q)Q.base=(char*)malloc(100*sizeof(char10); if(!Q.base)exi

42、t(OVERFLOW);Q.front=Q.rear=0; return OK;Status stack_empty(SqStack S)if(S.top=S.base)return OK; else return ERROR;(6)栈的相关函数: 由于本程序设计的车场,是以满栈的形式。即车位号已经将车场占满。车辆入栈,相当于车位号出战。以实现在车辆进入时,输出车位号信息。所以入栈为有车离开车场,出栈为有车进入车场。Status Push(SqStack &S,int e)if(S.top-S.base>=S.stacksize)if(!S.base)exit(OVERFLOW)

43、;S.top=S.base+S.stacksize;*S.top+=e;return OK;Status Pop(SqStack &S,int &e)if(S.top=S.base)return ERROR;e=*-S.top;return OK;(7)计算便车道车辆数目: 计算队列长度,即车辆数目。Status QueueLength(SqQueue Q) return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;Status w_total(SqQueue Q) return QueueLength(Q);(8)队列判空:Status EnQueu

44、e(SqQueue &Q,int e)if(Q.rear+1)%MAXQSIZE=Q.front)return ERROR; Q.baseQ.rear=e; Q.rear=(Q.rear+1)%MAXQSIZE; return OK;(9)进入车道等待:Status enterlane(SqQueue &Q,int waitenumber)EnQueue(Q,waitenumber); return OK; 设计的函数,均被后续进出停车场所使用,实现对应功能。 5 测试与调试5.1 个人测试5.1.1 张晓峰测试5.1.2 曹乔家测试5.1.3 王子骄测试5.2 组装与系统测试

45、把各个函数通过主函数的调用来实现停车场的各个功能的实现,当进入主函数,再调用各个副函数来实现功能的实现。操作名称操作流程操作结果和输出登录系统打开登录页面,按任意键进入主菜单从登录系统到进入主菜单,花费1秒时间。基本满足了系统显示要求。车辆登记输入车牌号确定即自动生成车位信息用列表的方式显示出了符合条件的记录。从服务器端返回信息,花费50毫秒-100毫秒,满足要求。汽车离场进入窗口,输入车场及车位信息自动生成车辆的到达离开时间及停车费用。退出系统点击退出本软件执行结束,退出系统。5.3 系统运行(1).进入系统(2).进入主菜单(3.).进入汽车登记(4).进入汽车离场系统(5).进入车位信息

46、 6 课题总结6.1 课题评价(1)系统功能总结:登记功能:车辆进入停车场时,对车辆的信息进行登记,包括车牌号,进入停车场的时间,将信息储存在链表中;收费功能:再离开停车场时,系统将利用时间函数计算出车辆在停车场中的时长,并计算出所需费用,显示在离开信息中;查询功能:可查询停车场全天的信息,包括场内现有车辆以及离开车辆的信息,包含所有的登记信息以及离开时间费用信息;(2)程序运行评价: 本程序说明清晰易懂,使用时按照说明操作即可。用栈表示车场,队列存储车辆。事项车辆与车号的一一对应。但对于界面方面,不够美观,程序也不够实用。由于本程序只做了管理方面的实现,所以在采集数据方面还需要手动输入。由于

47、开发能力和时间所限,本程序目前还需要在一定程度上进行改进和完善,根据以后运行问题以及学习的新知识,我们可以在功能方面进一步加强。6.2 团队协作 在此次数据结构课程实验中。我们学会了在编程过程中要学会各个成员的合作,以及各个函数的组合调用,在编程中我们要积极向老师请教,各个成员之间的团队合作,积极配合,才能更好地完成一个完整的、成功的程序。6.3 下一步工作 通过这次编程实验,我们意识到了我们的知识还远远不过,我们还要继续学习我们尚未了解的知识,并且把我们现有的知识要学会灵活运用,熟练的掌握我们现在的知识,并为以后的学习打下坚实的基础。我们还要继续学习数据结构的其他知识,为将来的编程打下基础。6.4 个人设计小结6.4.1 张晓峰设计小结 经过这些天的编程上机实验,使我们更加深入的了解数据结构这门课程,数据结构不仅仅要求我们具有熟练的知识,还要我们有丰富的实际实验的经验,使我们能更加地熟练运用数据结构这门课来解决我们面对的问题,对我们将来做更大的程序有非常大的帮助。还懂得了团队合作的重要性。6.4.2 曹乔家设计小结 这次课程设计使我对配合的能力有了更

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论