《Java课程设计报告--地铁换乘.docx》由会员分享,可在线阅读,更多相关《Java课程设计报告--地铁换乘.docx(21页珍藏版)》请在第壹文秘上搜索。
1、第1章课题概述11.1 课题的目的11.2 课题的要求11 .2.1输入输出的要求12 .2.2程序实现的功能要求12vf-*22.1 程序的主体结构及主要功能的算法21. 11jI-不呈.22. 1.2线路寻找算法23. 1*3力I*43.1. 4地铁换乘相关信息储存及提取4第3章程序功能的实现73.1 主类功能的实现74. 2程序主要功能的实现103.2.1判断用户输入是否规范103.2.2获取线路及价格信息103.2.3获取路线列表123.2.4计算最优价格13第4章调试及发现问题的解决16第5章程序贝!|试及分析17第6章总结19少20第1章课题概述本次Java课程设计的题目是设计并实
2、现地铁换乘中换乘路线以及最优价格。1.1 课题的目的为解决如今交通拥挤的状况,多数城市建设多条地体线路,由于地铁线路的交错以及站点的繁多,通过编写程序对用户所在的起始站以及用户所要到达的目的地两站点进行分析,通过算法的计算,得出最优价格的乘车方案提供给用户,以便用户在挑选乘车方案时提供给用户方便。1.2 课题的要求1.2.1 输入输出的要求(1)程序运行后向用户显示一个地铁换乘的主窗口,在窗口内显示两个可选择下来菜单,为用户提供选择,而不是让用户进行输入站点。(2)用户对起始站以及目的地选择完毕后,在窗口下端的文本区域将显示提供给用户的最优价格方案。(3)对于输出方案的格式中,线路名称用“-”
3、分开,如果两个线路之间使用联票,则联票之间用“J连接,并在两端加括号,与普通票价区分。(4)当多个方案有相同的最小花费,输出任意一个方案即可。1.2.2 程序实现的功能要求(1)对于测试程序过程中,测试数据与实例数据不同,并能够输出正确方案以及输出的各式正确。(2)当用户选择当前起始站,以及目的地,窗口能够输出方案。第2章概要设计2.1 程序的主体结构及主要功能的算法2.1.1 窗口主程序主体的程序为用户提供一个可供选择站点的GUl界面,方便了用户的输入。对于程序的主体的流程,如图:图2-1主程序流程图该界面为用户显示两个可选择站点的下拉菜单,而可能导致输出错误的的原因是由于用户会在选择站点的
4、过程中,误点导致起始站与目的站相同。如果出现错误,程序将弹出错误信息的窗口提示用户选择的站点有误,并提示用户重新选择。2.1.2 线路寻找算法当用户启动程序并选择起始站与目的站,两个站点名称作为String类型参数传入程序,并分别创建对象,线路查找的算法为从起始站找到相邻的站点,将所查找相邻的站点名称与起始的目的站作为参数,利用递归得到所经过的线路。图2-3使用递归遍历起始站作为from,目的站作为to,首先查找from所在的线路,并将所得的所有线路在列表中循环,从第一个线路中,获得该线路包含的所有站点,同时,将当前访问的线路分别存入两个不同的容器中,其中一个作为储存已访问线路的容器,另一个作
5、为所要输出方案的线路。图2-4使用容器储存线路并在之前的循环中再次嵌套一层循环,在内层的循环中,所遍历到的站点作为起始站,目的站保持不变,通过递归的方法再次遍历未遍历的站点,与线路相同,己访问的站点储存在另一个容器中。图2-5储存已访问站点直到from与to相同。如果存在from与to相同,将储存输出结果的容器输出,并删除该容器最后一位元素。储存已访问站点或路线容器中,最后一个元素设为false02.1.3 最优价格最优价格利用数学归纳法,即假设已知从线1到线Ll所要花费的价格,从而推算出从线1到线i所花费的价格。由于存在某些线路之间可以使用联票,这就导致在使用数学归纳法的过程中,可能会出现3
6、种情况。1)线iT与线i之间没有联票;2)线i-2与线i-1之间没有联票,线iT与线i之间有联票;3)线i-2与线iT之间有联票,线i-1与线i之间有联票;图2-6计算最优价格三种情况在寻找线路的算法中,当完成一次线路的查找之后,将储存线路的容器作为参数传入计算价格的方法中,通过上述的算法得出价格并复制给最终作为结果输出价格的变量OptimaLprice暂时储存,但寻找线路的算法再次完成一次线路的查找,重复上述过程,通过与上一次得出的价格做比较,把较小的赋值给optimal_price,直至没有线路方案传入该方法。2.1.4 地铁换乘相关信息储存及提取对于上面描述的两个算法中,涉及到线路名,站
7、点名的查找,为了方便程序的运行,分别对于不同的数据使用不同的容器储存。图2-7线路和站点的储存线路与站点的储存使用MaP容器,将线路或站点的名称作为键,所对应的对象作为值与键相对应。除此之外,在储存线路价格通过使用二维数组储存线路之间的价格,所以需要将每个线路添加一一对应的序号,使用两个不同的MaP容器分别储存线路名称及其所对应的序号,和站点名称与其所对应的序号。图28线路(站点)的序号分配储存线路价格所使用的二维数组的长度和宽度为线路数量大小,在初始化数组下,储存的数值均为0,通过对PriCe.txt的读取,单条线路在二维数组中的数值为该线路价格,如果两条线路之间可以使用联票,则储存为联票的
8、价格,其他为初始值。O(线1)1d22(线4)O(线1)1803503301(线2)35025002(线4)3300160图2-9二维数组储存价格第3章程序功能的实现3.1主类功能的实现主类功能的运行结果为:图3-1程序界面主窗口分为上下两部分(up_panel,down_panel),上面部分为程序输入信息,下面部分为用户输出信息。up_panel分为三部分为别为from_panel,表示起始站相关信息;mid_panel,表示为分隔,是界面显示更加条理分明;to_panel,表示目的地相关信息。相关代码为:Choice_stations_menu_from;Choice_stations_
9、menu_to;JTextArea_optimal_price;publicmywindow(Stringname)super(name);DimensionScreenSize=Toolkit.getDefaultToolkitO.getScreenSize();setSize(300,300);SetLocation(screenSize.width/2-300/2,screenSize.height/2-300/2);SetResizable(false);this.addWIndowListener(newwindowmonitor0);)publicvoidIaunchO/*创建新的
10、窗口*/mywindowwindow=newmywindow(zzSubwayChange);GridLayoutgl=newGridLayout(2,1);*获得所有站名*/Enginee=newEngine();e.initialize();Set_stations_set=e.stations.keySet();FlowLayoutfl=newFlowLayout();fl.setHgap(20);fl.setVgap(30);Panelup_panel=newPanel(fl);uppane1.SetBackground(newColor(245,245,245);gl.SetVgap
11、(IO);window.SetLayout(gl);Panelfrom_panel=newPanel(gl);Labelfrom_label=newLabel(起始站”);fromlabel.SetAlignment(Label.CENTER);from_panel.add(fromlabel);_stations_menu_from=newChoiceO;Iteratori_from=_stations_set.iteratorO;while(i_from.hasNext()_stations_menu_from.add(i_from.nextO);stationsmenu_from.add
12、ItemListener(newChoiceMonitorO);frompanel.add(_stationsmenufrom);PanelIniCLPaneI=newPanel(gl);Labelmidlabel=newLabe1(一);mid_label.setAlignment(Label.CENTER);midpanel.add(mid_label);mid_panel.add(mid_label);Paneltopanel=newPanel(gl);Labelto_label=newLabe1(目的地”);tolabel.setA1ignment(Labe1.CENTER);to_p
13、anel.add(tolabel);_stations_menu_to=newChoiceO;Iteratori_to=_stations_set.iteratorO;while(i_to.hasNextO)stationsmenuto.add(i_to.nextO);)_stations_menu_to.add!temListener(newChoiceMonitorO);topane1.add(_stations_menu_to);UP一PaneLadd(from_panel,BorderLayout.WEST);uppanel.add(midpanel,BorderLayout.CENT
14、ER);uppanel.add(to_panel,BorderLayout.EAST);OPIimaLPriCe=newJTextAreaO;optimalprice.setFont(newFOnt(Default”,Font.PLAIN,15);window,add(up_panel);window,add(OPlimaLPriCe);window.setVisible(true);3.2程序主要功能的实现3.2.1判断用户输入是否规范当用户选择站点时,起始站与目的站相同,则程序需提示用户,对程序的输入有误,并重新选择站点。Stringfrom=_stations_menu_from.getSelectedItem();Stringto=_stations_menu_to.getSelectedItem();if(from,equals(to)error_windowerror=newerror_window();error.setVisible(true);该代码为用户