程序设计_停车场管理系统汇总_第1页
程序设计_停车场管理系统汇总_第2页
程序设计_停车场管理系统汇总_第3页
程序设计_停车场管理系统汇总_第4页
程序设计_停车场管理系统汇总_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

1、- 程序设计报告( 2014 / 2015 学年 第 1 学期)题目:停车场管理系统专业组长学号姓名组员学号姓名指导教师指导单位日期成员分工组长()代码部分:取车、查询信息、修改停车费费率模块实验报告:测试数据和结果分析、调试过程中的问题- 组员()代码部分:管理员登陆模块实验报告:概要设计和课程小结组员()代码部分:停车模块的实现实验报告:课程内容和要求、需求分析评分细则评分项优秀良好中等差遵守机房规章制度上机时的表现学习态度程序准备情况程序设计能力团队合作精神课题功能实现情况算法设计合理性用户界面设计报告书写认真程度内容详实程度文字表达熟练程度回答问题准确度简短评语教师签名:年月日评分等级

2、备注评分等级共五种:优秀、良好、中等、及格、不及格停车场管理系统一、课题内容和要求- 停车场管理是一个计时收费系统,同时也是一个能对车位进行管理的系统,最基本的功能是实现停车、取车、查询以及修改停车费费率等功能。同时,为了使用的方便和安全的考虑设计了管理员能对密码进行修改的功能。在停车的功能中采用了文件流的形式,对车位、车牌号、车型都进行了保存,以便于查询功能的实现,除此之外,也是为了能够实现在取车模块中利用输入的车牌号自动计算出停车的费用。停车位第一个为空的位置,由程序查询自动给出车位号,如果车位已满要给出提示。取车时,需要根据车辆停泊时间自动计算费用(半小时内以半价计算,超出半小时不足一小

3、时按一小时计算)并显示在屏幕上,可以随时根据车牌查询是否入库。可以随时根据车位查询该位置上的相关信息。本系统对不同车型的费率给出了默认值,管理员可以根据实际需要对费率进行修改。功能要求:用 c/c+设计一个程序实现停车场管理系统,要求如下:(1) 管理人员根据口令进入系统;(2) 管理人员有权限对登陆账号和密码进行修改;(3) 管理车位信息(车位编号,状态)和每小时的收费费率;(4) 停车时录入汽车停泊信息(车牌号,车型,停泊位置,停泊开始时间);如果车位已满要给出提示;(5) 取车时,根据车牌取,如果没有给出提示;需要根据车辆停泊时间自动计算费用并显示在屏幕上。(6) 管理人员可以根据需要随

4、时更改每小时的收费费率。二、需求分析停车场管理系统的功能框架图如图1 所示。- 图 1 功能框架图(1)系统主要包括了管理员登陆、停车操作、取车操作、信息查询、费率修改这五大模块,每个模块都用用相应的函数来实现这些功能。(2)在管理员登陆模块中,设置了三次输入机会,用户名和密码事先用文档存储,供使用者进入系统;若管理员连续输入密码错误超过提示,则系统给出修改密码或者退出系统的提示,这些功能在函数名为loadin()的函数中实现。(3)管理员登陆模块结束之后便到了系统的主要界面,选择操作1 是停车模块。在选择停车操作之后,系统能够实现“将第一个为空的位置,由程序查询自动给出车位号,如果车位已满要

5、给出提示”这一功能用函数compare()和 jugement()共同实现的。进入停车模块后,还应选择不同的车型进行停车,这一过程会调用putcar ()和 gettime ()函数,用来给出不同车型的费率和调用停车时的系统时间。(4)通常选择了停车操作之后取车和查询功能才会有意义,所以取车和查询公共主要是使用了 campare()函数,调用strcmp()字符串比较函数对输入的车牌号和停车时的车牌号进行比较,若相同,则返回该车位,达到取车和查询的作用。(5)不同的停车场可以根据需要修改每种车型的车辆对应的费率。这个功能在修改费率的模块中实现。(6)根据不同的车型以及其停泊时间收费,间差乘以单

