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=Intege