北京地铁计价系统的实现.docx

上传人:b****1 文档编号:14075464 上传时间:2023-06-20 格式:DOCX 页数:20 大小:191.99KB
下载 相关 举报
北京地铁计价系统的实现.docx_第1页
第1页 / 共20页
北京地铁计价系统的实现.docx_第2页
第2页 / 共20页
北京地铁计价系统的实现.docx_第3页
第3页 / 共20页
北京地铁计价系统的实现.docx_第4页
第4页 / 共20页
北京地铁计价系统的实现.docx_第5页
第5页 / 共20页
北京地铁计价系统的实现.docx_第6页
第6页 / 共20页
北京地铁计价系统的实现.docx_第7页
第7页 / 共20页
北京地铁计价系统的实现.docx_第8页
第8页 / 共20页
北京地铁计价系统的实现.docx_第9页
第9页 / 共20页
北京地铁计价系统的实现.docx_第10页
第10页 / 共20页
北京地铁计价系统的实现.docx_第11页
第11页 / 共20页
北京地铁计价系统的实现.docx_第12页
第12页 / 共20页
北京地铁计价系统的实现.docx_第13页
第13页 / 共20页
北京地铁计价系统的实现.docx_第14页
第14页 / 共20页
北京地铁计价系统的实现.docx_第15页
第15页 / 共20页
北京地铁计价系统的实现.docx_第16页
第16页 / 共20页
北京地铁计价系统的实现.docx_第17页
第17页 / 共20页
北京地铁计价系统的实现.docx_第18页
第18页 / 共20页
北京地铁计价系统的实现.docx_第19页
第19页 / 共20页
北京地铁计价系统的实现.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

北京地铁计价系统的实现.docx

《北京地铁计价系统的实现.docx》由会员分享,可在线阅读,更多相关《北京地铁计价系统的实现.docx(20页珍藏版)》请在冰点文库上搜索。

北京地铁计价系统的实现.docx

北京地铁计价系统的实现

一、

地铁计价系统的实现

1.设计目的

1)掌握dijkstra算法的思想;

2)掌握javascript数据类型之javascript对象;

3)采用模块化的思想编写程序;

4)学会用浏览器的调试功能检查代码;

5)掌握整个网页设计过程元素调用的问题,可以将各个元素正确调用;

6)学会将知识应用于实际的方法,提高分析和解决问题的能力,增加综合能力;

7)为后续计算机课程的学习打下坚实基础;

2.设计内容

本次设计基于html+css+javascript设计了一款网页端的地铁计价系统,通过使用javascript对象存储数据,js调用数据和计算,html,css美化前端样式,js实现交互功能等,实现了一个完整的,实用的网页端地铁计价系统。

3.实验步骤

1)整体架构

网页前端index.html由HTML编写,用一个subway-out的大容器承载全部元素,然后将这个容器细分为三大块,也就是使用三个form表单,分别实现起始线路与站点选择,终点线路与站点选择,提交按钮、票价显示和路程显示;HTML美化通过bootstrap和jquery实现,这里不再赘述。

前端交互,线路存储,票价计算及输出等由station.js实现。

2)station.js结构

线路数据通过一个stationData变量实现,这个变量中存储了1~15号线路的全部站点,并且通过stationData[]进行访问。

站点间距离数据通过chartData存储,这个变量中按照类似二维数组的格式存储相邻站点间距离,并且在station.js文件调用时通过dijkstra.addEdges(chartData)初始化到dijkstra算法中。

函数getStartStation和getEndStation用于获取用户选择线路完毕后获取选项option的value值,根据value值向二级select元素中添加stationData线路数据。

实现select选项卡的级联。

函数getSubwayData用于实现用户点击时获取表单内容(即获取select元素内text元素),然后distance中输出根据dijkstra算法中shortest函数得到的距离数,同时输出时使用toFixed

(1)控制输出位数为1位(js中数字为浮点形式);然后将计算的distance传入caleFare函数中计算费用并输出。

函数caleFare实现票价计算:

6公里以内3元、12公里以内4元、32公里以内每超出12公里10公里1元、超出32公里的部分没20公里1元,上不封顶;前两部分判断直接return,后两部分则需要调用函数math.ceil向上取整功能。

3)dijkstra算法

dijkstra=function()将dijkstra实例化为一个函数。

函数内包括5部分:

addChart将station.js中的chartData进行拆分导入:

