2012数据结构课程设计.doc_第1页
2012数据结构课程设计.doc_第2页
2012数据结构课程设计.doc_第3页
2012数据结构课程设计.doc_第4页
2012数据结构课程设计.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

数据结构课程设计报告 信息工程学院软件工程专业题目:停车场管理系统班级:软件1班 第1组 组长: 姓名:王崇文 学号:2011306040125组员:姓名:谢天航 学号:2011306040130 指导老师:曲朝阳、郭晓利、刘志颖日期:2012年 12月 26日一、程序设计目标1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。 2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4.训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。二、问题描述 设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。编制一程序模拟该停车场的管理。 要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应交纳的费用和它在停车场内停留的时间。以栈模拟停车场,以队列模拟停车场外的便道,按照从终端读入的输入数据序列进行模拟管理。三、需求分析 本次数据结构课程设计的具体内容是停车场管理系统,该系统用栈结构模拟停车场,限定停车场的容量为n,用队列结构模拟等待的便道,空间不限制。车辆的信息包括:车牌号、汽车到达/离去标志、到达/离去时刻等。按照从终端读入的数据序列进行模拟管理。每辆车需要四个数据,其中车辆数据为:1表示到达,2表示离去,3表示车辆显示列表,4表示程序结束。车辆牌照为整型数据。进场或离场时间同样为整型数据。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。停车场管理系统主要实现以下几个功能: (1)根据车辆到达停车场到车辆离开停车场时所停留的时间进行计时收费。 (2)该程序设计能够通过车牌号能查到该车辆在停车场或便道中的位置。(3)当有车辆从停车场离开时,等待的车辆按顺序进入停车场停放。实现停车场的调度功能。该程序设计可以完整的模拟停车场的管理过程。 每一组输入数据包含三个数据项: 汽车“到达”或“离去”信息,汽车牌照号码以及汽车到达或离去的时刻。 对每一组输入数据操作后的输出结果为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是汽车离去,则输出汽车在停车场内的停留时间和应缴纳的费用(在便道上停留的时间不收费)。 栈以顺序结构实现,队列以链表结构实现。本设计的小组分工如表1所示。表1 小组分工题目停车场管理王崇文车辆到达、车辆离开模块 谢天航停车场内停放车辆的信息以及退出程序四、概要设计按照题目的要求,此停车场管理系统是在一个狭长的通道上的,而且只有一个大门可以供车辆进出,并且要实现停车场内某辆车要离开时,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些辆再依原来的次序进场的功能。 因此,可以设计两个堆栈,其中一个堆栈用来模拟停车场,另一个堆栈用来模拟临时停车场,该临时停车场用来存放当有车辆离开时,原来停车场内为其让路的车辆。至于当停车场已满时,需要停放车辆的通道可以用一个链队列来实现。当停车场内开走一辆车时,通道上便有一辆车进入停车场,此时只需要改变通道上车辆结点的连接方式就可以了,使通道上第一辆车进入停车场这个堆栈,并且使通道上原来的第二辆车成为通道上的第一辆车,此时只需将模拟通道的链队列的头结点连到原来的第二辆车上就可以了。设计方案: 对于此停车场管理系统的实现,就是用两个堆栈来分别模拟停车场以及停车场内车辆为其它车辆让路时退出停车的临时停放地点。至于通道上车辆的停放则用一个链队列来实现,此时,通道上车辆的离开或者进入停车场只需改变此链队列上的结点而已。对于要对停车场内的车辆根据其停放时间收取相应的停车费用,可以记录下车辆进入以及离开停车场的时间,再用时间差乘以相应的单价并且打印出最后的费用就可以实现了。我主要实现车辆停车场内停放车辆的信息模块和退出程序模块。首先定义用来模拟停车场的堆栈以及用来模拟通道的链队列为全局变量,然后编写主函数,在此主函数中实现对其它各个模块的调用。在用户的选择过程中,程序又分别调用车辆的到达、车辆的离开这两个函数模块。其中,在车辆的离开那个模块函数中又调用了车辆的离开那个模块函数,在停车场内停放车辆信息的那个模块函数中,又分别调用了显示停车场上车辆信息的函数以及显示便道上车辆信息的函数。最后,从调出的这四个函数中回到主函数结束整个程序的运行。以上两个模块中,出现的调用的函数为:a) int Arrival(SeqStackCar *,LinkQueueCar *); /车辆到达登记车辆到达时,先登记车辆车牌号码。然后再判断停车场有没有停满,没停满就进栈,停满了就停在便道上,即进队列。b) void Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *); /车辆离开处理通过输入离开车辆的位置处理,然后调用PRINT(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); / 车辆离开时的收费这个函数由车辆离开的函数调用,以分钟计时算费,但只能计算当天之内的费用,如果第二天的话会导致计费为负或减少。即只能当天停,当天开走。算法流程图 开始以堆栈来模拟停车场和以堆栈里的数据元素模拟设计成汽车的车牌号,以队列来模拟停车场外的通道且也将其储存的数据元素设计成汽车的车牌号初始化停车站,初始化让路的临时栈,初始化通道车辆到达,判断停车场是否已满是车进便道否车进停车场输入车子到达时间,车牌号判断停车场是否已满不作任何计算是车子离开否输入离开车辆的离开时间,进行停车费用的计算 便道内的车 进入停车场5、 详细设计()车辆信息的表示 车辆可看成是一个节点,设计成一个结构体,车辆信息包括:车牌号码,车辆的进站时间和离开停车的时间,定义如下: typedef struct nodechar num10; /车牌号码 Time reach; /到站时间 Time leave; /离开时间 CarNode;()时间、栈和队列的定义 时间是由小时和分钟表示的,有两部分数据,所以,类似于复数的表示一样,设计两个变量分别存储小时和分钟。如: typedef struct timeint hour;int min;Time;停车场内用栈表示:typedef struct NODECarNode *stackMAX+1; /栈用顺序表示 int top;SeqStackCar;便道上的车辆表示:typedef struct carCarNode *data; / 便道上的车用链表表示struct car *next;QueueNode; typedef struct NodeQueueNode *head; / 设置头指针、尾指针。QueueNode *rear;LinkQueueCar六、软件说明书本系统为存车信息管理软件,能实现车场存车及便道存车信息的输入,输出,查找等功能,并建 立和更新的存车费用信息保存于文件输出或打印。对于查找等功能能够按存车位置及车牌号分别进行。 每辆车的相关信息包括:车牌号,进站时间,出站时间,存车位置,停车费用等。本系统功能还需完善,操作简单,只是供学习之用,并不能作为实际生活使用。下面介绍了此软件的使用说明:1.停车场.exe;2.进入演示系统后首先是一个用户及管理员使用注意事项界面,进入后会出现菜单选项。 1.车辆进站 2.车辆出站 3.存车信息 4.离开系统 请选择: 1|2|3|4.这时可按照提示进行你想要的操作。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; /车辆信息节点typedef struct NODECarNode *stackMAX+1; int top;/ 栈指针SeqStackCar;/模拟车场typedef struct carCarNode *data; struct car *next;QueueNode;/模拟通道typedef struct NodeQueueNode *head; /设置头指针 QueueNode *rear;/设置尾指针LinkQueueCar;void InitStack(SeqStackCar *); int InitQueue(LinkQueueCar *);int Arrival(SeqStackCar *,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-head-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.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) CarNode *p;/定义p指针类行为CarNode QueueNode *t;/定义t指针类行为QueueNode p=(CarNode *)malloc(sizeof(CarNode);/用malloc开辟车子结点CarNode的空间,同时用指针指向新开辟空间的首地址; 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/(输入的车辆数大于车场的存储量) 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(SeqStackCar *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(%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;/然后将停车场内栈顶设置为空 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-;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); printf( %d:%d ,S-stacki-reach.hour,S-stacki-reach.min); puts(S-stacki-num);else printf(n车场里没有车);void List2(LinkQueueCar *W) /显示便道上的车辆情况,引用类型为LinkQueueCar 的队列W; QueueNode *p; int i; p=W-head-next;/定义类型为QueueNode的指针P,且指向队头的后继 if(W-head!=W-rear)printf(n等待车辆的号码为:); for(i=1; (p!=NULL); i+)printf(n第 %d 车辆.,i);puts(p-data-num); p=p-next ;else printf(n便道里没有车.);printf(n);void List(SeqStackCar S,LinkQueueCar W) /显示,遍历int flag,tag;/定义int型的flag,tag;且初始化令flag=1(用于跳出循环的变量) flag=1;while(flag)printf( 查看车辆列表显示: ); printf(n 1.车场列表n 2.便道列表n 3.返回主菜单n); printf(n请选择 13:);while(1) scanf(%d,&tag); if(tag=1 & tag=3) break; else printf(n 输入有

温馨提示

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

评论

0/150

提交评论