资源描述
程序设计报告(2014 / 2015 学年 第1学期)题 目:停车场管理系统专业 组长学号姓名组员学号姓名指导教师 指导单位日期成员分工长 组、 Z7-自心亠司 结 刨和 查 据 昭痕题分 4口 部 报殍 验 代 弟员 组分 4口 部 报 殍 验 代 弟员 组析 分 求 b 需 的 要 块 和 模 容 车 程 才产 tnK- 停1 分 4口 部 报 殍 验 代 弟评分细则项 分 评秀等 中差守度 态 习 学匕匕 厶冃 功 题 mK1告 报简短评语日月 名 年评分等级备格 及 不 及 中 爪 良 五 共 级 等 分 评停车场管理系统一、课题容和要求停车场管理是一个计时收费系统,同时也是一个能对车位进行管理的系统,最基本的功能是实现停车、取车、查询以及修改停车费费率等功能。同时,为了使用的方便和安 全的考虑设计了管理员能对密码进行修改的功能。在停车的功能中采用了文件流的形式, 对车位、车牌号、车型都进行了保存,以便于查询功能的实现,除此之外,也是为了能够 实现在取车模块中利用输入的车牌号自动计算出停车的费用。停车位第一个为空的位置, 由程序查询自动给出车位号,如果车位已满要给出提示。取车时,需要根据车辆停泊时 间自动计算费用(半小时以半价计算,超出半小时不足一小时按一小时计算)并显示在屏 幕上,可以随时根据车牌查询是否入库。可以随时根据车位查询该位置上的相关信息。本系统对不同车型的费率给出了默认值,管理员可以根据实际需要对费率进行修改。功能要求:用C/C+设计一个程序实现停车场管理系统,要求如下:(1) 管理人员根据口令进入系统;(2) 管理人员有权限对登陆账号和密码进行修改;(3) 管理车位信息(车位编号,状态)和每小时的收费费率;(4) 停车时录入汽车停泊信息(车牌号,车型,停泊位置,停泊开始时间);如果车位已满要给出提示;(5) 取车时,根据车牌取,如果没有给出提示;需要根据车辆停泊时间自动计算费用并显 示在屏幕上。(6) 管理人员可以根据需要随时更改每小时的收费费率。、需求分析停车场管理系统的功能框架图如图1所示word专业资料图1功能框架图(1) 系统主要包括了管理员登陆、停车操作、取车操作、信息查询、费率修改这五大模块,每个模块都用用相应的函数来实现这些功能。(2) 在管理员登陆模块中,设置了三次输入机会,用户名和密码事先用文档存储,供使 用者进入系统;若管理员连续输入密码错误超过提示,则系统给出修改密码或者退出系统 的提示,这些功能在函数名为load in ()的函数中实现。(3) 管理员登陆模块结束之后便到了系统的主要界面,选择操作1是停车模块。在选择停车操作之后,系统能够实现“将第一个为空的位置,由程序查询自动给出车位号,如果 车位已满要给出提示”这一功能用函数 compare ()和jugement ()共同实现的。进入 停车模块后,还应选择不同的车型进行停车,这一过程会调用putcar ()和gettime ()函数,用来给出不同车型的费率和调用停车时的系统时间。(4) 通常选择了停车操作之后取车和查询功能才会有意义,所以取车和查询公共主要是 使用了 campare ()函数,调用strcmp ()字符串比较函数对输入的车牌号和停车时的 车牌号进行比较,若相同,则返回该车位,达到取车和查询的作用。(5) 不同的停车场可以根据需要修改每种车型的车辆对应的费率。这个功能在修改费率 的模块中实现。(6 )根据不同的车型以及其停泊时间收费,间差乘以单价就是最后收费,其中取车时, 需要根据车辆停泊时间自动计算费用(半小时以半价计算,超出半小时不足一小时按一小 时计算)并显示在屏幕上。这个功能需要调用系统时间,因此在整个程序中包含了头文件 后(#“ clude )利用结构这种数据类型来实现。三、概要设计1.主要结构体为了实现停车场管理系统的停车、取车、查询、修改功能,主要用一个 while循环, 通过输入的数字选择相应的操作。同时为了实现每个模块的功能,引用一些相应的子函数。 下面是主要结构体的流程图:鱼X KK垒誉治】亠匸 一I 二-I一_K笔旁7T二图2 主要结构体流程图2.主要函数流程图(1 )管理员登陆模块管理员登陆模块是用函数load in ()来实现的,在loadin ()函数中对账号和密码都 有三次的输入机会,用变量ai来记录输入的次数,当ai=3时,进入修改密码的界 面。在修改密码模块了,用strcpy ()函数将输入的字符串adpasswordl赋值给密 码adpassword (adpassword为全局变量,所以才能起到修改的作用)。修改完成密 码后,在loadin ()函数中再次调用load in ()函数,这样在修改密码后就能重新回到登陆界面进行登陆,大体程序流程图如下:图3管理员登陆模块流程图鹫、牙忘i=J(2)比较函数compare ()在停车场管理系统的取车、查询模块中都需要用到输入“车牌号判断停车场中是 否有该车”这个功能,而compare ()函数就是用来实现这个功能的。其大概思路是, 通过输入的字符串与系统储存有的字符串进行比较,如果字符串相等就返回一个0,如果不相等就返回非0,而通过0和非0的控制,便能实现判断的功能,其流程图如 下所示:TT贻BtrettLp 何l釈b匕机足西砂赠冋mw艮寸旦白勺车血寸9EiH:q-图4 字符串比较函数流程图(3)搜索空车位函数jugement ()对于停车操作来说,需要在所有停车位中找到第一个空车位,并返回这个车位。在该系统中,这个功能由函数jugement ()来实现。设int型变量j为车位编号,利 用数字positionj的值是否为1,来判断是车位是否为空(这里是将 1视为有车,0 为无车)。络心图5搜索空车位函数流程图在这个函数中还要注意:在用 while循环对每个车位进行逐个判断的时候,j 一定要小于停车场的总车位。除此之外,返回第一个空车位表示将要在这个车位进行停车,因 此要重新将positionj的值置为1。四、源程序代码#i nclude #in elude #in elude #in cludeusing n amespace std;class carpublic:char no10;int pos;double fee;void putcar();void takecar();void cha ngefee();class Timepublic: int hour;int min;void getime();;char adpassword10=123456;char adn ame10=wcx;int i,poi;in t positio n50=0;全局变量car cari n 50;Time catime50;double Fee仁6.0, Fee2=5.0, Fee3=4.0 , Fee4=3.0 ;int jugeme nt();int compare();void search_ no();void search_positi on();void load in();void mai n()/ 管 理 员 登 陆 模loadi n();int k=0;coute ndl;cout请选择:nnt-vnnt停车操作nnt2.取车操作nnt3.查询信息nnt4.修改车费nnt5.退出nnt-/登陆模块结束ofstream outfile(” 车辆信息.txt,ios:app); if(! outfile)cerrope n error! k)if(k=1)i=jugement(); 通过jugement() 函数返回第一个空的车位 icout carini.no; /用户输入停在第i个车位的车牌号cari ni.putcar();cout请选择:nnt-IInnt停车操作nnt2.取车操作nnt3.查询信息nnt4.修改车费nnt5.退出nntnnstri ng time1;time_t t;time(&t);time1=ctime(& t);couttime1;/ 导入系统时间outfilecarini.no time1endl;con ti nue;if(k=2)poi=compare();carin poi.takecar();cout请选择:vvnntvnnt.停车操作nnt2.取车操作nnt查询信息nnt1.修改车费nnt.退出nntnn;con ti nue;if(k=3)int x;while(1)cout请输入数子选择需要的操作:e ndl;coute ndl;coutnntnnt1查询车牌号nnt2.查询车位nnt3.退出查询 x;if(x=1)search_no();break;else if(x=2)search_positi on();break;else if(x=3)break;elsecoutt选择错误,请重新选择:;cout请选择:nnt-nnt停车操作nnt2.取车操作nnt3.查询信息vvnnt0.修改车费IInnt5.退出nntnn;outfile.close();if(k=4)cari ni.cha ngefee();con ti nue;if(k=5)exit(0);/loadin()void load in()char an 10, ap10;int ai=0;vve ndl;coutvv 欢迎使用XX停车场管理系统while(1)cout ap;if(!strcmp(adpassword,ap)break; else coutvv密码错误!n;ai+;if(ai=3)coute ndl;coutvv密码连续输入错误3次,请重新选择操作:coute ndl;coutvv.修改密码.退出系统 k)if(k=1)coutvv请输入新的密码,密码不超过 10位数:char adpassword110;cin adpassword1;strcpy(adpassword,adpassword1);coutvv你的新密码是:vvendl;coutvvadpasswordvve ndl;vve ndl;vve ndl;load in();break;if(k=2)exit(O);if(k!=1 &k!=2)coutvv输入错误,请重新输入:return;con ti nue;coutvv登陆成功! endl;jugeme nt()/int jugeme nt() /判断出第一个空的车位 int j=0;while(positio nj=1 &j50)j+;cout共有50个停车位,当前可使用停车位:v50-jvendl;coutvve ndl;coutvv本停车场收费标准如下:e ndl;coute ndl;coutvv货车每小时vvFeelvv 元,客车每小时Fee2元,轿车每小时Fee3元,其它车辆每小时wFeedw元。endl;coutvv 注:停车时间小于30分钟的按0.5个小时计算,超过30分钟但不足1小时 的按1个小时收费endl;if(j50)positionj=1;/当找到第一个空车位时(即 position=0时,并且满足车位号j ch;for(int k=0;k50;k+)if(!strcmp(ch,carink.no)/ 将输入的车牌号与停车场上的每个位子的车辆进行比较(包括那些没停车的车位)if(positioncarink.pos-1=1)/ 在 car:putcar()函数中因为要输出车位号,所以将对象数组 carink.pos 变为了 carink.pos+1,/于是用数组position找已经停车的车位时要将其处理为carink.pos-1return (cari n k.pos-1);break;if(k=50)return k;/car:putcar()void car:putcar()int t; /车辆类型的变量while(1)cout请选择车型:e ndl;coute ndl;coutnntnnt货车请输入1nnt客车请输入2nnt轿车请输入3nnt其他车辆请输入4 t;if(t=1)cari ni.fee=Fee1;break;else if(t=2)cari ni.fee=Fee2;break;else if(t=3)cari ni.fee=Fee3;break;else if(t=4)carin i.fee=Fee4;break;n;coutvv输入错误!请重新输入: if(i=50) cout对不起,车位已满! n;carini.pos=i+1; / 自动输出车位号,数组里 0表示第一位,而车位的第一位是 1,所以 carini.pos=i+1;coutvnnt;coutvnnt已成功选择车位!车位号是:carini.posendl;catimei.getime();coutnnt现在时间是:vcatimei.hourvv:vvcatimei.minendl;coutnnte ndl;/car:takecar()void car:takecar()int hour1, min1;double charge;if(poi50)通过取车操作后,重新将该车位设定为空车位positi on poi=0;/hour仁catimepoi.hour;mi n1=catimepoi.mi n;catimepoi.getime();hour仁catimepoi.hour-hour1;mi n1=catimepoi.mi n-mi n1;if(min130) 计算出停车时间,不足30分钟的按30分钟计算charge=cari n poi.fee*hour1+cari n poi.fee*0.5;elsecharge=cari n poi.fee*hour1+cari n poi.fee;couttm_hour;min=n ewtime-tm_mi n;/search_no()void search_ no()int poi=compare();if(poi50)coutt此车已入库,车位为:poi+1e ndl;elsecoutvvt此车没有入库。n;/根据车牌号查询是否入库/search_positon()void search_positi on()int loc;cout loc;if(positi on loc-1=1)coutt 车牌号:carinloc-1.noendl;coutt 停车时间:catimeloc-1.hour:catimeloc-1.minendl;停车直到现在的时间elsecoutt此车位无车!;/ void car:cha ngefee()cout请选择修改的车型:coutnntnnt修改货车费用请输入1nnt修改客车费用请输入2nnt修改轿车费用请输入3nnt修改其他费用请输入4 type;while(1)if(type=1)double feel;coutvv每小时货车费用:;cin feel;Fee仁feel;cout车费修改成功! fee2;Fee2=fee2;cout车费修改成功! fee3;Fee3=fee3;cout车费修改成功! fee4;Fee4=fee4;coutvv车费修改成功!endl;break;else if(type=5)break;coutvv请选择:IIvvnntnnt.停车操作nnt2.取车操作nntB.查询信息nnt1.修改车费nnt.退 出nntnn;程 序 结 束/五、测试数据及其结果分析(1) 修改密码时密码长度超过限制引起的错误匕:停车场管理索统验牧稈序停车场管理系猟Debug停车场管理系銃戲请输入新的密码.密码不超过述位数;12121212121212你的新密码昱;12121212121212欢迎使用嚣停车场管理系络 常输入管理贯用户名呃X 业用户名不存在*请输入管理员用户名:图6修改密码时密码长度超过限制的错误登陆界面因为修改密码的时候字符串长度设置为 10个字符,当密码长度超过10位就会引起部 错误(字符 WCX 为正确的登陆账号)。如果设置一个密码的字符长度判断功能的函数,能让输入超过十位后重新输入,就可以解决这个问题(2) 账号输入错误引起的不能正常退出图7账号输入错误引起的不能正常退出的界面图账号连续输入错误后却进入了系统,之所以出现这个原因是因为在判断账号的错误 次数的循环中没有正常退出,代码如下:if(strcmp(adname,an) cout此用户名不存在!n;ai+;if(ai=3)return ; /在这里只要把return改为exit ( 0)后就能得到正确结果 con ti nu e;修改得到的正确结果如下图所示: 一一欢迎使用刖停车坂管理系統输人管理员用户名3叙常输入管理员用户名沁 丘用户暑不存缶冃户名不存在*_ss any key to con七inuiEG ;停车场管理系统验收程序停车场置理系统Xb ug停车场管理系统.exe图8 账号输入错误正常退出系统的界面图(3) 选择停车操作后显示的停车费率盘点矯棘鬻巾融按个小时收费共有个停车位,当前可使坤停车位:58 本停车场收费标准如下汪图9修改停车费率前信息显示图刚进入系统是若没有选择修改车费的操作,此时显示的费率则是系统默认的,这是由于程序里将代表四种车型的费率的变量Feel、Fee2、Fee3、Fee4的设为了全局并且赋了初值。修改了车费费率的图如下:晁个停车仏当前可使用停车位:弭本停车场农肺滋吓护議黯肩粛1i擁嘲譎暨僵翳翩隶盟辭按1个阿塢图10 修改停车费率后信息显示图不足的是必须是选择了停车操作之后车位的信息和费率才能显示出来,实用性差了一些。六、调试过程中的问题(1) .字符串比较函数strcmp ()的使用在C/C+语言中,常用strcmp ()函数来比较两个字符串,一般形式为strcmp(字符串S1,字符串S2)。当S仁S2时,返回值为0,否则为非零。在管理员用户登 录模块处理输入的账号和密码时就使用了该功能:if(strcmp(adname,an)/an 为用户输入的账号coutvv此用户名不存在!n;这里在设计的时候比较容易出错,因为若两个字符串不相等,则strcmp ()返回的值是非零,在if条件下为真,所以才会输出用户名不存在,在看程序的时候很 容易会看成是两个字符串相等后输出用户名不存在。在运用string类提供的strcmp ( s1,s2)的函数时还需要参数s1和s2的类型, 若s1和s2的类型都char的时候,则编译器不会报错,若 s1和s2的类型都为 string的时候编译器便会提示类型错误,这时候应修改为strcmp (s1.c_strc ,s2.c_strc )这样才能对strcmp ()函数的正确使用(2) continue 和 break 的使用在while和for的循环中,continue和break是非常常见的用来控制循环的语 句,continue和break的使用不相同而且还很容易出错。有一种最常见的错误 便是非法使用,比如在一些非 while、for、if这些循环或者判断的语句下使用, 编译器在编译的时候就会给出“ illegal break ”或者“ illegal continue ”这 样的报错,这是比较容易修改的错误的;还有一种是比较难发现的错误,就是 在很多循环嵌套的时候经常会发现不知道程序跳到哪一步了。比如在“管理员 登陆”模块的时候就出现过修改密码后一直停在输入账号和密码这个这里,在 load in ()的后面加入break语句后就能解决问题了。而这就需要用visual C+ 自带的调试器进行调试,去发现错误。调试的一般思路是在你觉得最有可能出错的地方,或者你不确定循环是不是跳 到的地方按F9设置断言,然后按F5进行局部调试,等到程序运行到断言的位 置后再一步一步按F10进行判断,就能发现哪里出错了,这是比较可靠地判断 出错误的方法。(3) Car类设计的作用在停车场管理系统中,多次调用了同一辆车的车牌号、停车费用、车位,因此为了编程的方便,将车牌号、费用和车位这些变量设为类car的公有成员。同时还申明了 car类的对象数组carin为全局变量,数组的大小表示停车位的多少, 每个停车位用全局变量i来表示。这样做的好处是使函数书写方便,比如说,当 要用到第i个车位的车牌号,只要用carini.no就可以很简洁的很方便的实现。(4) 停车费费率修改模块的实现对于不同的停车场来说,车费的费率是要可以修改的,为了实现这个功能,在类car中设置了 changfee ()公有函数成员。同时用了 4个变量Feel、Fee2、Fee3、Fee4分别代表货车、客车、轿车、其它车辆的费率。然后将修改过的Feel、Fee2、Fee3、Fee4分别赋值给carini.fee,就可以实现修改停车费费率的修改。在程序设计的时候,需要注意一些细节的处理:Feel、Fee2、Fee3、Fee4这四个变量必须设置成全局变量,然后给一个初始值。如果不修改就按初值来计算。如果这四个变量放在putcar ()的函数下,则无法修改成功(5) 获取系统时间在停车场管理系统中,对车费费率的计算需要运用的系统时间,即把费率乘上停车的时间就可以得出停车的费用。因此在停车的时候就必须读取当前的时间,在取车的时候再读取一次系统时间,两次相减就能得到停留的时间。其中,time ()函数获取到的并不是我们常表示的时间,所以要用localtime函数来将它转化为本地时间。日期和时间的函数都包含在time.h函数中,因此头文件中必须包括。初此之外,time ()函数返回的值不是常见的类型,而是time_t。七、课程设计总结经过大一第一学期对 C+这一课程的学习,我学了基本的理论知识,建立了基本的 C+程序设计的思想,为此次程序设计实验打下了基础。为期两周的上机实验,让我们了解到自己知识体系的不足之处,让我们知道知识不能 仅仅局限于课本以及理论体系,要用实践来证明和巩固。通过程序设计,进一步的巩固了 用C+语言编写程序的能力,并且利于更好的掌握 C+语言!这次实验无疑是一次非常 好的加强自己C+语言编写程序能力的机会,我们都非常珍惜。虽然看起来两周的时间很充裕,但是我们已经有半年多时间没有学习过 C+,其中的 大部分知识都已经记不清,而且这个程序设计还涉及到一些我们没有学过的知识点,在编 写代码时需要查阅书本,上网查找资料也是必不可少的。所以编写代码的时间对于我们来 说还是比较紧的,过程也比较艰辛,还请教了不少学霸。所以我建议老师在给我们布置题 目的同时要给我们一些对于题目的指点,让我们不至于那么迷茫,并且解决我们在过程中 遇到的困难。虽然实验周是两周,但真正在机房的时间很少,很多同学自己在课下没人督 促不会主动去编写代码,所以我建议增加上机时间,同学们也有更多的时间和耐心去解决 自己的问题。在机房时,有很多同学会趁着老师不在时看视频玩游戏,希望老师加强管理,让同学们真正从实验中获得知识。这次的编程实验是对更深层次知识的考验,不再是以前的小儿科,看起来比较简单的 题目要现起来却十分困难,不仅考验了同学们对知识的掌握程度,也考验了同学们是否耐 心和细心。即使是一点小错误也有可能使系统无法运行,在编写代码时可谓是细心细心再 细心。以前学C+时实现的都是比较简单的代码,并且只是对知识把握的考察,并不实用。 这次的编程实验是真正用于生活, 让我们知道C+语言的实用性,增加对它的兴趣,巩固 自己的知识体系。总之这次的编程实践让我们受益匪浅,希望以后的编程实践会越来越好。
展开阅读全文