1、内蒙古科技大学课程设计论文内蒙古科技大学数据结构课 程 设 计题目停车场管理器设计院 系 信息工程学院专业 计算机科学与技术姓 名 马小强学 号 1167111103指 导 教 师 康懿 2013年7月5日内蒙古科技大学课程设计任务书课程名称数据结构课程设计设计题目停车场管理器设计指导教师康懿时间2013。6.24-2013.7。5一、教学要求1。 掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力2。 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能3。 提高综合运用所学的理论知识和方法独立分析和解决问题的能力4。 训练用系统的观点和软件开发一般规范进行软件开
2、发,培养软件工作者所应具备的科学的工作方法和作风二、设计资料及参数每个学生在教师提供的课程设计题目中任意选择一题,独立完成,题目选定后不可更换。停车场管理器设计以结构体类型表示停车时间和车辆信息,在此基础上借助栈完成对车辆的入场和出场操作,借助队列完成辅助停车场便道,即存放等待入场车辆或辅助车场中的某辆车出场。要求设计类(或类模板)来描述栈、队列、停车场及其操作,包含必要的构造函数和析构函数,以及其他能够完成如下功能的成员函数:v 压栈、退栈v 入队列、出队列v 车辆到场(有车位即入场,否则入便道等待)、车辆出场(任意位置车辆均可出场)v 查询车辆信息、输出停车场(包括停车位和便道的车辆) 并
3、设计主函数测试该类。三、设计要求及成果1. 分析课程设计题目的要求2. 写出详细设计说明3. 编写程序代码,调试程序使其能正确运行4. 设计完成的软件要便于操作和使用5. 设计完成后提交课程设计报告四、进度安排资料查阅与讨论(1天)系统分析(2天)系统的开发与测试(5天)编写课程设计说明书和验收(2天)五、评分标准1。 根据平时上机考勤、表现和进度,教师将每天点名和检查2。 根据课程设计完成情况,必须有可运行的软件。3. 根据课程设计报告的质量,如有雷同,则所有雷同的所有人均判为不及格。4。 根据答辩的情况,应能够以清晰的思路和准确、简练的语言叙述自己的设计和回答教师的提问六、建议参考资料1数
4、据结构(C语言版)严蔚敏、吴伟民主编清华大学出版社 2004.112数据结构课程设计案例精编(用C/C+描述),李建学 等 编著,清华大学出版社 2007。23.数据结构:用面向对象方法与C+语言描述,殷人昆主编,清华大学出版社 2007。6目录目录2第一章、需求分析3第一节、问题描述3第二节、基本要求3第二章、概要设计4第一节、设计思想4第二节、数据结构4第三节、程序模块5第三章、详细设计8第一节、数据类型8第二节、主要操作9第四章、测试与分析14第一节、调试过程中的主要问题14第二节、测试结果的分析与讨论14第五章、用户使用说明18第六章、总结18第七章、发现问题及错误分析20第一节、逻辑
5、错误函数20第二节、修改前得代码20第三节、错误描述20第四节、解决方案如下22第八章、参考文献23附录代码:24第一章、需求分析根据题目要求,充分地分析和理解问题,描述系统的功能要求,明确问题要求做什么?以及限制条件是什么?第一节、问题描述随着我国人民生活水平提高和汽车工业的高速发展越来越多的家庭拥有了汽车,但受到土地的限制,所以采用立体停车场是解决停车难的必然出路。立体停车场占地少,容量大利用效率高;泊车与取车全自动化,省时省力,安全防盗.本文主要以两层停车场为例,设计一能完成存车与取车的停车场系统。有一个两层的停车场,每层有6个车位,当第一层车停满后才允许使用第二层。(停车场可用一个二维
6、数组实现,每个数组元素存放一个车牌号)每辆车的信息包括车牌号、层号、车位号、停车时间共4项,其中停车时间按分钟计算 。假设停车场初始状态为第一层已经停有4辆车,其车位号依次为14,停车时间依次为20,15,10,5.即先将这四辆车的信息存入文件”car。dat中(数组的对应元素也要进行赋值) 。停车操作:当一辆车进入停车场时,先输入其车牌号,再为它分配一个层号和一个车位号,停车时间设为5,最后将新停入的汽车的信息添加文件car.dat中,并将在此之前的所有车的停车时间加5.收费管理(取车):当有车离开时,输入其车牌号,先按其停车时间计算费用,每5分钟0。2元。(停车费用可设置一个变量进行保存)
7、,同时从文件”car.dat中删除该车的信息,并将该车对应的车位设置为可使用状态(即二维数组对应元素清零)。按用户的选择来判断是否要输出停车收费的总计。第二节、基本要求输入的形式和输入值的范围程序以车牌号作为车主的身份验证,以真实的汽车车牌号为准,当取车或停车时,需输入车牌号,输入字段长7位。输出的形式用户:当车主存车时,要求显示空闲的车位,方便车主在层内选择(层间要满足,如果第一层有空则必须停在第一层).当车主取车时,可以根据客户选择,决定是否输出凭据。管理员:能够查询全部车辆的信息.程序所能达到的功能用户存车:包括查找空位,选择车位;用户取车:包括出车,显示凭据.更改停车场的状态。停车场管
8、理员:初始化停车场,查询所有车的停车信息(历史停车信息),进行一定的查询功能.第二章、概要设计第一节、设计思想本停车场有两层,每层有6个车位,所以停车场可用一个二维数组实现,用来描述现停汽车的信息。每辆车用一结构体表示,包括车牌号、层号、车位号、停车时间和停车标志位(标志是否停车)。当车入库时,将更改二维数组的信息,当车出库时,将信息写入car。dat中。再次进入该系统时,还用这个二维数组,来接受car.dat数据的读入,便于用户以后的操作,防止停车信息的流失.此外,由于需要显示所有汽车的停车信息,所以我们又加了一个顾客结构体,一个顾客链表,当存车时,新建用户节点,并使用头插法,插于链表(便于
9、取车时查到用户,补充完整用户的信息),填写用户的相关信息(车牌号,层号,车位号,车入库时刻)。当出库时,查找相应节点,补充完整用户信息,包括(用户留言,停车时间总计,花费).当退出系统后,将已出库的汽车的车主信息,写入历史文件list.dat中,便于管理员的查询。将还未取走车的车主的信息存入临时文件temp。dat中,防止系统关闭后数据信息的丢失,车主取车时找不到车。第二节、数据结构结构体Car,保存每个车位的停车信息。结构体Snode ,保存每个客户的信息。结构体User,保存管理员信息。结构体Date,保存时间.数组Cars,保存整个停车状况。链表CustList,保存所有客户的信息,包括
10、车已取走,和车未取走的.第三节、程序模块(1)此停车场管理系统,主要分为以下若干模块:首先定义用来模拟停车的数组,用来保存顾客信息的链表,保存管理员信息的结构以及全局变量,然后编写主函数,在此主函数中实现对其它各个模块的调用。在主函数中首先调用option()函数,出现欢迎用户使用的界面,然后提示用户进入此停车场管理系统后,再出现一个供用户选择的主界面(包括顾客界面和停车场管理员管理界面).当用户选择顾客界面时,跳入到顾客界面,再次界面,用户可以选择存车、取车及返回主页面。在用户的选择过程中,程序又分别存车,取车函数调用以及退出程序这三个函数模块。其中,当存车时,调用了显示空闲车位状态的信息函
11、数,并调用了保存car.dat的函数;当取车时,调用显示本次停车情况以及消费金额的函数, 并调用了保存car。dat的函数。最后,在主界面选择“退出”,保存历史文件list。dat和临时文件temp.dat.当用户选择车管系统时,调用管理员身份验证函数,从而跳入车管界面,然后相应的功能函数,实现查询所有停车信息.(2)在以上各个模块中,出现的调用的函数为:/- 客 户 -void Customer(Car carsFLOORPNUMBER);void CustomerNote(char note100,CustList cl);/存车int Enterpark(Car carsFLOORPNU
12、MBER,char license,int &floor,int pnumber);void GetDate(Date date);bool IsFull(Car carsFLOORPNUMBER);bool IsSame(Car carsFLOORPNUMBER,char license);/取车int CarOutMenu(char license,int floor,int &pnumber,int ptime,float cost,char note100);bool IsEmpty(Car carsFLOORPNUMBER);void Print(char license,int f
13、loor,int pnumber,int ptime,float &cost);void Leavepark(Car carsFLOORPNUMBER,char license,int &floor,int pnumber,int ptime,char note100);/-后台管理-void Manage(Car carsFLOORPNUMBER); /保存到car。datvoid Savecars(Car carsFLOORPNUMBER);void FourCarIn(Car CarsFLOORPNUMBER); /初始停车场int UsertestAdd();/管理员身份验证void
14、Load(Car carsFLOORPNUMBER); /加载文件void Loadfile(Car carsFLOORPNUMBER,char license8,int floor,int pnumber,int ptime,int empty);void Showcars(Car carsFLOORPNUMBER,CustList cl); /显示停车场现存车void Message(CustList clr); /显示客户信息void News();/发布消息void Income(CustList cl,char day,float amount); /一些查询void CheckOn
15、eCar(CustList *clr,char *license);/后台中关于单链表的void InitCustList(CustList &cl);void InsertToFirst(CustList *cl,char license,int floor,int pnumber,Date date);void InsertToLst(CustList cl,char *license,int floor,int pnumber,int ptime,float cost,Date date);void SearchCust(CustList *cl,char *license,float
16、cost,int ptimecount,char note);void SaveListTemp(CustList *cl);/保存到temp。datvoid SaveList(CustList cl); /保存到list.datvoid DeleteAll(CustList *cl);void ReadFromList(CustList cl);void LoadList(CustList *clr);void DeleteByNote(CustList cl);(3)各模块之间的调用关系以及算法设计下图是个模块之间的调用关系(如图21):退出停车场管理员界面显示凭据客户留言返回主页输入车牌
17、号退出退出显示车位,客户选择车牌有效输入车牌号退出一个客户每天收入客户信息车辆信息初始停车场返回主页存车界面取车界面客户界面进入主页面否是满注:在取、存操作后,会自动保存信息到car.dat中。在每次退出系统时,会保存list.dat和temp.dat。图2-1模块调用关系第三章、详细设计实现概要设计中定义的所有数据类型,对主要操作写出实现算法,对主程序和其他模块写出算法,写出函数的调用关系.第一节、数据类型结构体Car,保存每个车位的停车信息.struct Carchar license8;int floor;int pnumber;int ptime;int empty;/标志位,有车为1
18、,无车为0;结构体Snode ,保存每个客户的信息。struct Snodechar license8;/车牌号Date date;/停车的时刻int floor;int pnumber;int ptimecount;/本次停车总时间float cost;char note100;/顾客留言Snode next;;结构体User,保存管理员信息.struct Userchar id10;char name10;char password10;结构体Date,保存时间.struct Datechar day11;char shike9;char weekday10;;数组Cars,保存整个停车状
19、况。Car CarsFLOORPNUMBER;链表,保存所有客户的信息,包括车已取走,和车未取走的.typedef struct SnodeCustList;第二节、主要操作(1)存车:int Enterpark(Car carsFLOORPNUMBER,char license,int floor,int pnumber)/输入车牌号,判断车牌号的有效性cout”请输入车牌号:”;char licen8;cinlicen;while(!licen)(strlen(licen)!=7)cout”输入有误!请重新输入车牌号:;cinlicen;/查看是否有重复while(1)if(IsSame(
20、cars,licen)=1)cout”已经存在这辆车,请重新输入:endl;cinlicen;else break;/判断车场是否已经满了/查看是否有空位,并显示.便于客户选择int i,j;if(IsFull(cars)=1)cout”已经没有空车位了,谢谢惠顾!正在跳转到顾客界面。”endl;return 0;int sign=1;/sign 标志第几层有空位0表一,1表二cout”您可以选择的车位endl;cout”-”endl;cout.setf(ios:left);cout.width(8);cout”楼层;cout.width(8);cout车位号”;coutendl;for(i=
21、0;iFLOOR;i+)if(sign=0) break;for(j=0;jPNUMBER;j+)if((carsij。empty=0)&(i=0)sign=0;cout。setf(ios::left);cout。width(8);couti+1;cout。width(8);coutj+1endl;if(j=PNUMBER1) break;else if((carsij。empty=0)(i=1))cout.setf(ios:left);cout。width(8);couti+1;cout.width(8);coutj+1endl;cout-endl;int temf;couttemf;whi
22、le(1)if((carssigntemf-1.empty=0)&(temf=1temf=6))/修改一个车位的信息carssigntemf1。empty=1;floor=carssigntemf-1。floor=sign+1;pnumber=carssigntemf1。pnumber=temf;strcpy(carssigntemf1。license,licen);strcpy(license,licen);carssigntemf-1。ptime=0;/修改整个停车场的信息for(i=0;iFLOOR;i+)for(j=0;jPNUMBER;j+)if(carsij。empty=1)car
23、sij.ptime+=5;break;else couttemf;return 1;(2)取车:void Leavepark(Car carsFLOORPNUMBER,char license,int floor,int pnumber,int ptime,char note100)/判断车位是否已空if(IsEmpty(cars)=1) cout”停车场已没有车停放!请确定您是否停车.endl;return;/查找车位int sign=1;/标志位,车库有该车为1,没有赋值为零,初始值为0int i,j;while(sign)for(i=0;iFLOOR;i+)for(j=0;jPNUMBE
24、R;j+)if(strcmp(carsij。license,license)=0)sign=0;floor=i;pnumber=j;ptime=carsij.ptime;if(sign)cout您刚才输入的车牌号不存在!”endl;coutlicense;if(sign=0) cout#include stdlib.hinclude #define FLOOR 2define PNUMBER 6struct Carchar license10;int floor;int pnumber;int ptime;int empty;/标志位,有车为1,无车为0;/顾客信息节点struct Custo
25、merchar license10;/车牌号char date64;/停车的时刻int ptimecount;/本次停车总时间float cost;char note100;/顾客留言Customer next;;/顾客信息链表typedef Customer CustList;/管理员struct Userchar id10;char name10;char password10;int UsertestAdd();void Load(Car cars26);void Loadfile(Car cars26,char license10,int floor,int pnumber,int p
26、time,int empty);void FourCarIn(Car Cars26);void Enterpark(Car cars26);void Showcars(Car cars26);void Savecars(Car cars26);bool IsEmpty(Car cars26);void Print(char license,int floor,int pnumber,int ptime,float &cost);void Leavepark(Car cars26,char license,int floor,int pnumber,int ptime,float cost,ch
27、ar note100);void CarOutMenu(char license,int floor,int pnumber,int &ptime,float cost,char note100);void Manage(Car cars26);void InitCustList(CustList cl);void CreateCustList(CustList cl,char *license);void GetDate(char tmp64);void SearchCust(CustList cl,char *license,float cost,int pcount);void Cust
28、omer(Car cars26);void CustomerNote(char note100);void EachGuideInfor(Car c);/游客个人信息的自我查询void EachGuideInfor(Car c)cout。setf(ios:left);cout.width(10);cout车牌号;cout。width(8);cout楼层”;cout.width(8);cout车位号”;cout。width(8);cout停车开始时间endl;cout.setf(ios:left);cout。width(10);coutc。license;cout。width(8);coutc。
29、floor;cout。width(8);coutc。pnumber;cout。width(8);coutc。ptimeendl;/顾客留言void CustomerNote(char note100)cout”请留言:;cinnote;/存车void Enterpark(Car cars26)cout”input your license”licen;while(!licen)cout”input your license”endl;cinlicen;/判断车库是否已经满了,顺便将原来的ptime加5int i,j;for(i=0;i2;i+)for(j=0;j6;j+)if(carsij。empty=1)carsij。ptime +=5;elsecarsij。floor =i+1;carsij。pnumber =j+1;carsij.ptime=5;carsij.empty=1;strcpy(carsij。license,licen);return; /如果使用break,