数据结构课程设计报告停车场管理系统c++.docx
《数据结构课程设计报告停车场管理系统c++.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告停车场管理系统c++.docx(42页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告停车场管理系统c++
科技大学
数据结构
课程设计
题目停车场管理器设计
院系信息工程学院
专业计算机科学与技术
姓名马小强
学号1167111103
指导教师康懿
2013年7月5日
科技大学课程设计任务书
课程名称
数据结构课程设计
设计题目
停车场管理器设计
指导教师
康懿
时间
2013.6.24——2013.7.5
一、教学要求
1.掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力
2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能
3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力
4.训练用系统的观点和软件开发一般规进行软件开发,培养软件工作者所应具备的科学的工作方法和作风
二、设计资料及参数
每个学生在教师提供的课程设计题目中任意选择一题,独立完成,题目选定后不可更换。
停车场管理器设计
以结构体类型表示停车时间和车辆信息,在此基础上借助栈完成对车辆的入场和出场操作,借助队列完成辅助停车场便道,即存放等待入场车辆或辅助车场中的某辆车出场。
要求设计类(或类模板)来描述栈、队列、停车场及其操作,包含必要的构造函数和析构函数,以及其他能够完成如下功能的成员函数:
v压栈、退栈
v入队列、出队列
v车辆到场(有车位即入场,否则入便道等待)、车辆出场(任意位置车辆均可出场)
v查询车辆信息、输出停车场(包括停车位和便道的车辆)
并设计主函数测试该类。
三、设计要求及成果
1.分析课程设计题目的要求
2.写出详细设计说明
3.编写程序代码,调试程序使其能正确运行
4.设计完成的软件要便于操作和使用
5.设计完成后提交课程设计报告
四、进度安排
资料查阅与讨论(1天)
系统分析(2天)
系统的开发与测试(5天)
编写课程设计说明书和验收(2天)
五、评分标准
1.根据平时上机考勤、表现和进度,教师将每天点名和检查
2.根据课程设计完成情况,必须有可运行的软件。
3.根据课程设计报告的质量,如有雷同,则所有雷同的所有人均判为不及格。
4.根据答辩的情况,应能够以清晰的思路和准确、简练的语言叙述自己的设计和回答教师的提问
六、建议参考资料
1.《数据结构(C语言版)》严蔚敏、吴伟民主编清华大学出版社2004.11
2.《数据结构课程设计案例精编(用C/C++描述)》,建学等编著,清华大学出版社2007.2
3.《数据结构:
用面向对象方法与C++语言描述》,殷人昆主编, 清华大学出版社2007.6
第一章、需求分析
根据题目要求,充分地分析和理解问题,描述系统的功能要求,明确问题要求做什么?
以及限制条件是什么?
第一节、问题描述
随着我国人民生活水平提高和汽车工业的高速发展.越来越多的家庭拥有了汽车,但受到土地的限制,所以采用立体停车场是解决停车难的必然出路。
立体停车场占地少,容量大.利用效率高;泊车与取车全自动化,省时省力,安全防盗。
本文主要以两层停车场为例,设计一能完成存车与取车的停车场系统。
有一个两层的停车场, 每层有6个车位, 当第一层车停满后才允许使用第二层. ( 停车场可用一个二维数组实现, 每个数组元素存放一个车牌号 ) 每辆车的信息包括车牌号、 层号、 车位号、停车时间共4项, 其中停车时间按分钟计算。
假设停车场初始状态为第一层已经停有4辆车, 其车位号依次为1—4 , 停车时间依次为20, 15, 10 , 5 . 即先将这四辆车的信息存入文件”car.dat”中( 数组的对应元素也要进行赋值 )。
停车操作:
当一辆车进入停车场时, 先输入其车牌号, 再为它分配一个层号和一个车位号, 停车时间设为5 , 最后将新停入的汽车的信息添加文件”car.dat”中, 并将在此之前的所有车的停车时间加5。
收费管理(取车):
当有车离开时, 输入其车牌号, 先按其停车时间计算费用, 每5分钟0.2元. (停车费用可设置一个变量进行保存), 同时从文件”car.dat”中删除该车的信息, 并将该车对应的车位设置为可使用状态(即二维数组对应元素清零). 按用户的选择来判断是否要输出停车收费的总计。
第二节、基本要求
输入的形式和输入值的围
程序以车牌号作为车主的身份验证,以真实的汽车车牌号为准,当取车或停车时,需输入车牌号,输入字段长7位。
输出的形式
用户:
当车主存车时,要求显示空闲的车位,方便车主在层选择(层间要满足,如果第一层有空则必须停在第一层)。
当车主取车时,可以根据客户选择,决定是否输出凭据。
管理员:
能够查询全部车辆的信息。
程序所能达到的功能
用户存车:
包括查找空位,选择车位;用户取车:
包括出车,显示凭据。
更改停车场的状态。
停车场管理员:
初始化停车场,查询所有车的停车信息(历史停车信息),进行一定的查询功能。
第二章、概要设计
第一节、设计思想
本停车场有两层, 每层有6个车位, 所以 停车场可用一个二维数组实现,用来描述现停汽车的信息。
每辆车用一结构体表示,包括车牌号、 层号、 车位号、停车时间和停车标志位(标志是否停车)。
当车入库时,将更改二维数组的信息,当车出库时,将信息写入car.dat中。
再次进入该系统时,还用这个二维数组,来接受car.dat数据的读入,便于用户以后的操作,防止停车信息的流失。
此外,由于需要显示所有汽车的停车信息,所以我们又加了一个顾客结构体,一个顾客链表,当存车时,新建用户节点,并使用头插法,插于链表(便于取车时查到用户,补充完整用户的信息),填写用户的相关信息(车牌号,层号,车位号,车入库时刻)。
当出库时,查找相应节点,补充完整用户信息,包括(用户留言,停车时间总计,花费)。
当退出系统后,将已出库的汽车的车主信息,写入历史文件list.dat中,便于管理员的查询。
将还未取走车的车主的信息存入临时文件temp.dat中,防止系统关闭后数据信息的丢失,车主取车时找不到车。
第二节、数据结构
结构体Car,保存每个车位的停车信息。
结构体Snode,保存每个客户的信息。
结构体User,保存管理员信息。
结构体Date,保存时间。
数组Cars,保存整个停车状况。
链表CustList,保存所有客户的信息,包括车已取走,和车未取走的。
第三节、程序模块
(1)此停车场管理系统,主要分为以下若干模块:
首先定义用来模拟停车的数组,用来保存顾客信息的链表,保存管理员信息的结构以及全局变量,然后编写主函数,在此主函数中实现对其它各个模块的调用。
在主函数中首先调用option()函数,出现欢迎用户使用的界面,然后提示用户进入此停车场管理系统后,再出现一个供用户选择的主界面(包括顾客界面和停车场管理员管理界面)。
当用户选择顾客界面时,跳入到顾客界面,再次界面,用户可以选择存车、取车及返回主页面。
在用户的选择过程中,程序又分别存车,取车函数调用以及退出程序这三个函数模块。
其中,当存车时,调用了显示空闲车位状态的信息函数,并调用了保存car.dat的函数;当取车时,调用显示本次停车情况以及消费金额的函数,并调用了保存car.dat的函数。
最后,在主界面选择“退出”,保存历史文件list.dat和临时文件temp.dat。
当用户选择车管系统时,调用管理员身份验证函数,从而跳入车管界面,然后相应的功能函数,实现查询所有停车信息。
(2)在以上各个模块中,出现的调用的函数为:
//—————————客户————————
voidCustomer(Carcars[FLOOR][PNUMBER]);
voidCustomerNote(charnote[100],CustList*cl);//存车
intEnterpark(Carcars[FLOOR][PNUMBER],char*license,int&floor,int&pnumber);
voidGetDate(Date&date);
boolIsFull(Carcars[FLOOR][PNUMBER]);
boolIsSame(Carcars[FLOOR][PNUMBER],char*license);//取车
intCarOutMenu(charlicense[],int&floor,int&pnumber,int&ptime,float&cost,charnote[100]);
boolIsEmpty(Carcars[FLOOR][PNUMBER]);
voidPrint(charlicense[],intfloor,intpnumber,intptime,float&cost);
voidLeavepark(Carcars[FLOOR][PNUMBER],charlicense[],int&floor,int&pnumber,int&ptime,charnote[100]);
//-----------------------后台管理---------------------------
voidManage(Carcars[FLOOR][PNUMBER]);//保存到car.dat
voidSavecars(Carcars[FLOOR][PNUMBER]);
voidFourCarIn(CarCars[FLOOR][PNUMBER]);//初始停车场
intUsertestAdd();//管理员身份验证
voidLoad(Carcars[FLOOR][PNUMBER]);//加载文件
voidLoadfile(Carcars[FLOOR][PNUMBER],charlicense[8],intfloor,intpnumber,intptime,intempty);
voidShowcars(Carcars[FLOOR][PNUMBER],CustList*cl);//显示停车场现存车
voidMessage(CustList*clr);//显示客户信息
voidNews();//发布消息
voidIncome(CustList*cl,charday[],float&amount);//一些查询
voidCheckOneCar(CustList*clr,char*license);//后台中关于单链表的
voidInitCustList(CustList*&cl);
voidInsertToFirst(CustList*cl,char*license,intfloor,intpnumber,Datedate);
voidInsertToLst(CustList*cl,char*license,intfloor,intpnumber,intptime,floatcost,Datedate);
voidSearchCust(CustList*&cl,char*license,floatcost,intptimecount,charnote[]);
voidSaveListTemp(CustList*cl);//保存到temp.dat
voidSaveList(CustList*cl);//保存到list.dat
voidDeleteAll(CustList*cl);
voidReadFromList(CustList*cl);
voidLoadList(CustList*clr);
voidDeleteByNote(CustList*cl);
(3)各模块之间的调用关系以及算法设计
下图是个模块之间的调用关系(如图2-1):
进入主页面
客户界面
停车场管理员界面
存车
界面
取车
界面
返回主页
初始停车场
一个客户
每天收入
客户信息
车辆
信息
退出
输入车牌号
满
显示车位,客户选择
车牌有效
退出
退出
输入车牌号
退出
显示凭据
客户留言
返回主页
否
是
注:
在取、存操作后,会自动保存信息到car.dat中。
在每次退出系统时,会保存list.dat和temp.dat。
图2-1模块调用关系
第三章、详细设计
实现概要设计中定义的所有数据类型,对主要操作写出实现算法,对主程序和其他模块写出算法,写出函数的调用关系。
第一节、数据类型
结构体Car,保存每个车位的停车信息。
structCar
{
charlicense[8];
intfloor;
intpnumber;
intptime;
intempty;//标志位,有车为1,无车为0
};
结构体Snode,保存每个客户的信息。
structSnode
{
charlicense[8];//车牌号
Datedate;//停车的时刻
intfloor;
intpnumber;
intptimecount;//本次停车总时间
floatcost;
charnote[100];//顾客留言
Snode*next;
};
结构体User,保存管理员信息。
structUser
{
charid[10];
charname[10];
charpassword[10];
};
结构体Date,保存时间。
structDate
{
charday[11];
charshike[9];
charweekday[10];
};
数组Cars,保存整个停车状况。
CarCars[FLOOR][PNUMBER];
链表,保存所有客户的信息,包括车已取走,和车未取走的。
typedefstructSnodeCustList;
第二节、主要操作
(1)存车:
intEnterpark(Carcars[FLOOR][PNUMBER],char*license,int&floor,int&pnumber)
{
//输入车牌号,判断车牌号的有效性
cout<<"请输入车牌号:
";
charlicen[8];
cin>>licen;
while((!
licen)||(strlen(licen)!
=7))
{
cout<<"输入有误!
请重新输入车牌号:
";
cin>>licen;
}
//查看是否有重复
while
(1)
{
if(IsSame(cars,licen)==1)
{
cout<<"已经存在这辆车,请重新输入:
"<cin>>licen;
}
elsebreak;
}
//判断车场是否已经满了
//查看是否有空位,并显示。
便于客户选择
inti,j;
if(IsFull(cars)==1)
{
cout<<"已经没有空车位了,谢谢惠顾!
正在跳转到顾客界面。
。
。
"<return0;
}
intsign=1;//sign标志第几层有空位0表一,1表二
cout<<"您可以选择的车位"<cout<<"----------------------------"<cout.setf(ios:
:
left);
cout.width(8);
cout<<"楼层";
cout.width(8);
cout<<"车位号";
cout<for(i=0;i{if(sign==0)break;
for(j=0;j{if((cars[i][j].empty==0)&&(i==0))
{
sign=0;
cout.setf(ios:
:
left);
cout.width(8);
cout<
cout.width(8);
cout<if(j==PNUMBER-1){break;}
}
elseif((cars[i][j].empty==0)&&(i==1))
{
cout.setf(ios:
:
left);
cout.width(8);
cout<
cout.width(8);
cout<}
}
}
cout<<"----------------------------"<inttemf;
cout<<"请输入车位号:
";
cin>>temf;
while
(1)
{
if((cars[sign][temf-1].empty==0)&&(temf>=1&&temf<=6))
{
//修改一个车位的信息
cars[sign][temf-1].empty=1;
floor=cars[sign][temf-1].floor=sign+1;
pnumber=cars[sign][temf-1].pnumber=temf;
strcpy(cars[sign][temf-1].license,licen);
strcpy(license,licen);
cars[sign][temf-1].ptime=0;
//修改整个停车场的信息
for(i=0;i{
for(j=0;j{
if(cars[i][j].empty==1)
cars[i][j].ptime+=5;
}
}
break;
}
else{
cout<<"输入有误!
请输入车位号"<cin>>temf;
}
}
return1;
}
(2)取车:
voidLeavepark(Carcars[FLOOR][PNUMBER],charlicense[],int&floor,int&pnumber,int&ptime,charnote[100])
{
//判断车位是否已空
if(IsEmpty(cars)==1)
{
cout<<"停车场已没有车停放!
请确定您是否停车。
"<return;
}
//查找车位
intsign=1;//标志位,车库有该车为1,没有赋值为零,初始值为0
inti,j;
while(sign)
{
for(i=0;i{
for(j=0;j{
if(strcmp(cars[i][j].license,license)==0)
{
sign=0;
floor=i;
pnumber=j;
ptime=cars[i][j].ptime;
}
}
}
if(sign)
{
cout<<"您刚才输入的车牌号不存在!
"<cout<<"请重新输入:
";
cin>>license;
}
}
if(sign==0)
cout<<"车已找到,请稍等。
。
。
"<strcpy(note,"0000000000");
floor+=1;
pnumber+=1;
//system("cls");
//延时
for(i=0;i<100000000;i++);
//车出库,将车位空出
cars[floor-1][pnumber-1].floor=0;
cars[floor-1][pnumber-1].pnumber=0;
cars[floor-1][pnumber-1].ptime=0;
cars[floor-1][pnumber-1].empty=0;
strcpy(cars[floor-1][pnumber-1].license,"");
//由于floor,pnumber与实际的二位数组有区别,加1
}
第四章、测试与分析
进行系统测试,输出测试结果。
测试数据应该全面、完整,并对测试结果进行分析。
第一节、调试过程中的主要问题
由于此停车场管理系统是分模块设计的,而且在程序的实现过程中又使用了清屏函数,所以,运行时用户选择任务并且执行完任务后,又会回到供用户选择功能的主界面,因此整个程序从整体上来讲结构清晰,使用方便。
本程序的调试运行,总体上情况良好,但中间也出现了一些小问题。
其中比较有代表性的主要问题有:
第二节、测试结果的分析与讨论
1主界面(如图4-1)
图4-1系统主界面
2客户界面(如图4-2)
图4-2客户界面
3存车(如图4-3)
图4-3存车界面
4取车(如图4-4)
图4-4取车界面
5管理员界面(如图4-5)
图4-5管理员界面
第五章、用户使用说明
1、进入主界面
2、选择:
(1)客户界面;
(2)停车场管理员界面;
(3)退出;
3、进入客户界面
(1)、停车,填写车牌号等信息然后返回;
(2)、取车,输入车牌号和自己的信息,出示凭据,可以进行评价,然后返回主页;
4、进入停车场管理员界面
(1)、查看停车场初始化信息;
(2)、选择车辆,查看它的详细信息;
(3)、进一步查看客户的信息;
(4)、清点一天的收入;
(5)、返回主页,退出;
第六章、总结
在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情的方法和技巧。
在设计过程中,和同学们相互探讨,相互学习。
我学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世,这次课程设计对我来说受益良多。
课程设计是我们专业课程知识综合应用的实践训练,这是我们迈向社会,从事职业工作前一个必不少的过程.“千里之行始于足下”通过这次课程设计,我深深体会到这句千古名言的真正含义.我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础。
我这次设计的科目是数据结。
数据结构,是一门研究非数值计算的程序设计问题中计算机的操作对象(数据元素)以及它们之间的关系和运算等的学科,而且确保经过这些运算所得到的新结构仍然是原来的结构类型。
作为一门独立的课程在国外是从1968年才开始设立的。
1968年美国唐欧克努特教授开创了数据结构的最初体系,他所著的《计算机程序设计技巧》第一卷《基本算法》是第一本较系统地阐述数据的逻辑结构和存储结构及其操作的著作“数据结构”在计算机科学中是一门综合性的专业基础课。
数据结构是介于数学、计算机硬件和计算机软件三者之间的一门核心课程。
数据结构这一门课的容不仅是一般程序设计(特别是非数值性程序设计)的基础,而且是设计和实现编译程序、操作系统、数据库系统及其他系统程序