欢迎来到课桌文档! | 帮助中心 课桌文档-建筑工程资料库
课桌文档
全部分类
  • 党建之窗>
  • 感悟体会>
  • 百家争鸣>
  • 教育整顿>
  • 文笔提升>
  • 热门分类>
  • 计划总结>
  • 致辞演讲>
  • 在线阅读>
  • ImageVerifierCode 换一换
    首页 课桌文档 > 资源分类 > DOCX文档下载  

    Java课程设计--地铁换乘.docx

    • 资源ID:900988       资源大小:105.23KB        全文页数:16页
    • 资源格式: DOCX        下载积分:5金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    Java课程设计--地铁换乘.docx

    第1章课题概述11.1 课题的目的11.2 课题的要求11.2.1输入输出的要求11. 2.2程序实现的功能要求1第2章概要设计22.1整个程序的模块结构及重点分析。22. 2数据的读取与存储结构概述22. 2.1数据的读取22. 2.2数据的存储22. 3图形界面概述32. 3.1地铁站名的列出32. 3.2输入输出文本框的构建32. 3.3确认和取消按钮的构建32. 4主函数概述3第3章程序功能的实现42.1 地铁各站数据的读取与存储结构的实现43.1.1数据读取43. L2存储地铁站名43.1. 3地铁网络数据提供的方法43. 2单线票价和套票的数据读取与存储63.2.1单线票价存储63.2.2套票的存储73.2.3票价数据提供的方法73.3窗口的构建83.3.1站名的列出83.3.2文本框的构建93.3.3按键的构建93.4主函数的编写113.4.1站名转换为线名113.4.2方案的遍历113.4.3方案的计算11第4章程序测试及分析13第5章总结15参考文献16第1章课题概述1.1 课题的目的地铁是大城市人们日常生活出行的重要交通工具。但是城市交通资源有限,为引导旅客合理利用线路资源,解决交通瓶颈问题,该城市制定了票价策略:1 .每条线路可以单独购票,票价不等。2 .允许购买某些两条可换乘线路的联票。联票价格低于分别购票。为了方便使市民出行,通过编写程序构建图形界面为大家提供最优票价的乘车方案。1. 2课题的要求1.1.1 输入输出的要求(1)程序运行后通过读取票价及站点文件将所有的站点列出,并构建起、终点站文本输入窗口,票价方案文本输出窗口。(2)起点站,终点站应能够从键盘输入,并且可以通过按键不断重复输入、输出。(3)用户每次输入数据并通过提示文本确认后点击“确认”按钮,立即输出票价及乘车方案。(4)方案的输出符合示例要求,所给出的方案是票价最低的方案,如用户输入:五棵松,霍营,程序输出:-(线1,线Io)-线8=565。(5)点击窗口关闭按钮后退出程序。1.1.2 程序实现的功能要求(1)将地铁站网络通过String二维数组存储,票价通过单线票类和套票类分别存储。(2)给出获取换乘站,各类票价,线名等方法。(3)构建图形界面提供可视化的操作界面。(4)对错误的输入发出提示信息,要求重新输入。第2章概要设计2.1 整个程序的模块结构及重点分析。本课题所涉及的难点有两个分别是1.数据的读取与存储2.主算法的设计。根据对java程序一年来的学习并结合课题要求,我将整个程序的模块分为:1 .地铁站名数据读取及存储模块。2 .票价数据读取及存储。3 .图形界面的架构。4 .主函数。将每个模块写入一个ClaSS文件,并通过方法而调用来实现程序的运行。图2-1整个程序的四大模块2. 2数据的读取与存储结构概述2. 2.1数据的读取文件的读取是IO章节的内容,在这学期我已经多次练习过并且很熟练了。我在这选择了FileReaeler提供的方法来读取文件的字节流数据,接着重新构建字符串,最后用StrirIg类提供的SPIit方法将站名、票价分解开。2. 2.2数据的存储如何将数据合理的存储,使得主函数在调用时方便是这个课题的一个重点,但由于我还没有学习过数据结构,所以只能将数组与数据结合起来思考。(1)地铁网络首先由于文件存储的地铁站名是字符串,户输入的起终点格式也是字符串所以基本不用改变地铁站名的数据类型。其次因为地铁站有1.在哪条线上2.在这条线的哪个位置这两个特性,所以我选择了String二维数组来存储,一维下标表示该地铁站所在的线名,二维下标表示该地铁站在该线的位次。(2)票价由于课题要求计算最划算的票价,所以票价需存储为Int类型以方便计算。接下来因为存在单线票价和套票的区别,所以我将单线票价和套票分成两个类:SubwayPriceTypel(单线)jSubwayPriceType2(套票)来写(方便调用的时候区分)。因为在读取数据的时候已经将2种票价分成了2个数据流,所以将单线票价以int数组来存储,一维下标表示线名,套票以int二维数组来存储,一维下标表示换乘前站,二维下标表示换乘后站。这样数据就以合理的形式存储了,为主方法的调用做好准备。2. 3图形界面概述图形界面是我通过自学Eclipse的开发技术详解一书中的SWT章节来进行架构的,由于是自学所以参照的是计算器的图形界面进行设计的。3. 3.1地铁站名的列出将地铁站名按线分组依次创建按钮,只将其作为展示所以没有添加监听器。2. 3.2输入输出文本框的构建文本框我使用了TEXT类来进行构建,输入文本框给用户提供了输入界面,输出文本框我设计了2个,分别是输入数据的复核框和最终方案的输出框。复核框提供给用户在按下按键“确认”之前检查自己输入是否合法的检查机会。输出框用来呈现通过主函数获得的最终的票价。2. 3.3确认和取消按钮的构建“确认”按钮是本课题的重中之重,用户按键后将输入框获取的数据通过主函数的计算获得方案和票价。“取消”按键则是提供给用户一个清除数据再输入的接口。2.4主函数概述在设计之初我就将主函数定义为:获取起点站,终点站站名,返回字符串给最终方案输出框的方法。由于主函数过于复杂,在此不再赘述,详细参看34节。第3章程序功能的实现3.1 地铁各站数据的读取与存储结构的实现3.1.1 数据读取使用了FiIeReader,代码如下:FileReaderfis=newFHeReader("station.txt,');本段是站名文件,票价类似。for(intb=0;b>=0;b+)b=fis.read();if(b=-1)break;)elseFileData.addElement(b);continue;)31.2存储地铁站名Lines是一个VeCtOKStirng>类型的对象,是将数据分解后存储有各条线路所有站名的向量(没有站的线路依然在向量中占据一个位置,值为null),其中的每一个元素是一条线的所有站的站名,通过双重循环向String中赋值,代码如下():StringSl=newStringlines.size();for(inti=0;i<lines.size();i+)StringS2=lines.get(i).split("rn");Sli=newStringS2.length;for(intj=0;j<S2.length;j+)Slij=S2j;3.1.3 地铁网络数据提供的方法(1)返回经过此战的所有线路的线名的数组方法有两个不同参数的方法,第一个方法能将当前线名放在0号元素,第二个方法则是直接返回经过的所有线名并将其从小到大排列,代码如下:publicintgetLinesNo(StringStationnamejintIineno)linel.setStations();crossstation=newVector<Integer>();crossstation.addElement(Iineno);for(inti=0;i<linel.SI.length;i+)for(intj=0;j<linel.Sli.length;j+)if(stationname.equals(linel.Slij)&i!=Iineno)crossstation.addElement(i);)intIinesno=newintcrossstation.size();for(inti=0;i<crossstation.size();i+)linesnoi=crossstation.get(i);)returnIinesno;publicintgetLinesNo(StringStationname)Iinel.setStations();crossstation=newVector<Integer>();for(inti=0;i<linel.SI.length;i+)for(intj=0;j<linel.Sli.length;j+)if(stationname.equals(linel.Slij)CroSSStatiOn.addElement(i);)intIinesno=newintcrossstation.size();for(inti=0;i<crossstation.size();i+)linesnoi=crossstation.get(i);)returnIinesno;(2)判断两条线是否能换乘的方法因为在查看源数据的时候我发现,存在两条线能换乘但没有套票的情况,为了了满足这种情况,编写了代码如下的方法,返回一个boolean值:publicbooleanLineCango(inta,intb)linel.setStations();booleanc=false;for(inti=0;i<linel.Sla.length;i+)for(intj=0;j<linel.Slb.Iengthjj+)if(linel.Slai.equals(linel.Slbj)c=true;returnc;3.2单线票价和套票的数据读取与存储3.2.1单线票价存储单线票价是通过int口数组来存储的。代码中的Subwaypricetypel是一个VeCtOr<String>类型的对象,是将数据分解后存有所有单线票价的向量。方法中我通过单循环向int中赋值。其中我对线名进行了解析,使得例如10号线的票价就存储在10号元素中,从而使得调用方便。代码如下:publicvoidsetSubwayPriceTypel()intlength=Subwaypricetypel.size();Subwaypricetypel.setsize(Integer.prselnt(Subwaypricetypel.lastElement().substring(13)+1);for(inti=(length-1);i>=0;i-)Subwaypricetypel.set(Integer.prselnt(Subwaypricetypel.get(i).SIlbString(1,3),Subwaypricetypel.get(i);Subwaypricetypel.set(i,null);for(inti=0;i<Subwaypricetypel.size();i+)if(Subwaypricetypel.get(i)=null)Subwaypricetypel.set(ij"000000000000");intSl=newintSubwaypricetypel.size();for(inti=1;i<Subwaypricetypel.size();i+)Sli=Integer.parselnt(Subwaypricetypel.get(i).SUbString(4,Subwaypricetypel.get(i).length();this.Sl=SI;3.2.2套票的存储相对于单线来说套票需要有2个元素,换乘前站和换乘后站,所以我将套票存储在一个int二维数组中,通过双重循环向int中赋值。代码段中的SUbWayPriCetyPe2是一个VeCtOrString类型的对象,是将数据分解后存有所有套票票价的字符串向量。其中我也对线名进行了解析,使得例如10,8号线的套票就存在int810号元素中,方便方法调用。代码如下:publicvoidsetSubwayPriceType2()StringTl=newStringsubwaypricetype2.size();for(inti=0;i<subwaypricetype2.size();i+)Tli=subwaypricetype2.get(i).split(",);SlInteger.prseInt(Tli0.SUbString(1,3)Integer.prseInt(Tli1.SUbString(1,3)=Integer.pcrrseInt(Tli2.substring(0,Tli2.length();3.2.3票价数据提供的方法因为本题中一个人在一条线路上不管怎么乘坐价格是不变的,所以我编写了通过传入线名的int值来调用票价的方法,代码如下:publicintgetLinePrice(intIineno)returnSllineno0;publicintgetDiscountPrice(intIinenol,intlineno2)returnSlIinenolIineno2;1 .3窗口的构建3 .3.1站名的列出通过添加按键的方式将站名展示在窗口中,代码如下:publicvoidpaintStationList(inti)GridLayoutlist=newGridLayout();list.numColumns=12;list.makeColumnsEqualWidth=true;list.horizontalSpacing=5;list.marginwidth=0;list.marginHeight=5;stationlist.SetLayout(list);stationlist.SetLayoutData(newGridData(GridData.FILL_VERTICAL);for(intj=0;j<linel.Sli.length;j+)Buttonstation=newButton(stationlist,SVlT.NONE);station.setText(linel.Slij);GridDatagridData=newGridData();gridData.horizontalAlignment=SWT.FILL;gridData.VerticalAlignment=SWT.FILL;station.setLayoutData(gridData);*01WS屯刀251<八角隼乐Blks*B万寿第M礼士能天安门东王扃芬M11÷三«SQCW)也使砧力RBn东ten*XJ曲aIBEn东Ei十条sF三*三ME04jf¾tt公5次桥*11Bt11西,聂境的可不安里SBl动QSi一村人民大学3«忘25西比4t三11安W懵北O¾tCT无防北知需一.行=;不杆立木桥府X三9=w*三变:qW*r三CT卬手西格ID7B%C张自忠路灯皿东匚mx一三三"5W*佞Oe建任玷力疏林公flWCIl弊四10itU7j巴用*X在如雷西土城tt三winX土城安贞门XKM三fl农业晨有博EEi8金笈夕要BW双开佞13让也6BIn舟路a三上均三=axntt三3¾F5bS11三B11图3-1站名的列出3.3.2文本框的构建文本框有三个分别是输入框,复核框,输出框,按照课题需要,编写代码如下:publicvoidpaintPriceOutputFrame()FillLayoutframe=newFillLayout(SWT.H0RIZ04L);frame.marginHeight=5;priceoutputframe.setLayout(frame);priceoutputframe.setLayoutData(newGridData(GridData.FILL_HORIZONTAL);text=newLabel(priceoutputframeSWT.BORDERSViT.LEFT);RGBrgb=newRGB(255,255,255);Colorcc=newColOr(display,rgb);text.setBackground(cc);Fontfont=newFont(displayj"Arial",14,SWT.NORMAL);text.setFont(font);text.setText(",E×ample:一线01-(线04,线13)=440");publicvoidpaintStrategyInputFrame()strategyinputfname.setLayoutData(newGridData(GridData.FILL_HORIZONTAL);strategyinputframe.addVerifyListener(newMyListener();publicvoidpaintThatStrategyFrame()thatStrategyfname.setLayoutData(newGridData(GridData.FILL_HORIZONTAL);thatstrategyframe.setEditable(false);班入会为举承融,(UUS¾)9.如福也更跳起.修中站底序后再试)£第电B3支持X2次:必拿砧如核烹幺力:话华续任碍夕为:Example>01-(04,13)=440图3-2文本框的构建3.3.3按键的构建为了实现按键后输出票价方案,就要实现按键的响应和主函数的调用。其中newMainMethod(origination,destination).getStrategy()就是获取方案和票价的方法。按钮的构建和监听器的代码如下:publicvoidpaintButtons()FillLayoutlist=newFillLayout();list.type=SVIJ.HORIZONTAL;list.marginwidth=0;list.marginHeight=5;buttons.SetLayout(Iist);buttons.setLayoutData(newGridData(GridData.FILL_HORIZONTAL);Buttonaye=newBUttOn(buttons,SVlT.PUSH);aye.setText("确认”);aye.addSelectionListener(newMyListener();Buttoncancel=newButton(buttonsjSVlI.NONE);CanCeLSetTeXt(“清除”);cancel.addSelectionListener(newMyLiStener();publicvoidWidgetSelected(SelectionEventarg0)Buttonwhether=(Button)arg0.getSource();Stringthat=whether.getText();if(that.equals(“确认”)trystations=thatstrategyfname.getText().split(,");origination=stations0;destination=stationsl;text.setText(newMainMethod(origination,destination).getStrategy();catch(Exceptione)text.setText("本系统尚未完善,交换起、终点站或选择附近站点输入再试。”);else按键是“取消的情况”。text.SetTeXt("数据已清除。”);strategyinputframe.setTe×t(,);数据己清除.图3-2按下“取消”的效果3.4主函数的编写1. 4.1站名转换为线名上面说过票价数据提供的方法是传入线名返回票价,所以第一步将站名转化为线名,我们通过调用getLinesNo方法来获取经过该站的所有线名,代码如下:inta=crossstation.getLinesNo(origination);intb=crossstation.getLinesNo(destination);3. 4.2方案的遍历因为起、终点站都有可能是换乘站,所以获取的经过的所有线路的线名是一个数组,我们通过遍历数组来计算所有的方案,代码如下:for(inti=0;i<a.length;i+)for(intj=0;j<b.length;j+)intIinenol=ai;intlineno2=bj;未完4. 4.3方案的计算在这个计算中我把所有能够到达的方案和票价添加进两个向量WayS和PriCeS之中,在最后再通过比较输出最划算的方案(1)在同一条线上的情况if(Iinenol=lineno2)WayS.addElement("线"+Iinenol+prices.addElement(Subwaypricetypel.getLinePrice(Iinenol);(2)不在同一条线上但两线有套票if(subwaypricetype2.getDiscountPrice(Iinenol,lineno2)!=0)prices.addElement(subwaypricetype2.getDiscountPrice(linenoljlineno2);WayS.addElement("(线”+Iinenol+“,线"+lineno2+")=");(3)不在同一条线上能换乘但没有套票if(crossstation.LineCango(linenol,lineno2)prices.addElement(Subwaypricetypel.getLinePrice(Iinenol)+Subwaypricetypel.getLinePrice(lineno2);WayS.addElement("线"+Iinenol+",线"+lineno2+(4)需要中间站的情况(代码量过大贴出后看不清,参看源代码MainMethod.class中60-12。彳亍):(5)所有情况列出后获取最划算方案(代码类似于(6):(6)在(1)过程结束后再进行一次最划算方案的计算intfinalprice=complexprice.get(0);if(complexprice.size()=1)T=complexstrategy.get(0)+complexprice.get(0);elsefor(intk=1;k<complexprice.size();k+)finalprice=finalprice<complexprice.get(k)?finalprice:complexprice.get(k);for(intk=0;k<complexprice.size();k+)if(finalprice=complexprice.get(k)T=complexstrategy.get(k)+comple×price.get(k);这样T(String)就传给了文本输出框。第4章程序测试及分析运行程序,窗口呈现如图:图4-1主界面点击输入框输入:“五棵松,霍营二复检框输出:“五棵松,霍营”,点击“确定”。输出框输出如下:i充备入1£京跖0线京跖,(以IS号(知汾的.11J<!rWUMS.修京3K序信再EIZ奚妮多克持M2次:五tte.*罐三明价力:线IY线4,姣13)=440图4-2运行测试得到正确输出结果。再点击“取消”按钮,结果如下:入的延寿标修侬力:航车线却Q"给力:数据已清除.图4-3重复测试再在输入框中输入:“五棵松,奥体中心”。点击“确认”,结果如下:岷入华於京砧SQ修四力:(线1,或10卜线8=565图4-4重复测试结果正确,功能实现。下面进行报错测试,在输入框中输入不符合要求的任意字符串,结果如下:图4-4重复测试输出报错提示,并提示重新输入,功能完善。第5章总结在一开始拿到课题的时候我连从文件中读取数据都做得一团糟,程序也总是报错,心中一团乱麻。到后来我一步一步修改,不断地看书发现自己的错误,之后,漂亮的界面终于呈现在我面前,自己终于独立写出了能独立运行的具有图形界面的程序。尽管这样的过程令我感到十分高兴,但是放下自己的感动认真的总结起来,自己的收获还是很多的:1、程序是逻辑的艺术,要通过对自己逻辑的训练来提高自己编写程序的能力。我所认为的程序是获取数据源后给出尽可能正确的反馈,而程序的根就是逻辑。同时在计算机可以代替我们进行大量计算的时代,逻辑的严密性又显得更为重要了。在本次课程设计中我不断地读自己写的报错的代码,不断地思考才能发现自己思维上的漏洞,将自己的错误改正。所以有一个良好的逻辑思维习惯,将会大大减少编程出错的概率从而节省时间。而良好的逻辑思维习惯需要不断地通过练习才能形成,所以以后我会多练习,从高数,大物,以及一些精明的程序算法中学习优秀的逻辑思维能力,进而在编程时提高自己的时效。2、编写程序也是需要良好的标准化意识的。恰好在课程设计进行的过程中,我的另外一门选修课是企业管理概论,这门课提到了企业生产标准化给企业生产效率带来的变化。我在编程过程中也深有体会,当我拿到数据源文件时我就在想怎么将数据的读取变得简单起来?答案是标准化,即源文件在编写的时候就注意标准化,并且是面向使用这些文件的人的标准化,这样就会给使用这些文件的人节约大量的时间,只要文件是标准化的,我就可以用程序来读,即使是上千份,上万份也不怕,因为读取工作不用人来做,效率会大大提高。总之这次课程设计让我对程序的编写从整体上有了一个新的认识:我面对的不仅仅只是字符的输出,或者简单的公约数的计算,而是一个从输入到输出的问题解决方案的诞生过程。参考文献1宋波主编;李晋,李妙言,张悦编著.Java程序设计一基于JDK6和NetBeans实现M.北京:清华大学出版社,20IL2-吴越胜,李鑫磊等.Eclipse3.0程序开发技术详解M.北京:清华大学出版社,2010.

    注意事项

    本文(Java课程设计--地铁换乘.docx)为本站会员(夺命阿水)主动上传,课桌文档仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知课桌文档(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-1

    经营许可证:宁B2-20210002

    宁公网安备 64010402000986号

    课桌文档
    收起
    展开