6、价就是最后收费,其中取车时,需要根据车辆停泊时间自动计算费用(半小时内以半价计算,超出半小时不足一小时按一小时计算)并显示在屏幕上。这个功能需要调用系统时间,因此在整个程序中包含了头文- 件后( #include)利用结构这种数据类型来实现。三、概要设计1. 主要结构体为了实现停车场管理系统的停车、取车、查询、修改功能,主要用一个while 循环,通过输入的数字选择相应的操作。同时为了实现每个模块的功能, 引用一些相应的子函数。下面是主要结构体的流程图:图 2 主要结构体流程图2. 主要函数流程图(1)管理员登陆模块管理员登陆模块是用函数loadin()来实现的,在loadin()函数中对账号

7、和密码都- 有三次的输入机会, 用变量 ai 来记录输入的次数, 当 ai=3 时,进入修改密码的界面。在修改密码模块了,用strcpy()函数将输入的字符串adpassword1赋值给密码adpassword (adpassword为全局变量,所以才能起到修改的作用) 。修改完成密码后,在 loadin()函数中再次调用loadin()函数,这样在修改密码后就能重新回到登陆界面进行登陆,大体程序流程图如下:图 3 管理员登陆模块流程图(2)比较函数 compare()在停车场管理系统的取车、查询模块中都需要用到输入“车牌号判断停车场中是否有该车”这个功能,而compare ()函数就是用来实

8、现这个功能的。其大概思路是,通过输入的字符串与系统储存有的字符串进行比较,如果字符串相等就返回一个0,如果不相等就返回非0,而通过 0 和非 0 的控制,便能实现判断的功能,其流程图如下所示:- 图 4 字符串比较函数流程图(3)搜索空车位函数jugement ()对于停车操作来说,需要在所有停车位中找到第一个空车位,并返回这个车位。在该系统中,这个功能由函数jugement()来实现。设 int 型变量 j 为车位编号,利用数字 positionj 的值是否为 1,来判断是车位是否为空(这里是将1 视为有车, 0 为无车) 。图 5 搜索空车位函数流程图在这个函数中还要注意: 在用 whil

9、e 循环对每个车位进行逐个判断的时候,j 一定要小于停车场的总车位。除此之外,返回第一个空车位表示将要在这个车位进行停车,因此要重新将 positionj 的值置为 1。- 四、源程序代码#include #include #include #include using namespace std; class car public: char no10; int pos; double fee; void putcar(); void takecar(); void changefee(); ; class time public: int hour; int min; void getim

10、e(); ; char adpassword10=123456; char adname10=wcx; int i,poi; int position50=0;/ 全局变量car carin50; time catime50; double fee1=6.0, fee2=5.0, fee3=4.0 , fee4=3.0 ; int jugement(); int compare(); void search_no(); void search_position(); void loadin(); void main() /-管理员登陆模块 - loadin(); /-登陆模块结束 - int

11、k=0; - coutendl; cout请选择 : nnt- nnt1.停车操作 nnt2.取车操作 nnt3.查询信息 nnt4.修改车费 nnt5.退出 nnt-nn; ofstream outfile(车辆信息 .txt,ios:app); if(! outfile) cerropen error!k) if(k=1) i=jugement();/- 通过 jugement()函数返回第一个空的车位i cout- endl; coutcarini.no; /用户输入停在第 i 个车位的车牌号carini.putcar(); cout请选择 : nnt- nnt 1.停车操作 nnt 2

12、.取车操作 nnt 3.查询信息 nnt 4.修改车费 nnt 5.退出 nnt -nn; string time1; time_t t; time(&t); time1=ctime(&t); couttime1;/- 导入系统时间outfilecarini.no time1endl; continue; - if(k=2) poi=compare(); carinpoi.takecar(); cout请选择 : nnt- nnt 1.停车操作 nnt 2.取车操作 nnt 3.查询信息 nnt 4.修改车费 nnt 5.退出 nnt -nn; continue; if(k=3

13、) int x; while(1) cout请输入数字选择需要的操作:endl; coutendl; coutnnt- nnt1.查询车牌号 nnt2.查询车位 nnt3.退出查询 x; if(x=1) search_no(); break; else if(x=2) search_position(); break; else if(x=3) - break; else coutt 选择错误 ,请重新选择 :; cout请选择 : nnt- nnt 1.停车操作 nnt 2.取车操作 nnt 3.查询信息 nnt 4.修改车费 nnt 5.退出 nnt -nn; /outfile.close

