




已阅读5页,还剩122页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言课程设计报告ETC收费模拟系统 指导教师:周纯杰 何顶新 周凯波 彭刚测控1001班组长:冯晓冬 U201013853组员:杨春禄 U201013849目录:一引言41.任务背景 42.编写目的 53.软件概述 5二.功能及操作介绍 5界面1欢迎界面 一 .6界面2欢迎界面 二7界面3车辆通行界面.7界面4信息查询界面 10界面5充值系统界面 .15界面6系统使用说明界面 19界面7退出界面 21三.系统设计分析 22一程序流程图 23二程序模块分析 24三重要数据和引用函数说明 .32四核心算法分析34五程序制作过程难点分析38六程序测试39四不足之处41五编程分工42六程序设计心得 42七参考资料43八程序源代码 43一 引言1.任务背景ETC = Electronic Toll Collection电子不停车收费系统,是指车辆在通过收费站时,通过车载设备实现车辆识别、信息写入(入口)并自动从预先绑定的IC卡或银行帐户上扣除相应资金(出口),是国际上正在努力开发并推广普及的一种用于道路、大桥和隧道的电子收费系统。 使用该系统,车主只要在车窗上安装感应卡并预存费用,通过收费站时便不用人工缴费,也无须停车,高速费将从卡中自动扣除。虽然能实现不停车收费,但一般来说,车辆还是需要以较低速度通过。这种收费系统每车收费耗时不到两秒,其收费通道的通行能力是人工收费通道的5到10倍。 近年来,随着国民经济的快速增长,人流、物流、信息流以前所未有的密度涌向大中城市并向周边辐射,城市化进程明显加快,城市规模不断扩大,人口不断集中。统计资料显示:超过百万人口的大城市数量从1978年的13个增加到2010年的42个,目前城市化水平已经达到50%。此种状态在带动城市交通需求高速增长,机动车辆快速增加的同时,也促使城市道路负荷加重,交通拥堵现象日益加剧。交通拥堵使交通延误增大,行车速度降低、时间损失、燃料费用增加、排污量增大、城市环境恶化、并诱发交通事故,直接影响人们的工作效率和身体健康。当前,城市道路交通拥堵已经成为阻碍城市快速健康发展的焦点问题之一,其所造成的经济、安全和环境等方面的重大损失已引起社会各方的广泛关注。例如,北京市城市干道平均车速比十年前降低50%以上,市区183个主要交叉口中,严重阻塞的达到60%;上海市中心区高峰期的道路平均车速不到20km/h。同时各大城市交通拥堵日趋严重,并且开始由城市中心区向郊区蔓延;中小城市也普遍出现了交通拥挤现象。因此,优先发展立体化、现代化交通尤为必要,ETC可凭借其快速、高效、全自动化的特点广泛应用于高架路,环城公路,桥梁的征收道路通行费用的地方,通过高效的处理能力有效缓解道路通行缓慢的问题。随着指导中国高速公路电子收费应用的国家标准GB/T20851电子收费 专用短程通信在2007年3月17日的正式发布和交通部门的大力宣贯的推广。中国ETC发展的标准之争终于告一段落。在这之前的欧洲标准,日本标准和国标之争,915M产品,2.4G产品和5.8G产品之争终于尘埃落地。中国选择了自己的国标,选择了5.8G。标准既已确立。中国的ETC产业和应用也蓬勃发展。ETC产品的生产厂家已经有十多家。其中不乏能提供整体解决方案的厂家。到目前为止,交通部组织开展的京津冀和长三角区域高速公路联网不停车收费示范工程进展顺利,已经在北京、上海、江苏、江西等地开通运营,截止2009年1月,开通ETC车道的数在240条左右。我们用BC编写的C语言程序来模拟ETC收费系统的流程。2.编写目的运用上学期学过的C语言课程基本知识进行初步编程实践,编写ETC收费模拟系统,通过编写过程,逐步积累编程经验,掌握一定的调试技巧,培养逻辑思维,并对ETC系统有一定深入地了解,锻炼实践能力和小组合作能力。3.软件概述ETC模拟收费系统具有车辆通行的模拟动画演示,车辆相关信息的显示,计费,余额判断,短信发出,充值等功能,基本具备了现实ETC收费系统的功能。该软件基于BC31开发,适用于dos3.0以上的所有dos版本和windows操作系统;本软件设计中加入了鼠标和键盘操作,因此操作过程必须依赖鼠标和键盘才能实现所有功能;本软件对于显卡和其他硬件无特殊要求。软件中我们建立了六个不同的车辆模型,并给六辆车分别以不同的车牌号,类型、通行费用,对六辆车分别给予一定的初始余额、信用额度,从而实现ETC整个收费流程的模拟。二.功能及操作介绍欢迎界面一 说明:按任意键继续,进入下一界面实现方式:欢迎画面的图形通过调用读取位图的函数,从外部文件中读取256色的BMP格式的图像。欢迎界面二 说明:按任意键继续,进入主界面主界面 说明:通过鼠标选择相应功能模块实现方式:通过画图函数画出主界面,随后进入while(1)循环,鼠标在界面上移动,通过相应的x,y坐标和button键判断鼠标的操作,利用if条件语句进入相应模块 。下面对车辆通行系统、信息查询系统、短信查询系统、充值系统、使用说明和退出功能分别予以介绍。车辆通行系统 车辆通行系统旨在对车辆的通行进行模拟动画演示,显示屏上显示车辆通行前和通行后的相关计费信息。在主程序运行开始,系统会随机为6辆车编制车牌号,设定30-80范围内一个余额值赋予车辆,模拟现实车辆信息的随机性。主界面点击车辆通行系统。 界面出现6种不同的车辆,这里以大型货车为例,点击大型货车,右边黄色框中出现大型货车的相关信息,显示1秒后进入大型货车通行的动画模拟演示 演示动画全程都会相关信息的显示,结束后程序会返回车辆选择的界面,这时屏幕会显示车辆通行后的相关信息如图,通行后账户余额减少20元,该信息显示时间大约为3秒,由于屏幕切换的缘故,实际看到的显示时间大约为1秒,之后文字消失,鼠标出现,一个流程结束。重新进入车辆选择。 也可按随机选择按钮,程序会随机选择一辆车进行流程演示。 按箭头返回主界面。 在此,我们为每辆车都设定了30元的信用额度,在通行前,程序会做出相应计算,以判断通行扣费后用户的余额会不会超过其信用额度,若超过,则不予以通行,屏幕会有“余额不足”的显示,动画演示不执行。大约2秒后,显示信息消失,重新进入车辆选择流程。例:如图所示车辆余额为-10元,而车辆的信用额度是30元,若大型货车通行,应缴费用为30元,扣费后余额为-40元,超出其信用额度,则不予以通行。 此时短信查询系统也会有相应“余额不足”的提示短信,将在下面介绍。 按箭头返回主界面。信息查询系统信息查询系统的功能是对这六辆车进行相关详细信息的查询。 在主界面点击信息查询系统。 程序进入车辆选择界面,在车辆选择区域会出现黄色选择框,点击其中一个车辆。系统会显示所选车辆的相关信息,包括车牌号 、车辆类型、余额、每次通过ETC所需缴纳费用、总共通过ETC收费系统次数,总共缴纳费用和具体通过时间等,由于屏幕有限,若通行记录多余5条,则会选择最近5次的通行信息予以显示。按返回键返回车辆选择界面,再次按右上角箭头返回主界面。短信查询系统 短信查询系统的功能是为ETC用户提供短信提示功能,暨ETC用户使用ETC收费系统后,会发出相关短信告知用户。 在主界面点击短信查询系统。 短信查询界面为一卷轴式界面,上排有6个信封分别代表6辆车的收件箱,鼠标放在上面会有放大效果,下方有文字提示该信封代表哪个车辆。 若在车辆通行系统没有选择此车辆通行,则短信提示如图所示:若该车辆有通行记录,则短信内容如图所示:若该车辆有通行记录,但余额小于等于0元,则短信内容如图所示: 单击卷轴右上方白色圆圈退出,返回主界面。充值系统 充值系统的功能是对车辆进行续费,依据卡号卡密进入充值界面。 在主界面点击进入充值界面。充值界面如下方浅蓝色界面所示。6位卡号和6位卡密为全数字,从键盘输入。在这里,我们设定了一个无序数字映射关系,只要卡号和卡密相应位置数字符合映射,就可进入充值界面。这种思想来源于之前很多软件的激活码只要符合一定的算法就可激活的这种激活形式。具体映射关系如下:1-0; 2-7; 3-6;4-5; 5-2; 6-8;7-9; 8-4; 9-3;0-1; 例如:输入的6位卡号是123456,则对应卡密076528,匹配正确方可进入,如果连续输错三次,自动返回主界面。卡号输入6位后按Enter键或Tab键后切换到卡密输入,黄色箭头指向卡密输入框位置,卡密输入6位后按Enter键暨为确认,按Tab键重新切换到卡号输入框。卡号与卡密框的相互切换必须满足输入6位数字,如不够6位则不会切换,按Enter或Tab键无效。输入的卡密数字会有约0.5秒的显示,随后变为“*”号,在输入的任意过程中,都可按Esc键退出,返回主界面。下图为卡密输入错误的提示信息。输入成功后会进入车辆选择界面,如上图所示。点击一个车辆,进入相应车辆的充值界面。点击下方不同的充值金额,白色框中会有相应显示,多次点击,金额累加。若输入有误,可点击取消按钮,充值框中金额清零。如下图所示。若点击确认,则对车辆进行相应金额的充值。上方余额发生变化,充值框中重新清零。点击返回键返回车辆选择界面,再次点击右上方箭头返回主界面。系统使用说明系统使用说明是对本软件功能的大体描述和操作说明。在主界面点击系统使用说明进入相应界按右下角返回按钮返回主界面。退出程序点击退出按钮退出主程序,返回BC界面。三 系统设计分析一程序流程图+程序开始欢迎画面一欢迎界面二主菜单帮 助退出程序车辆通行系统自主选择调用动画处理数据随机选择检索信息随机调用帮助信息信息查询短信查询余额充值退 出选择车辆选择车辆卡密登陆加载信息显示短信选择车辆进行充值二 程序模块分析在程序模块的分析中,为了方便理清函数之间的调用关系,我们采用了分模块调用的定义方式。在某些模块中被多次调用的小功能函数定义为该模块的子模块工具函数。故main函数被定义为主函数。 主函数模块:void main() int x,y,buttons; 初始化鼠标控件 readbmp(C:BORLANDCBINopen1.bmp); 加载开始图片一 getch();closegraph(); readbmp(C:BORLANDCBINopen2.bmp); 加载开始图片二 getch(); closegraph(); A01(); 画出主菜单界面 InitMouse(); 初始化鼠标 G(); 初始化系统需求文件夹,清空数据,并随机分配车辆信息while(1) newxy(&x,&y,&buttons) 判断鼠标; if(x=70& x=150&y=240& x=150&y=410& x=150&y=240& x=245&y=70& x=245&y=410& x=245&y=35& x1=35&y1=80& x1=60&y1=35& x=35&y=160& x=370&y=410& buttons)选择充值数额 num+=100;加入到结构体中的数据中 OutTextxy(265,302,temp1,15);输出 for(i=0;i=b)return 1;elsereturn 2;void notgo() 此函数用于不满足通行要求时,对系统的函数进行处理char str30;strcpy(str,您的余额不足,请及时充值);OutTextxy(395,240,str,RED);delay(500);OutTextxy(395,240,str,YELLOW);delay(500);OutTextxy(395,240,str,RED);delay(2000);OutTextxy(395,240,str,YELLOW);2 动画要求函数 如图所示,在整个动画的过程中,把屏幕分为了不同的区域,在不同的区域有不同的算法下面简要地说明A区域setactivepage(0); 设定为0页编辑B07(); 画出背景car(x,y); 画出车辆x+=4; 确定移动范围setvisualpage(0); 展示0页B区域setactivepage(0); 设定0页B07(); 画出背景OutTextxy(250,50,str1,RED); 输出内容setcolor(WHITE);setfillstyle(1,RED); 画出感应动画circle(220,150,10);floodfill(220,150,WHITE);setfillstyle(1,RED); line(445,125,435,135);line(435,135,440,135);line(440,135,440,145);line(440,145,450,145);line(450,145,450,135);line(450,135,455,135);line(455,135,445,125);floodfill(440,134,WHITE); 画出方向标car(x,y); 画出车辆x+=4; 开始移动setvisualpage(0); 展示0页C区域setactivepage(0);B07(); 画出背景printinfor2(0); 调用数据结构setcolor(LIGHTGRAY);setfillstyle(1,GREEN);circle(411,150,8);floodfill(411,150,LIGHTGRAY); 画出指示灯car(x,y); 画车x+=4; 确定范围setvisualpage(0); 展示0页D区域if(x=448&i=50)dealdata(0); 对数据进行处理setactivepage(0); 设定0页B07(); 画背景OutTextxy(250,50,str2,RED); 输出内容car(x,y); 画车setcolor(LIGHTGRAY);setfillstyle(1,LIGHTGRAY);rectangle(540,230-i,580,240);floodfill(541,235,LIGHTGRAY); 展示放行动画setvisualpage(0); 展示E 区域setactivepage(0); 设定0页B07();printinfor2(0); 输出已经处理的信息setcolor(LIGHTGRAY);setfillstyle(1,LIGHTGRAY);rectangle(540,180,580,240);floodfill(541,235,LIGHTGRAY); 填掉栅栏car(x,y); 画车x+=4; 车的范围setvisualpage(0); 展示五程序制作过程难点分析主界面确定问题 最初,我们的打算是调用一张BMP文件作为主界面的背景图,然后鼠标在上面显示,进行各种操作,为此,我们还专门利用photoshop做了一张程序背景界面的效果图。但实现的时候难度非常大,经过反复几天的研究,最终BMP文件终于可以加载了,但由于显示采用分页原理,鼠标有多个轨迹,且移动非常困难,屏幕上有鼠标轨迹。考虑这样做下去无法进行,我们最后改变了最初的想法,界面、动画全部自己画。鼠标显示问题 鼠标的初始化和鼠标位置的读取这两个函数是我调用网上搜索的函数,鼠标的图形和对鼠标操作的的判断(函数名:newxy)这两个函数使我们自己编写的,鼠标的显示采用异或模式,但出现一个问题,有些按钮(鼠标放上去会发生变化)的两种显示状态会同时出现,且闪烁不停,最后我们采取这样一种方法:在while(1)里面调用鼠标模块,鼠标函数开头将模式设定为异或,结尾设定为进行非操作,这样就解决了按钮图标闪烁不停的问题。程序界面间相互切换的问题 界面间的相互切换我们采用嵌套方式while(1)里面套入子模块,子模块while(1)中套入下一个子模块,通过break来返回上级界面。BGI报错的问题 由于我们的程序界面间切换比较频繁,对内存的释放极为重要,起初,我们没有意识到这个问题,只是感觉是软件自身的问题,尽管使用cleardevice()进行清平操作,但问题依旧,后来请教助教和同学才知道是显示内存没有及时清空,造成内存不足所致,同学建议我们用closegraph(),我们试了一下,果然BGI不会报错了,于是我们把程序中所要涉及切换界面的地方全部加入closegraph(),问题得到了解决。内存不足问题 在编写主程序是,我们加入了对车牌号和余额随机选择的功能,在加上之前编写的初始化各汽车历史通行记录文件的代码和之后主菜单的代码,整个主程序有两百多行,随后BC运行时出现了车辆信息随机选择十分不稳定的情况,又是车辆信息能完整显示,随机选择,但有时就是乱码,乱码中一部分是其他功能模块里面的文字,这是我们考虑到可能视内存有限的问题,于是把数据的初始化单独作为一个函数被主函数调用,命名为G()。函数命名问题 说道上面的G(),我就想到了函数命名问题,之前我们的函数命名方法是依据各函数功能给函数命名一个英文名称,但是BC对文件名称长度有限制,我们的cpp文件和根本无法显示,把名字改短又看不出这个cpp文件是干什么的,后来我们重新对程序模块进行“大换水”的时候采取ABCDEFG的方式命名,A代表主函数,其他的各代表一个模块,这样既不会在加工程是漏掉,自己看起来也方便。动画实现问题 在动画实现上最初采用的时画了又擦,擦了又画的的方式,但这样实现的动画很简单,且无法填充颜色,后来我们又改用换页的方式,动画显示质量有了明显的提高。程序功能问题 由于ETC是今年的新题目,我们在开始做的时候没有任何有价值的信息可言,没有往届学长的参考,网上也很难找到,唯独在新浪网上找到的ETC收费系统还带有条形码扫描等功能,根本不适合我们,我们只能按照百度百科和维基百科的一些资料走一步算一步,基本上两天去一次南一楼,不断地问不断地改,程序也经历了两次“大换水”,每次都是重新编写主函数,重新编写相应模块信息,并在修改中总结经验,最终确定下来的这个程序功能基本全都实现了模块化,只要是实现同一个功能,就都调用同一个函数。不再有之前的冗余部分。程序间数据处理和传递问题 数据的处理、显示和传递是ETC收费模拟系统的核心部分,这里我们采用txt保存车辆相关信息,在每次用到时就用指针将其打开,存到相应用于临时储存数据的结构体里,指针关闭,rt+和wt+虽然功能大致相同,但有时只能用其中一个,另一个无法实现功能。数据传递最初我们用指针,但在使用过程过程中发现存在很多问题,经常出错,屏幕显示乱码等,后来我们改为*(int n),这种方式来传数据,程序运行起来稳定多了。六程序测试程序测试是程序设计过程中的一个非常重要的环节,虽然我们在整个编写程序的过程当中都伴随着对程序的调试,但是这并不能保证我们的程序没有问题。所以,我们对程序做了大量的测试。即使如此,由于时间和技术水平等方面的原因,我们最后还是只能在基本没有很大的BUG的情况下草草了事。我们的测试分为两个过程:单元测试和集成测试。单元测试 在各个模块编制过程中,对模块自身进行测试,使问题能够及时地被发现。而且一旦发现问题,也能将问题出现的范围锁定在较小的程序段。这样将大大降低测试的难度,更容易保证编码的正确性。集成测试 集成测试是程序设计中不可缺少的一部分,即使程序的各个模块单独运行没有问题,合在一起也可能错误百出,这个时候我们需要对程序进行集成测试。由于程序代码量较大,而且数据流在各个模块之间的传递比较复杂,所以集成测试相对比较困难。在集成测试中发现问题后,我们要想办法确定它是出在哪个模块,或者说是哪几个模块之间的接口,然后对该模块进行调试和排错。这对我们的模块化设计也提出了更高的要求,我们必须在有清晰的编程条理的情况下才能更有效率地检测出错误位置并解决问题。四 不足之处由于ETC收费模拟系统是今年的新题目,没有任何可以借鉴的经验,我们一步一步摸索才慢慢做出了这个程序,逻辑结构有些简单,程序代码看起来也有些单调,但我们已经听取了很多老师,助教,同学的建议,把我们所能想到的功能全都加了进去,尽了我们最大的努力 就程序内容而言,由于程序本身结构和模块的限制,我们最后没有加入彭钢老师所建议的多辆车排队通行的功能,因为当时代码已经超过4000行,程序编写基本完成,如果加入这个功能,车辆通行这个模块需要重新编写,函数逻辑需要重新布局,工作量很大,最后我们不得不放弃这个想法,听取周凯波老师的建议,加入了随机选择车辆的功能。 虽然如此,但我们的程序功能有限,仍有许多不足之处,虽然经过了多次调试,但我们仍不清除我们的程序是否能在各种PC上均适用,稳定性如何,程序运行时占用多少系统资源等问题。希望通过这次课程设计积累相关编程经验,增长见识。五 编程分工冯晓冬主要完成的部分有bmp图形的调用,数据的操作和处理,充值系统的数据传输及处理,登录系统的设置 ,鼠标的设置,以及整体的构架。其主要函数有A(),C(),D(),E(),F(),G(),总共代码约有1900行,杨春禄主要完成部分有:界面的绘制,信息查询系统的调用,动画的制作。包含文件有B(),DRAW(),CAR12(),CAR34(),CAR56();大约有1500行; 由于我们的程序是ETC收费系统的模拟,所以很多地方是需要相互传数据,所以有的地方是我们两个人一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 婚姻终止后的财产分割与子女抚养协议小说创作
- 2025年药师考试用于慢性病管理的药物试题及答案
- 精英军人离婚协议书及退役安置补偿条款
- 离退休人员返聘参与城市规划编制协议
- 绿色环保设备钢材供应链整合居间合同
- 大连招标代理机构从业人员考试单选题及答案
- 离婚不离家双方共同财产管理及使用协议范本
- 医疗器械租赁合同终止及患者安全保护协议
- 离婚财产分割协议书修订及共同投资合作协议公证
- 旅游产业链私人合伙股权分配及资源共享协议
- 爆破安全培训课件
- 管线物探基本知识培训课件
- 医护人员护理文书书写规范模板
- 财务岗招聘笔试题目及答案
- 2025上教师资格笔试考试试题与答案(初中化学考生回忆版)
- 《中国名菜》课程标准
- 感染性腹泻的病例讨论
- 输尿管癌根治术后护理查房
- 《商务数据分析与处理》高职电子商务数据分析全套教学课件
- 工程派工管理办法
- 入党积极分子培训考试题库及答案
评论
0/150
提交评论