当前位置:文档之家› 数据结构—停车场管理系统

数据结构—停车场管理系统

理工大学华夏学院课程设计报告书课程名称:《数据结构与算法分析》课程设计实训名称:停车场管理系统姓名:航院(系):信息工程系专业班级:软件1141学号:***********指导教师:**成绩:时间:2015年6月29日至2015年7月3日实训任务书一、题目1.停车场管理二、实训的性质和任务数据结构实训是在完成理论课程学习之后安排的综合实践训练,要求学生能根据数据结构中所讲到的各种数据类型以及它们顺序和链式存储,在具体的应用中能运用并实现各种数据的各种不同操作。

通过一的综合实训,使学生加深对如将逻辑关系的数据按一定的存储式存储在计算机。

并为以后的编程打好基础。

三、实训的基本要求1、熟悉各种数据类型及它们在计算机中的存储式;2、熟悉各种数据类型的基本操作,各基本操作的实现。

3、能综合运用各种数据类型实现一些具体的问题。

四、考核指标及成绩评定实训成绩由下面构成:平时成绩(10%)+作品(70%)+实训报告(20%)=总评成绩作品成绩评定标准:1、全部完成90-1002、主要功能完成70-903、部分功能完成60-704、少部分完成40-605、几乎没做0-40完成期限:年月日指导教师签章:专业负责人签章:教学院长签章年月日一、需求说明仅仅认识到栈和队列是两种特殊的线性表是远远不够的,本次实习的目的在于使读者深入了解栈和队列的特征,以便在实际问题背景下灵活运用它们;同时还将巩固这两种结构的构造法,接触较复杂问题的递归算法设计。

以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。

每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照及到达或离去的时刻,对每一组输入数据进行操作后的输出数据为:若是车辆到达,则输出汽车在停车场或便道上的停车位置;若是车离去;则输出汽车在停车场停留的时间和应交纳的费用(在便道上停留的时间不收费)。

栈以顺序结构实现,队列以链表实现。

设停车场只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。

汽车在停车场按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。

试为停车场编制按上述要求进行管理的模拟程序。

二、功能描述停车场管理系统主要有以下几个功能:1、汽车进入车场添加车辆信息:车牌号、进车时间,如果停车场已满,则将车辆停入临时便道。

2、汽车退出车场根据退出车辆的车牌号,进行优先退出,再根据退出时间计算停车费用。

并将临时便道中的车辆停入停车场。

3、退出系统三、系统设计及实现软件规格要求合理,基于C语言程序设计,在有限空间达到效果最优化。

3.1设计要求用C语言实现“停车场管理系统”。

3.2系统功能(1)系统启动后,出现用户界面,人机交互。

(2)根据提示输入选项1、汽车进入车场2、汽车退出车场3、退出系统(3)进入车场时录入车辆牌号、和入场时间,输出停靠的停车位置,当停车场车位满时则停靠在临时停车便道。

(4)退出车场时录入车辆牌号、和出场时间,输出停车总时间,和所停的费用。

3.3系统性能:(1)时间特性需求在网络连接正常的情况下,查询响应时间为秒级。

(2)灵活性当需求发生某些变化时,机票管理应用软件操作式、数据结构、运行环境基本不会发生变化,变化只是将对应的数据文件的记录改变,或改变过滤条件。

(3)可用性软件应该尽可能的一目了然,使一般用户能够使用。

(4)安全性本套职工信息系统所涉及的数据存放于文件中,在程序中应尽可能的使用调用存储过程的法以免使某人反编译软件后或入侵到服务器后对数据的结构了如指掌,在程序中应该设置访问时的密码,以保证数据不容易被错改、破坏,而且要经常对数据文件进行备份操作,使得数据一旦受到破坏或是出错能够保证及时的恢复数据,将损失降低到最低。

(5)可维护性(6)应用程序的维护当用户使用本套职工信息系统软件时,遇到了软件本身的逻辑错误时,应当有软件的维护人员对软件进行修改。

(7)可转移、可转换性Visual Studio及C编程语言的兼容性很高,在windows95/98.Windows NT. windows2000. windows XP等操作系统都可以直接运行。

输入项:用户通过软件输入必要的信息,然后保存到数据文件,所输入的信息是经过需求分析限定的容,同时也是数据文件中每个字段中存储的容。