获取参数的length作为循环总数,通过chart[i]索引二维数组并赋予变量edge,此时edge是包含两个站点和距离的一维数组。

通过edge[i]索引edge中元素并作为参数传入函数addEdge中;

addEdge则是建立图表的函数。

它包括三个参数:

origin,target,distance代表起始、终点、权重。

通过三个参数,建立坐标为origin,target、值为distance的图表。

shortest函数是最重要的算法部分:

通过station.js中dijkstra.shortest(origin,target)传入起点和终点,并返回最短的路径;

函数首先判断传入的数据是否在chart中,如果不在,则返回一个∞;

定义两个对象dist,vistited和一个数字numVertex,直接使用forin结构遍历图表,先认为全部的路径值都是∞,同时获取最大数numVertex用于下层的循环控制。

在用语句dist[origin]=0使得到原点的距离为0;

接下来进行for循环:

;循环中定义一个minDist最短路径为∞,再定义一个最小值v=0;使用forin结构遍历dist[],且v不存在于已经考虑过的点中

,判断最短路径minDist是否大于dist[v],如果大于则将dist[v]中的值赋予minDist,同时将v赋予minV;如果小于则不进行操作。

接下来if判断minV是否仍然为void0,是则跳出循环。

如果minV和目标target相等

,则返回最短路径minDist;否则继续,令对象visited[minV]存储bool值true表示已经找过;再定义一个变量edges=chart[minV],新建循环,求解minDist到下一点的最短路径,如果有则记录到dist[v]中。

进行下次循环。

循环结束之后的已经得到最短路径minDist;return的作用是索引函数,在station.js中通过dijkstra.shortest就可以索引到函数中。

Shortest函数的流程展示:

 

4.部分代码附录

1)index.html:

--2016.11.24nevil-->

DOCTYPEHTML>

Subway

start

起始站

1号线

2号线

4号线

5号线

6号线

7号线

8号线

9号线

10号线

13号线

14号线

15号线

9.5em;">

8px;">

3px;margin-right:

3px;">end

终点站

1号线

2号线

4号线

5号线

6号线

7号线

8号线

9号线

10号线

13号线

14号线

15号线

9.5em;">

8px;">

2em;">

9em;"onclick="getSubwayData()">Submit

0.6em;">

50px;"value=0readonly>

-

55px;"value=0readonly>

km

2)station.js

//菜单级联

functiongetStartStation(){

varstartLine=document.getElementById("startLine");

varstartStation=document.getElementById("startStation");

//获取1,2级菜单id

varadd=[].concat(stationData[startLine.value]);

startStation.length=0;

//清空二级菜单

for(vari=0;i

varstr=newOption();

str.text=add[i];

startStation.add(str);

//text的值添加到二级select中

};

}

functiongetEndStation(){

varendLine=document.getElementById("endLine");

varendStation=document.getElementById("endStation");

varadd=[].concat(stationData[endLine.value]);

endStation.length=0;

for(vari=0;i

varstr=newOption();

str.text=add[i];

endStation.add(str);

};

}

functiongetSubwayData(){

varstartStation=document.getElementById("startStation");

varendStation=document.getElementById("endStation");

varfare=document.getElementById("fare")

vardistance=document.getElementById("distance");

//获取当前select的元素,这里用到selectIndex属性

origin=startStation.options[startStation.selectedIndex].text;

target=endStation.options[endStation.selectedIndex].text;

/*if(origin==target){

fare.value="3";

distance.value="0";

}else{*/

distance.value=dijkstra.shortest(origin,target).toFixed

(1);

fare.value=caleFare(distance.value);

//};

}

//对传入的距离计算fare起步6公里内每人次3元,6-12公里每人次4元,12-32公里每10公里加1元,32公里以上每20公里加1元,票价不封顶

functioncaleFare(distance){

if(distance<=6)return3;

if(distance<=12)return4;

if(distance<=32)return4+Math.ceil((distance-12)/10);

elsereturn6+Math.ceil((distance-32)/20)

}

//初始化算法

functioninitDijkstra(){

dijkstra.addChart(chartData);

}

initDijkstra();//初始化

3)dijkstra.js

/*

*2016.11.24nevil

*/

