1、数据结构课程设计数据结构课程设计报告 信息工程学院软件工程专业题目:停车场管理系统班级:软件1班 第1组 组长: 姓名:王崇文 学号:2011306040125组员:姓名:谢天航 学号:2011306040130 指导老师:曲朝阳、郭晓利、刘志颖日期:2012年 12月 26日一、程序设计目标1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。 2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4.训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学
2、生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。二、问题描述 设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车
3、场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。编制一程序模拟该停车场的管理。 要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应交纳的费用和它在停车场内停留的时间。以栈模拟停车场,以队列模拟停车场外的便道,按照从终端读入的输入数据序列进行模拟管理。三、需求分析 本次数据结构课程设计的具体内容是停车场管理系统,该系统用栈结构模拟停车场,限定停车场的容量为n,用队列结构模拟等待的便道,空间不限制。车辆的信息包括:车牌号、汽车到达/离去标志、到达/离去时刻等。按照从终端读入的数据序列进行模拟管理。每辆车需要四个数据,其中车辆数据为:1表示到达,
4、2表示离去,3表示车辆显示列表,4表示程序结束。车辆牌照为整型数据。进场或离场时间同样为整型数据。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。停车场管理系统主要实现以下几个功能: (1)根据车辆到达停车场到车辆离开停车场时所停留的时间进行计时收费。 (2)该程序设计能够通过车牌号能查到该车辆在停车场或便道中的位置。(3)当有车辆从停车场离开时,等待的车辆按顺序进入停车场停放。实现停车场的调度功能。该程序设计可以完整的模拟停车场的管理过程。 每一组输入数据包含
5、三个数据项: 汽车“到达”或“离去”信息,汽车牌照号码以及汽车到达或离去的时刻。 对每一组输入数据操作后的输出结果为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是汽车离去,则输出汽车在停车场内的停留时间和应缴纳的费用(在便道上停留的时间不收费)。 栈以顺序结构实现,队列以链表结构实现。本设计的小组分工如表1所示。表1 小组分工题目停车场管理王崇文车辆到达、车辆离开模块 谢天航停车场内停放车辆的信息以及退出程序四、概要设计按照题目的要求,此停车场管理系统是在一个狭长的通道上的,而且只有一个大门可以供车辆进出,并且要实现停车场内某辆车要离开时,在它之后进入停车场的车都必须先退出停车场
6、为它让路,待其开出停车场后,这些辆再依原来的次序进场的功能。 因此,可以设计两个堆栈,其中一个堆栈用来模拟停车场,另一个堆栈用来模拟临时停车场,该临时停车场用来存放当有车辆离开时,原来停车场内为其让路的车辆。至于当停车场已满时,需要停放车辆的通道可以用一个链队列来实现。当停车场内开走一辆车时,通道上便有一辆车进入停车场,此时只需要改变通道上车辆结点的连接方式就可以了,使通道上第一辆车进入停车场这个堆栈,并且使通道上原来的第二辆车成为通道上的第一辆车,此时只需将模拟通道的链队列的头结点连到原来的第二辆车上就可以了。设计方案: 对于此停车场管理系统的实现,就是用两个堆栈来分别模拟停车场以及停车场内
7、车辆为其它车辆让路时退出停车的临时停放地点。至于通道上车辆的停放则用一个链队列来实现,此时,通道上车辆的离开或者进入停车场只需改变此链队列上的结点而已。对于要对停车场内的车辆根据其停放时间收取相应的停车费用,可以记录下车辆进入以及离开停车场的时间,再用时间差乘以相应的单价并且打印出最后的费用就可以实现了。我主要实现车辆停车场内停放车辆的信息模块和退出程序模块。首先定义用来模拟停车场的堆栈以及用来模拟通道的链队列为全局变量,然后编写主函数,在此主函数中实现对其它各个模块的调用。在用户的选择过程中,程序又分别调用车辆的到达、车辆的离开这两个函数模块。其中,在车辆的离开那个模块函数中又调用了车辆的离
8、开那个模块函数,在停车场内停放车辆信息的那个模块函数中,又分别调用了显示停车场上车辆信息的函数以及显示便道上车辆信息的函数。最后,从调出的这四个函数中回到主函数结束整个程序的运行。以上两个模块中,出现的调用的函数为:a) int Arrival(SeqStackCar *,LinkQueueCar *); /车辆到达登记车辆到达时,先登记车辆车牌号码。然后再判断停车场有没有停满,没停满就进栈,停满了就停在便道上,即进队列。b) void Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *); /车辆离开处理通过输入离开车辆的位置处理,然后调用PRI
9、NT(CarNode *p,int room);函数进行收费。然后再判断便道上有没有车,如果有,就把便道上的车进停车场内。c) void List(SeqStackCar,LinkQueueCar); /显示车场内和便道上的车辆情况 用个switch();函数选择显示车场内或是便道上的车辆情况。包括对下面两个子函数的调用: void List1(SeqStackCar *S); void List2(LinkQueueCar *W); /分别为显示车场和便道上的车辆情况d) void PRINT(CarNode *p,int room); / 车辆离开时的收费这个函数由车辆离开的函数调用,以分
10、钟计时算费,但只能计算当天之内的费用,如果第二天的话会导致计费为负或减少。即只能当天停,当天开走。 算法流程图以堆栈来模拟停车场和以堆栈里的数据元素模拟设计成汽车的车牌号,以队列来模拟停车场外的通道且也将其储存的数据元素设计成汽车的车牌号是否不作任何计算是否5、详细设计()车辆信息的表示 车辆可看成是一个节点,设计成一个结构体,车辆信息包括:车牌号码,车辆的进站时间和离开停车的时间,定义如下: typedef struct node char num10; /车牌号码 Time reach; /到站时间 Time leave; /离开时间 CarNode;()时间、栈和队列的定义 时间是由小时
11、和分钟表示的,有两部分数据,所以,类似于复数的表示一样,设计两个变量分别存储小时和分钟。如: typedef struct time int hour; int min;Time;停车场内用栈表示:typedef struct NODE CarNode *stackMAX+1; /栈用顺序表示 int top;SeqStackCar;便道上的车辆表示:typedef struct carCarNode *data; / 便道上的车用链表表示struct car *next;QueueNode; typedef struct NodeQueueNode *head; / 设置头指针、尾指针。Qu
12、eueNode *rear;LinkQueueCar六、软件说明书本系统为存车信息管理软件,能实现车场存车及便道存车信息的输入,输出,查找等功能,并建 立和更新的存车费用信息保存于文件输出或打印。对于查找等功能能够按存车位置及车牌号分别进行。 每辆车的相关信息包括:车牌号,进站时间,出站时间,存车位置,停车费用等。本系统功能还需完善,操作简单,只是供学习之用,并不能作为实际生活使用。下面介绍了此软件的使用说明:1.停车场.exe;2.进入演示系统后首先是一个用户及管理员使用注意事项界面,进入后会出现菜单选项。 1.车辆进站 2.车辆出站 3.存车信息 4.离开系统 请选择: 1|2|3|4.这
13、时可按照提示进行你想要的操作。3.对于14的具体操作与内容请详见前面的调试分析,您便可以轻松操作了!七、源程序清单#include#include#include#define MAX 3 / 停车场最大容量为3辆,便于观察#define price 0.05 /每分钟单价typedef struct time / 定义时间结构体 int hour; int min;Time;typedef struct node / 定义车辆信息结构体 char num10; /字符数组表示车牌号 Time reach; /到达时间 Time leave; /离开时间CarNode; /车辆信息节点type
14、def struct NODE CarNode *stackMAX+1; int top; / 栈指针SeqStackCar; /模拟车场typedef struct car CarNode *data; struct car *next;QueueNode; /模拟通道typedef struct Node QueueNode *head; /设置头指针 QueueNode *rear; /设置尾指针LinkQueueCar; void InitStack(SeqStackCar *); int InitQueue(LinkQueueCar *);int Arrival(SeqStackCa
15、r *,LinkQueueCar *); void Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *);void List(SeqStackCar,LinkQueueCar); void option() int i; char choice; for(i=1;i=1&chtop=0; for(i=0;istacks-top=NULL;/=初始化链表=int InitQueue(LinkQueueCar *Q) Q-head=(QueueNode *)malloc(sizeof(QueueNode); if(Q-head!=NULL) Q-hea
16、d-next=NULL; Q-rear=Q-head; return(1); else return(-1);void PRINT(CarNode *p,int room) / 车辆收费 int A1,A2,B1,B2; printf(n车辆离开的时间:); scanf(%d:%d,&(p-leave.hour),&(p-leave.min); printf(n离开车辆的车牌号为:); puts(p-num); printf(n其到达时间为: %d:%d,p-reach.hour,p-reach.min); printf(n离开时间为: %d:%d,p-leave.hour,p-leave.m
17、in); 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) CarNode *p; /定义p指针类行为CarNode QueueNode *t; /定义t指针类行为QueueNode p=(CarNode *)malloc(sizeof(CarNode);/用malloc开辟车子结点CarNo
18、de的空间,同时用指针指向新开辟空间的首地址; flushall(); /刷新缓冲区, printf(n请输入车牌号(例:吉B6666):); gets(p-num); / 输入车牌号信息 if(Enter-toptop+; /进入的车辆数量加1; printf(n车辆在车场第%d位置.,Enter-top); printf(n车辆到达时间:); scanf(%d:%d,&(p-reach.hour),&(p-reach.min); Enter-stackEnter-top=p; /将p指针里包含的所有信息赋值给停车场栈的结点里; return(1); else /(输入的车辆数大于车场的存储
19、量) printf(n该车须在便道等待!有车位时进入车场); t=(QueueNode *)malloc(sizeof(QueueNode); / 站满入队列(用malloc开辟便道的存储空间(即一个结点信息),同时用QueueNode型指针接收新开辟结点的首地址;) t-data=p; /将p指针里包含的所有信息赋值给通道的结点里,用t-data储存 t-next=NULL; /令t-next=NULL; W-rear-next=t; /让新到的暂停车子连接到队尾上, W-rear=t; /同时将队尾挪移到下一位; return(1); /=车辆离开=void Leave(SeqStackC
20、ar *Enter,SeqStackCar *Temp,LinkQueueCar *W) int room; /定义room的类型为int:记录车辆在停车场中的位置 CarNode *p,*t; /定义p、t的指针类型为CarNode:p指针用来储存离开车辆的信息,t指针用来储存从通道上入停车场的车辆信息 QueueNode *q; /定义q的指针类型为QueueNode:用q指针控制通道车子的移动 if(Enter-top0) / 判断车场是否为空(停车场内车辆的数量大于0,即有车) while(1) printf(n请输入车在车场的位置/1-%d/:,Enter-top); scanf(%
21、d,&room); if(room=1&roomtop) break; /输入的要离开的车子的位置不小于1且不大于停车场内最大停放数量就跳出循环; else printf(n 输入有误,请重输: ); while(Enter-toproom) / 把要删除的车辆的前面的车开出来,进临时栈。(停车场内停放车辆的位置大于输入的要离开车子的位置) Temp-top+; /靠近大门的车子就要退出让道,安置到临时栈中且同时位置加1; Temp-stackTemp-top=Enter-stackEnter-top;/将停车场内栈顶信息赋给临时栈的栈顶 Enter-stackEnter-top=NULL;
22、/然后将停车场内栈顶设置为空 Enter-top-; /位置减 1 p=Enter-stackEnter-top; /把要删除的车辆节点赋给p。便于车子信息的打印 Enter-stackEnter-top=NULL; /将停车场内栈顶设置为空 Enter-top-; while(Temp-top=1) / 再把临时栈里的车辆进停车场 Enter-top+; /将停车场内栈顶位置加1 Enter-stackEnter-top=Temp-stackTemp-top; /将临时栈的栈顶信息赋给停车场内的栈顶 Temp-stackTemp-top=NULL; /将临时栈栈顶设置为空 Temp-top-
23、; PRINT(p,room); / 调用计费函数计费。将要离开的车子的信息打印出if(W-head!=W-rear)&Enter-tophead-next; /用q指针指向便道头指针的后继 t=q-data; /再将q的存储车子信息数据赋给指针t Enter-top+; /将停车场内栈顶位置加1 printf(n便道的%s号车进入车场第%d位置.,t-num,Enter-top); printf(n请输入%s号车进入车场的时间:,t-num); scanf(%d:%d,&(t-reach.hour),&(t-reach.min); 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) / 车场信息引用SeqStackCar的栈S;定义int 类型的变量i,来控制移动 int i; if(S-top0) printf(n车场:); printf(n 位置 到达时间 车牌号n); for(i=1;itop;i+) printf( %d ,i);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1