输出项:本套职工信息系统软件会将所有需要浏览的数据显示在屏幕上,以便使用户能够浏览到数据文件中的数据或用户想要浏览围中的数据算法:1)将用户输入的数据,按字段保存到数据文件中。

2)将数据文件中的数据,按字段提取到用户界面中。

3)必要的去除重复项的算法。

4)保持文件和输出数据的一致性。

注释设计:尽可能的将软件中插入注释语句,使语句功能明了。

制作的时候应该制作两分,一份是标有注释语句的代码,用来给维护人员、测试人员和开发人员了解开发过程所用,另一份是不带有注释语句的代码,用来最后实际应用当中,这样可以充分的利用有限的时间,降低客户的计算机打开系统功能的时间,提高客户的使用速度。

限制条件:限制必要的条件,以排除由于用户的误操作造成不必要的错误。

测试计划:在软件编辑的工作进行当中,测试人员便要开始制定测试计划,其中要包括白盒和黑盒的具体测试项目,及其必要的测试数据和出错的信息。

每次测试的结果要写报告,并就发现和怀疑的问题与编辑人员联系。

测试的结果要让编辑人员明白。

通过文件存储式将用户所录入的数据保存妥当,充分地描述了数据间的在联系,便于数据修改、更新与扩充,同时保证了数据的独立性、可靠性、安全性与完整性,减少了数据冗余,提高了数据共享程度及数据管理效率。

3.4设计思路及框架停车场的管理流程如下:①当车辆要进入停车场时,检查停车场是否已满,如果未满则车辆进入停车场;如果停车场已满,则车辆进入便道等候。

②当车辆要求出栈时,先让在它之后进入停车场的车辆退出停车场为它让路,再让该车退出停车场,让路的所有车辆再按其原来进入停车场的次序进入停车场。

之后,再检查在便道上是否有车等候,有车则让最先等待的那辆车进入停车场。

四、各功能模块1、交互菜单2、汽车进入停车场13、汽车退出停车场2五、总结短学期的课程设计是一次非常珍贵的机会,这是一次可以让我们所学的理论与实际相结合的机会。

其实个人而言,我体会较深的一点是团队互相帮助学习的过程,自己看书学习的经验,以及从网上以及其他各种途径获得信息和知识的经验。

理论与实际相结合的设计,锻炼了我综合运用所学的基础知识,解决实际问题的能力,同时也提高我查阅文献资料、对程序整体的把握等其他能力水平。

而且通过对整体的掌控,对局部的取舍,以及对细节的斟酌处理,都使我的能力得到了锻炼,我的各面经验都得到了极大的丰富。

“课程设计是培养学生综合运用所学知识、发现、提出、分析和解决实际问题锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。

”在这次课程设计的过程中,我深深地体会到了理论与实践结合的过程,当实践成功时的成就感,从整个过程中我受益匪浅。