dijkstra=function(){

functionaddEdge(origin,target,distance){

if(!

(origininchart))chart[origin]={};

if(!

(targetinchart))chart[target]={};

chart[origin][target]=distance,

chart[target][origin]=distance

}

functionaddChart(chart){

for(vari=0;i

varedge=chart[i];

addEdge(edge[0],edge[1],edge[2])

};

}

functionshortest(origin,target){

if(!

(origininchart)||!

(targetinchart))return1/0;

vardist={};

visited={};

numVertex=0;

for(varvinchart)dist[v]=1/0,

numVertex++;

dist[origin]=0;

for(vari=0;i

varminDist=1/0,

minV=void0;

for(varvindist)if(!

(vinvisited)){

if(minDist>dist[v])minDist=dist[v],

minV=v

}else;

if(void0===minV)break;

if(minV===target)returnminDist;

visited[minV]=true;

varedges=chart[minV];

for(varvinedges)if(!

(vinvisited)){

varnewDist=minDist+edges[v];

if(dist[v]>newDist)dist[v]=newDist

}else;

}

return1/0

}

varchart={};

return{

addEdge:

addEdge,

addChart:

addChart,

shortest:

shortest

}

}();

 

4)线路数据

varstationData={

"one":

["苹果园","古城","八角游乐园","八宝山","玉泉路","五棵松","万寿路","公主坟","军事博物馆","木樨地","南礼士路","复兴门","西单","天安门西","天安门东","王府井","东单","建国门","永安里","国贸","大望路","四惠","四惠东"],

"two":

["西直门","车公庄","阜成门","复兴门","长椿街","宣武门","和平门","前门","崇文门","北京站","建国门","朝阳门","东四十条","东直门","雍和宫","安定门","鼓楼大街","积水潭"],

"four":

["安河桥北","北宫门","西苑","圆明园","北大东门","中关村","海淀黄庄","人民大学","魏公村","国家图书馆","动物园","西直门","新街口","平安里","西四","灵境胡同","西单","宣武门","菜市口","陶然亭","北京南站","马家堡","角门西","公益西桥"],

"five":

["宋家庄","刘家窑","蒲黄榆","天坛东门","磁器口","崇文门","东单","灯市口","东四","张自忠路","北新桥","雍和宫","和平里北桥","和平西桥","惠新西街南口","惠新西街北口","大屯路东","北苑路北","立水桥南","立水桥","天通苑南","天通苑","天通苑北"],

"six":

["海淀五路居","慈寿寺","花园桥","白石桥南","车公庄西","车公庄","平安里","北海北","南锣鼓巷","东四","朝阳门","东大桥","呼家楼","金台路","十里堡","青年路","褡裢坡","黄渠","常营","草房","物资学院","通州北关","北运河西","郝家府","东夏园","潞城"],

"seven":

["北京西站","湾子","达官营","广安门内","菜市口","虎坊桥","珠市口","桥湾","磁器口","广渠门内","广渠门外","九龙山","大郊亭","百子湾","化工","南楼梓庄","欢乐谷景区","双合","焦化厂"],

"eight":

["朱辛庄","育知路","平西府","回龙观东大街","霍营","育新","西小口","永泰庄","林翠桥","森林公园南门","奥林匹克公园","奥体中心","北土城","安华桥","安德里北街","鼓楼大街","什刹海","南锣鼓巷"],

"nine":

["郭公庄","丰台科技园","科怡路","丰台南路","丰台东大街","七里庄","六里桥","六里桥东","北京西站","军事博物馆","白堆子","白石桥南","国家图书馆"],

"ten":

["巴沟","苏州街","海淀黄庄","知春里","知春路","西土城","牡丹园","健德门","北土城","安贞门","惠新西街南口","芍药居","太阳宫","三元桥","亮马桥","农业展览馆","团结湖","呼家楼","金台夕照","国贸","双井","劲松","潘家园","十里河","分钟寺","成寿寺","宋家庄","石榴庄","大红门","角门东","角门西","草桥","纪家庙","首经贸","丰台站","泥洼","西局","六里桥","莲花桥","公主坟","西钓鱼台","慈寿寺","车道沟","长春桥","火器营"],

"thirteen":

["东直门","柳芳","光熙门","芍药居","望京西","北苑","立水桥","霍营","回龙观","龙泽","西二旗","上地","五道口","知春路","大钟寺","西直门"],

"fourteen":

["张郭庄","园博园","大瓦窑","郭庄子","大井","七里庄","西局"],

"fifteen":

["俸伯","顺义","石门","南发信","后沙

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 可爱清新

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2