zPSP阶段 |
预算花费时间 |
实际花费时间 |
计划 |
3 |
3 |
明确开发方向,使用功能 |
2 |
2.5 |
开发 |
9 |
15 |
需求分析 |
1 |
2 |
代码编码 |
1 |
3 |
代码复审 |
1 |
1.5 |
测试(修改错误,完善功能) |
1 |
2 |
郑州地铁计费系统
计划过程
在进行编写之前,要对编码方向,实现功能有个大概的构思,再将功能进行细分,规划各个阶段使用的时间。
需求分析
对此次软件功能进行分析,需要什么按钮,需要什么功能,完成什么任务,都需要进行必要的分析。
起点和终点是无法获取乘客的行驶路径,于是乎简化计算过程,只计算两站之间的站数,而不进行公里数的计算。
根据百度后得到每站计算费用的计费方式,对程序计算方法进行编程
具体实现
使用Eclipse对编码进行编程,根据以往学习经验,首先就是需要把数据库设计妥当,用来记录乘客起始和终止位置,计算乘客用时和路程以及费用,需要从数据库中去获取。
其实在之前想过几种方法,觉得太过于简单,或者存在一定的误区,但是运用到算法的话又过于复杂,并且也没有接触过算法,所以要避开使用算法进行计算,细分各个计算过程,再对各个功能进行分析,要实现购票,出票,结算,进站和出战,分析这些问题后就可以开始进行编码了。
再着就是要解决换乘的事情,例如一号线换为三号线,再怎么去解决计费问题,首先用第一站上站的位置开始计数,计算换乘的时候的位置,如果从一号线转到三号线,则计算上车位置到转站位置的站数,再从转站位置重新计数,计算到下车位置的站数,将这进行相加,则可以解决换站计费问题。
开发
简单进行一个系统的模拟,此处只演示两条线路
由于代码测试过程出现几处错误,此处只贴出一篇正确代码
package dt;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Line {
public static List<Station> l1 = new ArrayList();//1号线
public static List<Station> l2 = new ArrayList();//2号线
static {
init();
}
/**
* 初始化方法
*/
private static void init(){
String line1Str = "河南工业大学 郑大科技园 郑州大学 梧桐街 兰寨 铁炉 市民中心 西流湖 西三环 秦岭路区";
String line2Str = "贾河 惠济区政府 毛庄 黄河迎宾馆 金洼 金达路 刘庄 柳林 沙门 北三环 东风路 关虎屯
initArr(l1,l1Str);
initArr(l2,l2Str);
}
/**
* 初始化列表,将字符串按空格分割添加到列表中
* @param stationList 要初始化的列表
* @param lineStr 存放数据的字符串
*/
private static void initArr(List<Station> stationList, String lineStr) {
String[] lineArr = lineStr.split(" ");
for (String s : lineArr) {
stationList.add(new Station(s));
}
for (int i = 0; i < stationList.size(); i++) {
if (i < stationList.size() - 1) {
stationList.get(i).next = stationList.get(i + 1);
stationList.get(i + 1).prev = stationList.get(i);
}
}
lineSet.add(stationList);
stationCount += stationList.size();
}
}
public class Station {
private String name; //地铁站名称
public Station prev; //前一个站
public Station next; //后一个站
//本站到某一个目标站(key)所经过的所有站集合(value),保持前后顺序
private Map<Station,LinkedHashSet<Station>> orderSetMap = new HashMap();
public Station() {
}
public Station (String name){
this.name = name;
}
public String getName() {
return name;
}
public LinkedHashSet<Station> getAllPassedStations(Station station) {
if(orderSetMap.get(station) == null){
LinkedHashSet<Station> set = new LinkedHashSet();
set.add(this);
orderSetMap.put(station, set);
}
return orderSetMap.get(station);
}
public Map<Station, LinkedHashSet<Station>> getOrderSetMap() {
return orderSetMap;
}
@Override
public boolean equals(Object o) {
if (this == o){
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Station station = (Station) o;
return name.equals(station.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}
代码复审和测试
代发复审并没有发现错误,因为单单在代码上无法看出有什么出入,在代码测试的过程,出现有换站过程计算费错误的出现,后面对代码就行优化,把车站计费重新进行修改,把起始站和换乘站的站数加上换乘位置到下车位置的站数,再通过站数进行费用的计算,这样经过几轮测试,发现原本的错误解决掉,在多次测试后,发现并无代码可以进行优化,也无代码错误的出现后,此处测试完成。