六、附录#include<stdio.h>#include <stdlib.h>#include<string.h>#include<math.h>#define size 1 //停车场位置数//模拟停车场的堆栈的性质;typedef struct zanlind{int number; //汽车车号float ar_time; //汽车到达时间}zanInode;typedef struct{zanInode *base; //停车场的堆栈底zanInode *top; //停车场的堆栈顶int stacksize_curren;}stackhead;//堆栈的基本操作;void initstack(stackhead &L) //构造一个空栈L {L.base=(zanInode*)malloc(size*sizeof(zanlind)); if(!L.base) exit(0); //存储分配失败L.top=L.base;L.stacksize_curren=0;}void push(stackhead &L,zanInode e) //插入元素e为新的栈顶元素{*L.top++=e;L.stacksize_curren++;}void pop(stackhead &L,zanInode &e) //若栈不为空,删除L的栈顶元素,用e返回其值{if(L.top==L.base){printf("停车场为空!!");return;}e=*--L.top;L.stacksize_curren--;}//模拟便道的队列的性质;typedef struct duilie{int number; //汽车车号float ar_time; //汽车到达时间struct duilie *next;}*queueptr;typedef struct{queueptr front; //便道的队列的对头queueptr rear; //便道的队列的队尾int length;}linkqueue;//队列的基本操作;void initqueue(linkqueue &q) //构造一个空队列q{q.front=q.rear=(queueptr)malloc(sizeof(duilie));if(!q.front||!q.rear)exit(0); //存储分配失败q.front->next=NULL;q.length=0;}void enqueue(linkqueue &q,int number,int ar_time) //把元素的插入队列尾(属性为number,ar_time){queueptr p;p=(queueptr)malloc(sizeof(duilie));if(!p) exit(0); //存储分配失败p->number=number;p->ar_time=ar_time;p->next=NULL;q.rear->next=p;q.rear=p;q.length++;}void popqueue(linkqueue &q,queueptr &w) //删除q的队头元素w(属性为number,ar_time){queueptr p;if(q.front==q.rear){printf("停车场通道为空");return;}p=q.front->next;w=p;q.front->next=p->next;q.length--;if(q.rear==p) q.front=q.rear;}float shijiancha(float x,float y) //求时间差的子程序{int shix,shiy,fenx,feny;float shijiancha;shix=x;shiy=y;fenx=(int)((x-shix)*100);feny=(int)((y-shiy)*100);if(fenx>feny){shijiancha=(shiy-shix-1)+(float)(feny+60-fenx)/100;}elseshijiancha=(shiy-shix)+(float)(feny-fenx)/100;return shijiancha;void jinru(stackhead &st,linkqueue &q) //对进入停车场的汽车的处理;{int number;float time_a;printf("请输入车牌号:");scanf("%d" ,&number);printf("请输入您进车场的时间(比如说:8点半则输入8.30):"); scanf("%f",&time_a); if(st.stacksize_curren<2){zanInode e;e.number=number;e.ar_time=time_a;push(st,e);printf("请把你的车停在%d号车道\n\n",st.stacksize_curren);}else{enqueue(q,number,time_a);printf("停车场已满,请把你的车停在便道的第%d个位置上",q.length);}}void likai(stackhead &st,stackhead &sl,linkqueue &q) //对离开的汽车的处理;{ //st 堆栈为停车场,sl 堆栈为倒车场int number,flag=1; //q 为便道队列float sh,time_d,arrivaltime,money1;printf("请输入您的车牌号:"); scanf("%d",&number);printf("请输入您出车场的时间(比如说:8点半则输入8.30):"); scanf("%f",&time_d); zanInode e,q_to_s;queueptr w;while(flag) //找到要开出的车,并弹出停车场栈{pop(st,e);push(sl,e);if(e.number==number){flag=0;arrivaltime=e.ar_time;sh=shijiancha(arrivaltime,time_d);money1=(int)sh*2+(sh-(int)sh)*100/30;}pop(sl,e); //把临时堆栈的第一辆车(要离开的)去掉;while(sl.stacksize_curren) //把倒车场的车倒回停车场{pop(sl,e);push(st,e);}if(st.stacksize_curren<2&&q.length!=0) //停车场有空位,便道上的车开进入停车场{popqueue(q,w);q_to_s.ar_time=time_d;q_to_s.number=w->number;push(st,q_to_s);printf("车牌为%d 的车已从通道进入停车场, 所在的停车位为%d:\n",q_to_s.number,st.stacksize_curren);}printf("\n 收据");printf("车牌号:%d\n",number);printf("++++++++++++++++++++++++++++++\n");printf(" 进车场时间:%4.2f\n",arrivaltime);printf(" 出车场时间:%4.2f\n",time_d);printf(" 停留时间:%4.2f\n",sh);printf(" 应付(元) %4.2f\n",money1);printf("++++++++++++++++++++++++++++++\n\n");}void main(){int m=100;char flag; //进入或离开的标识;stackhead sting,slinshi; //停车场和临时倒车场堆栈的定义;linkqueue line; //队列的定义;initstack(sting); //构造停车场堆栈stinginitstack(slinshi); //构造倒车场堆栈slinshiinitqueue(line); //构造便道队列linewhile(m){printf("\n ******************停车场管理程序*************** ");printf("\n*========================================== =================*");printf("\n*温馨提示:请车主在24:00之前来取车,给您带来的不便,敬请原谅!*");printf("\n* 1 *** 汽车进车场 2 *** 汽车出车场 3 *** 退出程序*");printf("\n*========================================== =================*");printf("\n 请输入您需要的服务的代号(1、2、3),!\n");scanf("%c",&flag);switch(flag){case '1': jinru(sting,line);break; //汽车进车场case '2': likai(sting,slinshi,line);break; //汽车出车场case '3': exit(0);}m--;}}。

相关主题