无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 3938|回复: 3
打印 上一主题 下一主题

公交线路查询器

[复制链接]
跳转到指定楼层
1#
发表于 2006-12-28 16:31:27 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
  在英汉互译器的基础上更进一步,批处理版的公交信息查询系统就出笼啦:

  1. @echo off
  2. title 公交线路查询器-test
  3. setlocal enabledelayedexpansion
  4. goto begin

  5. 功能:
  6.   ① 输入线路名称,显示该线路的所有站点及发车收车时间;
  7.   ② 输入上车站点和下车站点,显示可直达的车次,并显示每条线路中这两个站点及其之间的所有站点及发车收车时间;
  8.   ③ 可查询换乘线路

  9. 流程:
  10.   1、输入查询对象;
  11.     2、判断输入类型:若为数字、数字+字母,则查询车次;若带汉字,则查询站点信息;
  12.   3、若查询车次,有则显示,无则提示重新查询;
  13.   4、若查询站点,首先检测是否存在此站点;若不存在,则提示换用近似的站点查询;若存在该站点,有直达则只显示直达,无直达则查询换乘;若无换乘,则提示重新查询,此时罗列近似的起止站点供选择;

  14. code by JM 2006-10-17~11-17   CMD@XP

  15. :begin
  16. cls
  17. set input=
  18. set /p input=请输入车次或上、下车站点:
  19. :: 车次只允许输入数字或数字+字母,否则会认为是站点
  20. echo %input%|findstr /r "^[0-9][0-9]*[a-zA-Z]*$">nul &&(
  21.     call :get_line %input%
  22.     echo !num!
  23.     echo !_time!
  24.     echo !line_info:~1,-1!
  25.     goto end
  26. )
  27. call :find_station %input%

  28. rem ========== 查询车次编号匹配的线路信息 ==========

  29. :get_line
  30. :: 获取要查询的车次编号所在的行
  31. cls
  32. set line=
  33. for /f "tokens=1* delims=:" %%i in ('findstr /nr "^%1路:$" 公交线路.txt') do (
  34.     set line=%%i
  35.     if not "!line!"=="" goto get_block
  36. )
  37. goto no-item

  38. rem ========== 查询直达方案 ==========

  39. :find_station
  40. :: 只允许同时输入两个站点
  41. if "%2"=="" goto begin
  42. if not "%3"=="" goto begin
  43. find "-%1-" 公交线路.txt>nul||goto no-start
  44. find "-%2-" 公交线路.txt>nul||goto no-end
  45. cls
  46. set line=
  47. set str=
  48. set var=
  49. for /f "tokens=1* delims=:" %%i in ('findstr /n "\-%1\-" 公交线路.txt') do (
  50.     set line=%%i
  51.     set str=%%j
  52.     set str=!str:-%2-=!
  53.     if not "!str!"=="%%j" (
  54.         set var=%%j
  55.         set var=!var:-%1-=-☆%1☆-!
  56.         set var=!var:-%2-=-☆%2☆-!
  57.         call :pick-up %input% !var!
  58.         call :type_nostop
  59.     )
  60. )
  61. :: 如果没找到直达线路,则查询换乘方案
  62. if "%var%"=="" call :transfer %input%

  63. :end
  64. pause
  65. goto begin

  66. rem ========== 查询换乘方案 ==========

  67. :: 换乘线路只能查到匹配的第一条,可能不是最短线路
  68. :transfer
  69. set first_line=
  70. set first_id=
  71. set first_time=
  72. set second_line=
  73. set second_id=
  74. set second_time=
  75. set link=
  76. for /f "tokens=1* delims=:" %%i in ('findstr /n "\-%1\-" 公交线路.txt') do (
  77.     set first_line=%%i&set str_start=%%j
  78.     set stations_start=!str_start:-= !
  79.     for /f "tokens=1* delims=:" %%k in ('findstr /n "\-%2\-" 公交线路.txt') do (
  80.         set second_line=%%k&set str_end=%%l
  81.         set stations_end=!str_end:-= !
  82.         for %%m in (!stations_start!) do (
  83.             for %%n in (!stations_end!) do (
  84.                 if "%%m"=="%%n" (
  85.                     set link=%%m
  86.                     set /a line=!first_line!-2&&call :get_block
  87.                     set first_id=!num!
  88.                     set first_time=!_time!
  89.                     set /a line=!second_line!-2&&call :get_block
  90.                     set second_id=!num!
  91.                     set second_time=!_time!
  92.                     goto type_change
  93.                 )
  94.             )
  95.         )
  96.     )
  97. )
  98. if "%link%"=="" goto no-change


  99. rem ━━━━━━━━━━━ 子过程 ━━━━━━━━━━━

  100. rem ========== 获取某条线路的完整信息 ==========
  101. :get_block
  102. set /a line-=1
  103. set count=
  104. for /f "skip=%line%" %%i in (公交线路.txt) do (
  105.     set /a count+=1
  106.     if !count! equ 1 set num=%%i
  107.     if !count! equ 2 set _time=%%i
  108.     if !count! equ 3 set line_info=%%i
  109.     if !count! gtr 3 goto :eof
  110. )

  111. rem ========== 提取上车站点到下车站点之间的所有站点 ==========
  112. :pick-up
  113. for /f "tokens=2-4 delims=☆" %%i in ("%3") do set var=%%i%%j%%k
  114. :: 判断输入的起止点在 公交线路.txt 中的先后顺序
  115. :: 以决定是否逆向显示相关信息
  116. for /f "tokens=1 delims=-" %%i in ("!var!") do if "%%i"=="%2" call :reverse
  117. goto :eof

  118. rem ========== 显示直达方案信息 ==========

  119. :type_nostop
  120. set /a line-=2
  121. call :get_block
  122. echo 乘坐 %num:~0,-2% 路车(%_time%):%var%
  123. echo.
  124. goto :eof

  125. rem ========== 显示换乘方案信息 ==========
  126. :type_change
  127. echo 交汇点是 %link%
  128. echo.
  129. set str_start=!str_start:-%1-=-☆%1☆-!
  130. set str_start=!str_start:-%link%-=-☆%link%☆-!
  131. echo 先搭乘 %first_id:~0,-2% 路在 %link% 站下车,然后换乘 %second_id:~0,-2% 路即可,换乘方案为:
  132. echo.
  133. call :pick-up %1 %link% %str_start%
  134. echo %first_id:~0,-2%路(%first_time%): %var%
  135. set str_end=!str_end:-%2-=-☆%2☆-!
  136. set str_end=!str_end:-%link%-=-☆%link%☆-!
  137. echo.
  138. call :pick-up %1 %2 %str_end%
  139. echo %second_id:~0,-2%路(%second_time%): %var%
  140. echo _____________________________________________________________
  141. goto :eof

  142. rem ========== 逆向显示站点信息 ==========
  143. :reverse
  144. set var=%var:-= %
  145. set str=
  146. for %%i in (%var%) do set str=%%i-!str!
  147. set var=%str:~0,-1%
  148. goto :eof



  149. rem ━━━━━━━━━━━ 出错信息 ━━━━━━━━━━━

  150. :no-start
  151. cls
  152. echo 没有找到名为 "%1" 的上车站点
  153. pause
  154. goto begin

  155. :no-end
  156. cls
  157. echo 没有找到名为 "%2" 的下车站点
  158. pause
  159. goto begin

  160. :no-change
  161. echo 没有找到直达线路,也找不到只转一次车的换乘方案
  162. pause
  163. goto begin

  164. :no-item
  165. echo 没有找到车次编号为 "%input%" 的相关信息,请重新查阅.
  166. pause
  167. goto begin