14、(); if(k=4) carini.changefee(); continue; if(k=5) exit(0); /-loadin()- void loadin() char an10,ap10; int ai=0; cout - 欢迎使用 xx 停车场管理系统 -endl; while(1) coutendl; coutan; - if(strcmp(adname,an) cout此用户名不存在 !n; ai+; if(ai=3) exit(0); continue; else coutap; if(!strcmp(adpassword,ap) break; else cout密码错误

15、!n; ai+; if(ai=3) coutendl; cout密码连续输入错误3 次,请重新选择操作: endl; cout-endl; cout1.修改密码 endl; cout2.退出系统 endl; cout-k) if(k=1) cout请输入新的密码,密码不超过10 位数: adpassword1; strcpy(adpassword,adpassword1); cout你的新密码是: endl; coutadpasswordendl; loadin(); break; if(k=2) exit(0); if(k!=1&k!=2) cout输入错误,请重新输入:; retu

16、rn; - continue; cout登陆成功 ! endl; /- jugement() - int jugement() /- 判断出第一个空的车位 int j=0; while(positionj=1&j50) j+; cout 共有 50 个停车位,当前可使用停车位:50-jendl; coutendl; cout 本停车场收费标准如下:endl; coutendl; cout 货车每小时 fee1元,客车每小时 fee2元,轿车每小时 fee3元,其它车辆每小时 fee4元。endl; cout 注:停车时间小于30 分钟的按 0.5 个小时计算,超过30 分钟但不足 1

17、小时的按 1 个小时收费 endl; if(j50) positionj=1; / 当找到第一个空车位时(即 position=0时, 并且满足车位号 j100的情况下) ,然后选择该车位停车,/停车后将 position 重新置为 1,表示该车位现在已经停车了。 (在这种情况下表示找到空车位后就必须停在这个车位上)return j; /-compare()- int compare() char ch10; coutch; for(int k=0;k50;k+) if(!strcmp(ch,carink.no) / - 将输入的车牌号与停车场上的每个位子的车- 辆进行比较(包括那些没停车的车

18、位) if(positioncarink.pos-1=1) / 在 car:putcar()函数中因为要输出车位号,所以将对象数组 carink.pos 变为了 carink.pos+1,/ 于是用数组position找已经停车的车位时要将其处理为 carink.pos-1 return (carink.pos-1); break; if(k=50) return k; /- car:putcar()- void car:putcar() int t; /车辆类型的变量while(1) cout请选择车型: endl; coutendl; coutnnt- nnt货车请输入 1 nnt客车请输

19、入 2 nnt轿车请输入 3 nnt其他车辆请输入4 t; if(t=1) carini.fee=fee1;break; else if(t=2) carini.fee=fee2;break; else if(t=3) carini.fee=fee3;break; else if(t=4) - carini.fee=fee4;break; cout输入错误!请重新输入:n; if(i=50) cout对不起,车位已满! n; carini.pos=i+1; /- 自动输出车位号,数组里0 表示第一位,而车位的第一位是 1,所以 carini.pos=i+1;coutnnt-; coutnnt

20、已成功选择车位 !车位号是 :carini.posendl; catimei.getime(); coutnnt 现在时间是 :catimei.hour:catimei.minendl; coutnnt-endl; /- car:takecar()- void car:takecar() int hour1,min1; double charge; if(poi50) positionpoi=0; /- 通过取车操作后,重新将该车位设定为空车位hour1=catimepoi.hour; min1=catimepoi.min; catimepoi.getime(); hour1=catimepo

21、i.hour-hour1; min1=catimepoi.min-min1; if(min130)/ 计算出停车时间,不足30分钟的按 30 分钟计算charge=carinpoi.fee*hour1+carinpoi.fee*0.5; else charge=carinpoi.fee*hour1+carinpoi.fee; coutt 车费为:charge元.n; /计算出车费输出 else couttm_hour; min=newtime-tm_min; /- search_no()- void search_no() int poi=compare(); if(poi50) coutt

22、此车已入库,车位为: poi+1endl; else coutt 此车没有入库。 n; /根据车牌号查询是否入库 /- search_positon()- void search_position() int loc; cout endl; coutloc; if(positionloc-1=1) coutt 车牌号:carinloc-1.noendl; coutt 停车时间 :catimeloc-1.hour:catimeloc-1.minendl;/ 停车直到现在的时间 else coutt 此车位无车 !; /- void car:changefee() cout请选择修改的车型: ;

23、- coutnnt- nnt 修改 货车费用请输入 1 nnt 修改 客车费用请输入 2 nnt 修改 轿车费用请输入 3 nnt 修改 其他费用请输入 4 nnt 退出修 改 请输入 5 type; while(1) if(type=1) double fee1; coutfee1; fee1=fee1; cout车费修改成功 !endl; break; else if(type=2) double fee2; coutfee2; fee2=fee2; cout车费修改成功 !endl; break; else if(type=3) double fee3; coutfee3; fee3=f

24、ee3; cout车费修改成功 !endl; break; else if(type=4) double fee4; coutfee4; fee4=fee4; cout车费修改成功 !endl; break; - else if(type=5) break; cout请选择 : nnt- nnt 1.停车操作 nnt 2.取车操作 nnt 3.查询信息 nnt 4.修改车费 nnt 5.退出 nnt -nn; /-程序结束 - 。五、测试数据及其结果分析(1)修改密码时密码长度超过限制引起的错误图 6 修改密码时密码长度超过限制的错误登陆界面因为修改密码的时候字符串长度设置为10 个字符,当密

25、码长度超过10 位就会引起内部错误(字符wcx为正确的登陆账号)。如果设置一个密码的字符长度判断功能的函数,能让输入超过十位后重新输入,就可以解决这个问题。(2)账号输入错误引起的不能正常退出- 图 7 账号输入错误引起的不能正常退出的界面图账号连续输入错误后却进入了系统,之所以出现这个原因是因为在判断账号的错误次数的循环中没有正常退出,代码如下:if(strcmp(adname,an) cout此用户名不存在 !n; ai+; if(ai=3) return; / 在这里只要把 return 改为 exit(0)后就能得到正确结果continue; 修改得到的正确结果如下图所示:- 图 8

26、账号输入错误正常退出系统的界面图(3)选择停车操作后显示的停车费率图 9 修改停车费率前信息显示图刚进入系统是若没有选择修改车费的操作,此时显示的费率则是系统默认的,这是由于程序里将代表四种车型的费率的变量fee1、fee2、fee3、fee4的设为了全局并且赋了初值。修改了车费费率的图如下:图 10 修改停车费率后信息显示图不足的是必须是选择了停车操作之后车位的信息和费率才能显示出来,实用性差了一些。六、调试过程中的问题(1). 字符串比较函数strcmp ()的使用在 c/c+语言中,常用 strcmp()函数来比较两个字符串, 一般形式为 strcmp(字符串 s1,字符串 s2) 。当

27、 s1=s2时,返回值为 0,否则为非零。在管理员用户登录模块处理输入的账号和密码时就使用了该功能: if(strcmp(adname,an) / an为用户输入的账号 cout此用户名不存在 !n; - 这里在设计的时候比较容易出错,因为若两个字符串不相等,则strcmp ()返回的值是非零,在 if条件下为真,所以才会输出用户名不存在,在看程序的时候很容易会看成是两个字符串相等后输出用户名不存在。在运用 string类提供的 strcmp(s1,s2)的函数时还需要参数s1 和 s2 的类型,若 s1 和 s2 的类型都 char 的时候,则编译器不会报错,若s1 和 s2 的类型都为 s

28、tring的时候编译器便会提示类型错误,这时候应修改为 strcmp(s1.c_strc ,s2.c_strc); 这样才能对 strcmp ()函数的正确使用。(2)continue和 break 的使用在 while 和 for 的循环中, continue 和 break 是非常常见的用来控制循环的语句,continue 和 break 的使用不相同而且还很容易出错。有一种最常见的错误便是非法使用, 比如在一些非 while 、 for 、 if 这些循环或者判断的语句下使用,编译器在编译的时候就会给出“illegal break”或者“ illegal continue”这样的报错,这

29、是比较容易修改的错误的;还有一种是比较难发现的错误,就是在很多循环嵌套的时候经常会发现不知道程序跳到哪一步了。比如在“管理员登陆”模块的时候就出现过修改密码后一直停在输入账号和密码这个这里,在 loadin()的后面加入 break 语句后就能解决问题了。 而这就需要用 visual c+ 自带的调试器进行调试,去发现错误。调试的一般思路是在你觉得最有可能出错的地方,或者你不确定循环是不是跳到的地方按 f9 设置断言,然后按 f5 进行局部调试,等到程序运行到断言的位置后再一步一步按f10进行判断,就能发现哪里出错了,这是比较可靠地判断出错误的方法。(3)car 类设计的作用在停车场管理系统中

30、,多次调用了同一辆车的车牌号、停车费用、车位,因此为了编程的方便,将车牌号、费用和车位这些变量设为类car 的公有成员。同时- 还申明了 car 类的对象数组 carin为全局变量,数组的大小表示停车位的多少,每个停车位用全局变量i 来表示。这样做的好处是使函数书写方便,比如说,当要用到第 i 个车位的车牌号,只要用 carini.no就可以很简洁的很方便的实现。(4)停车费费率修改模块的实现对于不同的停车场来说,车费的费率是要可以修改的,为了实现这个功能,在类 car中设置了 changfee()公有函数成员。 同时用了 4 个变量 fee1、fee2、fee3、 fee4分别代表货车、 客车、轿车、其它车辆的费率。 然后将修改过的 fee1、fee2、 fee3、fee4分别赋值给 carini.fee,就可以实现修改停车费费率的修改。在程序设计的时候,需要注意一些细节的处理:fee1、fee2、fee3、fee4这四个变量必须设置成全局变量, 然后给一个初始值。 如果不修改就按初值来计算。如果这四个变量放在putcar ()的函数下,则无法修改成功。(5

温馨提示

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

评论

0/150

提交评论