2019年9月30日第一次极限编程
题目:
石家庄铁道大学2019年秋季
2018 级极限课堂测试试卷
课程名称: JAVA语言程序设计 任课教师:王建民
一、测试要求:
1、按照测试内容要求完成程序的设计与编程;
2、建立班级学号姓名文件夹,如:“信1805-1班20183557杨雄豪”,将源程序文件保存在文件夹中。
3、生成shijiazhuang-subway.txt数据库文件,保存地铁站点信息。
4、将最终结果的源文件(.java)和数据库文件保存在个人目录下,并压缩成同名的RAR文件,以班级为单位上交。
二、测试内容:
石家庄地铁一号线站点信息如下:
洨河大道、南村、石家庄东站、火炬广场、留村、白佛、朝晖桥、
谈固、北宋、体育场、博物院、北国商城、平安大街、解放广场、新百广场、烈士陵园、和平医院、长城桥、时光街、西王。
石家庄地铁三号线站点信息如下:
市二中、新百广场、东里、槐安桥、西三教、石家庄站。
1、把石家庄地铁图的各个线路,各个站点,换乘信息等用文本文件 shijiazhuang-subway.txt的形式保存起来,应该保存的信息有 {线路号,线路的各个站名,车站的换乘信息}。
2、定义Subway数据类
其中包括
三个私有变量:线路号、线路的各个站名,换乘车站的信息。
三个方法:
(1)遍历线路信息:输出线路号,显示所有改线路站点信息。
(2)查询站点信息:输入起始站、终点站,返回经历的站名的个数,和路径,如果有换乘,请列出换乘的线路, 例如:
起始站:北国商城
终点站:石家庄站
返回结果显示:
7站
北国商城
平安大街
解放广场
新百广场 换乘3号线
东里
槐安桥
西三教
石家庄站
(3)购票:统计起始站和终点站之间经过站点之和(包括终点站,不包括起始站),以每三站1元钱标准计算,超出部分不足三站的按照最低票价1元计算。例如北国商城到石家庄站共有7站,票价为3元。
3、定义FirstLineSubway、ThirdLineSubway类继承Subway实现并实现上述Subway的相关功能。
4、定义SubwayManager类实现地铁运行功能,显示下列界面。
(1)欢迎界面
***************************************************************
欢迎乘坐石家庄地铁
****************************************************************
1、 显示具体线路信息;
2、 购票;
****************************************************************
(2)显示具体线路信息(需要标注换乘站信息)
提示用户输入线路号,显示该线路的全部站点信息,换乘车站应标注换乘信息,如果用户输入0,则显示全部线路信息。
***************************************************************
石家庄地铁线路图
****************************************************************
1号线:站点1…………………….
3号线:站点1…………………….
****************************************************************
(3)购票界面
***************************************************************
欢迎乘坐石家庄地铁
****************************************************************
起始站:
终点站:
购票数量:
****************************************************************
返回结果界面
返回经历的站名的个数,和路径,如果有换乘,请列出换乘的线路,和购票金额。
显示结果如下所示:
***************************************************************
欢迎乘坐石家庄地铁
****************************************************************
7站
北国商城
平安大街
解放广场
新百广场 换乘3号线
东里
槐安桥
西三教
石家庄站
购票单价:3元
购票金额:6元
****************************************************************
5、需要在程序开始的注释中注明班级、学号、姓名。
源代码:
import java.io.*; import java.util.*; //信1805-1-20183597-高宇豪 public class Main { public static void main(String [] args){ SubwayManager B=new SubwayManager() ; B.printList(); int N; Scanner input=new Scanner(System.in); N=Integer.parseInt(input.next()); switch(N) { case 1: B.printLine(); B.printBuy(); B.locateLine(); B.buyTicket(); B.returnBuy(); break; case 2: B.printBuy(); B.locateLine(); B.buyTicket(); B.returnBuy(); break; default: System.out.println("输入错误"); } input.close(); } } /*int i=0; String pathname = "C:\\Users\\26218\\eclipse-workspace\\FirstBlood\\src\\shijiazhuang-subway.txt"; try (FileReader reader = new FileReader(pathname); BufferedReader br = new BufferedReader(reader) // 建立一个对象,它把文件内容转成计算机能读懂的语言 ) { String line; while ((line = br.readLine()) != null) { // 一次读入一行数据 System.out.print(i++); System.out.println(line); } } catch (IOException e) { e.printStackTrace(); }*/
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.*; public class Subway { private String [][] S; private int i,N; private int [] s=new int[2]; private int [] e=new int[2]; private int money; private int long1; Subway(){ read(); i=26; N=0; } int getmoney() { return money; } int getN() { return N; } int gete(int n) { return e[n]; } String getSe() { return S[e[1]][1]; } int gets(int n) { return s[n]; } String getS(int n) { return S[n][1]; } String getSs() { return S[s[1]][1]; } int getLong1() { return long1; } //读入信息 void read() { String pathname = "C:\\Users\\26218\\eclipse-workspace\\FirstBlood\\src\\shijiazhuang-subway.txt"; try (FileReader reader = new FileReader(pathname); BufferedReader br = new BufferedReader(reader) // 建立一个对象,它把文件内容转成计算机能读懂的语言 ) { String line; S=new String[26][3]; while ((line = br.readLine()) != null) { // 一次读入一行数据 String [] A=line.split(" "); S[i][0]=A[0]; S[i][1]=A[1]; S[i][2]=A[2]; i++; } } catch (IOException e) { e.printStackTrace(); } } int geti() { return i; } //输出线路信息 void getLine(int n) { switch(n) { case 1: for(int i=0;i<this.i;i++) { if(S[i][0].equals("1")) { System.out.print(S[i][1]); if(i<19) { System.out.print("--"); } else System.out.println(); } } break; case 2: for(int i=0;i<this.i;i++) { if(S[i][0].equals("2")) { System.out.print(S[i][1]); if(i<25) { System.out.print("--"); } else System.out.println(); } } } } //查询站点信息 void locateLine() { System.out.println("请输入起始站"); Scanner input1=new Scanner(System.in); String start,end; start=input1.next(); for(int j=0;j<this.i;j++) { if(start.equals(S[j][1])) { s[1]=j; if(S[j][0].equals("1"))s[0]=1; else s[0]=2; break; } } System.out.println("请输入终点站"); //Scanner input2=new Scanner(System.in); end =input1.next(); for(int j=0;j<this.i;j++) { if(end.equals(S[j][1])) { e[1]=j; if(S[j][0].equals("1"))e[0]=1; else e[0]=2; break; } } System.out.println("请输入购票数量"); //Scanner input3=new Scanner(System.in); N=input1.nextInt(); //input1.close(); //input2.close(); //input3.close(); } //购票 void buyTicket() { if(e[0]==s[0]) { money=(Math.abs(s[1]-e[1]))/3*3; if((Math.abs(s[1]-e[1]))%3!=0)money++; long1=Math.abs(s[1]-e[1]); } else { int q=0; if(s[0]==1) { q=Math.abs(s[1]-14); q+=Math.abs(e[1]-21); money=(q/3)*3; if((q)%3!=0)money++; } else { q=Math.abs(e[1]-14); q+=Math.abs(s[1]-21); money=(q/3)*3; if((q)%3!=0)money++; } long1=q; } } }
import java.util.*; public class SubwayManager extends Subway{ //显示欢迎界面 void printList() { System.out.println( "***************************************************************\r\n" + "欢迎乘坐石家庄地铁\r\n" + "****************************************************************\r\n" + "1、 显示具体线路信息;\r\n" + "2、 购票;\r\n" + "****************************************************************\r\n"); } //显示线路信息 void printLine() { int n; System.out.println("请输入要查询的线路号,查询全部的线路信息请输入0"); System.out.println( "***************************************************************\r\n" + "石家庄地铁线路图\r\n" + "****************************************************************\r\n"); Scanner input=new Scanner(System.in); n=Integer.parseInt(input.next()); switch(n) { case 0: System.out.println("线路1:"); getLine(1); System.out.println("线路3:"); getLine(2); break; case 1: //输出线路1 System.out.println("线路1:"); getLine(1); break; case 2: //输出线路2 System.out.println("线路3:"); getLine(2); break; } //input.close(); } //显示购票界面 void printBuy() { System.out.println("***************************************************************\r\n" + "欢迎乘坐石家庄地铁\r\n" + "****************************************************************\r\n" ); System.out.println("起始站:"); System.out.println("终点站:"); System.out.println("购票数量:"); System.out.println("****************************************************************"); } //返回结果界面 void returnBuy() { System.out.println("***************************************************************\r\n" + "欢迎乘坐石家庄地铁\r\n" + "****************************************************************\r\n" ); System.out.println(getLong1()+"站"); if(gets(0)==gete(0)) { if(gets(1)>gete(1)) { for(int i=gets(1);i>=gete(1);i--) { System.out.println(getS(i)); } } else { for(int i=gets(1);i<=gete(1);i++) { System.out.println(getS(i)); } } } else { if(gets(0)==1) { if(gets(1)>14) { for(int i=gets(1);i>14;i--) { System.out.println(getS(i)); } } else { for(int i=gets(1);i<14;i++) { System.out.println(getS(i)); } } if((gete(1)-20)>1) { for(int i=21;i<=gete(1);i++) { System.out.println(getS(i)); } } else { for(int i=21;i>=gete(1);i--) { System.out.println(getS(i)); } } } else { if(gets(1)>21) { for(int i=gets(1);i>21;i--) { System.out.println(getS(i)); } } else { for(int i=gets(1);i<21;i++) { System.out.println(getS(i)); } } if(gete(1)>14) { for(int i=14;i<=gete(1);i++) { System.out.println(getS(i)); } } else { for(int i=14;i>=gete(1);i--) { System.out.println(getS(i)); } } } } System.out.println("购票单价:"+ getmoney() +"元"); System.out.println("购票单价:"+ getN()*getmoney()+"元"); System.out.println("****************************************************************"); } }
1 洨河大道 false 1 南村 false 1 石家庄东站 false 1 火炬广场 false 1 留村 false 1 白佛 false 1 朝晖桥 false 1 谈固 false 1 北宋 false 1 体育场 false 1 博物院 false 1 北国商城 false 1 平安大街 false 1 解放广场 false 1 新百广场 true 1 烈士陵园 false 1 和平医院 false 1 长城桥 false 1 时光街 false 1 西王 false 2 市二中 false 2 新百广场 true 2 东里 false 2 槐安桥 false 2 西三教 false 2 石家庄站 false
感悟:
这是第一次极限编程,我从下午2点半编程到了8点半,也就是说我到最后也没有输出正确答案,尽管差之毫厘。到宿舍之后也没看别人的代码,就是5分钟静静地坐在电脑前,灵感就有了,代码也就马上完成了。输出正确结果的那一瞬间内心的那种成就感瞬间爆发,但是又让我很快陷入了思考。为什么我现在这么短时间就能够编出来的东西在那里那么久就想不通?首先肯定就是心不静,看到他们一个一个都走了,我就开始心慌,一慌思路肯定就乱了,编程的时候一定要思路清晰,要不然编错之后查BUG更费时间。
再有就是编程中遇到的问题:
1.总是出现空指针的问题。我遇到的一共有两种,一个是数组空指针,原因是数组没有定义长度或者是没有初始化,还有一个就是数组下标越界也会出现空指针的问题。
2.第二个问题就是输入的时候用的是Scanner方法,多次调用了Scanner 然后习惯性的close掉,通过上网搜索发现是因为Scanner用的是输入流,如果在系统没有结束的情况下close掉会影响没有运行的Scanner对象的输入。
3.文件的读入,第一个大问题就是如何读入文件,在网上找的固定格式的模板,明白其中的原理是一个指针挨个读取,不同的组合有不同的读取方式,有按行的有按字节的。学会读入文件之后又一大难题,如何将读进来的东西转化为对自己有用的信息,这就用到一个分隔读取的方法(代码如下)。
void read() { String pathname = "C:\\Users\\26218\\eclipse-workspace\\FirstBlood\\src\\shijiazhuang-subway.txt"; try (FileReader reader = new FileReader(pathname); BufferedReader br = new BufferedReader(reader) // 建立一个对象,它把文件内容转成计算机能读懂的语言 ) { String line; S=new String[26][3]; while ((line = br.readLine()) != null) { // 一次读入一行数据 String [] A=line.split(" ");//将读入的字符串按照空格分隔录入数组 S[i][0]=A[0]; S[i][1]=A[1]; S[i][2]=A[2]; i++; } } catch (IOException e) { e.printStackTrace(); } }