复制代码

  公交线路.txt 格式举例:

  1. 线路信息格式为:
  2.   ① 文本正文首行不能为线路信息,可以设为空,或其他内容;
  3.   ②  每条线路第一行为线路编号,格式为"数字+路:"(如11路:)或 数字+字母+路:(如503A路:),必须是中文半角状态下的冒号;第二行为发、收车时间;第三行为经过的站点,每个站点用短横线括起来,(如:-川大-电子科大-);
  4.     ③  每条线路的信息块之间只能用空行分隔,或者不分隔;
  5.   ④  除了站点、时间之间用-分隔之外,其他行不能再出现-;

  6. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  7. 1路:
  8. 6:00-23:00
  9. -青龙场中心站-昭觉寺横街-洪家坡-驷马桥-高笋桥-解放路一段-梁家巷-好又多府河店-北大街-中西顺城街-盐市口-红照壁-南大街-浆洗街-南郊路-武侯祠-高升桥-高升桥路中段-佳灵路-川藏路高新路口-太平园-八一家具城-

  10. 2路:
  11. 5:45-22:30
  12. -火车北站-荷花池-高笋塘-二环路北四段-二环路东一段北-二环路东一段中-二环路东一段南-麻石桥-二环路东三段中-万年场-双林中横路-双桥子-塔子山-五桂桥-

  13. 3路:
  14. 6:15-23:00
  15. -桦林园-红砖桥-沙河大桥-东光小区-二环路东五段-三官堂-顺江路-九眼桥-牛王庙-水碾河-东风大桥-大慈寺路-总府路东-文化宫-太升路口-青羊二医院-江汉路东-江汉路西-通锦桥-沙湾路-会展中心-西南交大-交大路西-香榭里-九里堤公交总站-

  16. 4路:
  17. 5:50-23:00
  18. -五桂桥-双桥子-水碾河-东风大桥-大慈寺路-总府路东-总府路-人民西路-东城根上街-羊市街-西大街-西月城街-花牌坊街-西门车站-营门口立交桥-五里村-茶店子-茶店子西-三环路成灌路立交桥南-茶店子公交站-
复制代码
4#
发表于 2007-1-16 05:09:57 | 只看该作者
收藏学习,谢谢分享!
回复

使用道具 举报

3#
发表于 2007-1-15 21:04:15 | 只看该作者
不错,收藏了。
回复

使用道具 举报

2#
发表于 2006-12-28 17:38:18 | 只看该作者
全部收藏,今天没白来.哈哈
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-15 15:22

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表