Skip to content

Tabris-ZX/hands-on-ds-java

Repository files navigation

动手学数据结构与算法(Java 实现版)

每章节代码清单(textcode目录下)

目前在做...

火车票务管理系统(trainsys目录下)

本项目为 C++ 版迁移,支持命令行操作火车票务相关功能。数据自动存储于 data/ 目录。

构建与运行

  • 构建:mvn compile
  • 测试:mvn test
  • 运行:java -cp target/classes boyuai.trainsys.Main
  • 输入 help 查看指令,exit 退出

数据文件

类型 路径
站点库 data/station.txt
数据库 data/hands-on-ds.db

注意:系统使用 SQLite 数据库存储用户、车票、行程等数据

时间格式要求 ⚠️ 重要

系统已全面升级使用 Time 类型,对时间输入进行严格验证:

类型 格式 示例 说明
时间 HH:MM MM-DD 14:30 06-15 小时(0-23)、分钟(0-59)、月日

格式说明:

  • HH - 小时(00-23,24小时制)
  • MM - 分钟(00-59)
  • MM - 月份(01-12)
  • DD - 日期(01-31,根据月份)

有效示例:

  • 08:30 06-15 (6月15日早上8:30)
  • 14:30 06-15 (6月15日下午2:30)
  • 23:59 12-31 (12月31日晚上11:59)
  • 00:00 01-01 (1月1日零点)

无效示例:

  • 8:30 06-15 (小时缺少前导0)
  • 14:5 06-15 (分钟缺少前导0)
  • 24:00 06-15 (小时超出范围,应为00:00)
  • 14:60 06-15 (分钟超出范围)
  • 14:30 6-15 (月份缺少前导0)
  • 14:30 02-29 (2月没有29日,平年)

系统特性

  • 完整时刻信息:记录精确的出发/到达时间
  • 自动计算:根据首发时间和运行时长自动计算到达时间
  • 跨日支持:支持跨天的车次(如23:00出发次日01:00到达)
  • 严格验证:所有时间输入都经过格式和范围验证

指令总览

模块 指令名 参数示例/说明
用户管理 register -i <用户ID> -u <用户名> -p <密码>
login -i <用户ID> -p <密码>
logout 无参数
modify_password -i <用户ID> -p <新密码>
modify_privilege -i <用户ID> -g <权限值>
query_profile -i <用户ID>
运行计划 add_train -i <车次ID> -m <席位数> -n <站点数> -s <站名1/站名2/...> -t <时长1/时长2/...> -p <票价1/票价2/...>
query_train -i <车次ID>
票务 release_ticket -i <车次ID> -d <日期>
expire_ticket -i <车次ID> -d <日期>
query_remaining -i <车次ID> -d <日期> -f <出发站名>
buy_ticket -i <车次ID> -d <日期> -f <出发站名>
query_order 无参数
refund_ticket -i <车次ID> -d <日期> -f <出发站名>
路线 display_route -s <起点站名> -t <终点站名>
query_best_path -s <起点站名> -t <终点站名> -p <time or price>
query_accessibility -s <起点站名> -t <终点站名>
系统 help 无参数
exit 无参数

使用示例

基本操作流程:

# 1. 登录(管理员账户)
login -i 0 -p admin

# 2. 添加列车 ⚠️ 注意 -t 参数格式
add_train -i D2282 -m 1000 -n 4 -s 北京/天津/济南/青岛 -t 08:00/35/95/160 -p 29/97/118
#                                                           ^^^^^ 首发时间(HH:MM)
#                                                                ^^^^^^^^ 各区段时长(分钟)
#                                                                             ^^^^^^^^ 各区段票价
# 说明:
#   -n 4 表示4个站点,有3个区段
#   -t 第一个值 08:00 是首发时间(HH:MM格式)
#   -t 后面的 35/95/160 是3个区段的时长(分钟)
#   -p 的 29/97/118 是3个区段的票价

# 3. 发售车票(指定完整时间)⚠️ 格式 HH:MM MM-DD
release_ticket -i D2282 -d 08:00 06-15
#                          ^^^^^^^^^^^^ HH:MM MM-DD
# 含义:发售6月15日早上8:00出发的D2282次列车车票

# 4. 查询余票
query_remaining -i D2282 -d 08:00 06-15 -f 北京

# 5. 购票
buy_ticket -i D2282 -d 08:00 06-15 -f 北京
# 系统会自动计算并保存:
#   北京 -> 天津:08:00出发,08:35到达(35分钟)
#   天津 -> 济南:08:35出发,10:10到达(95分钟)
#   济南 -> 青岛:10:10出发,12:50到达(160分钟)

# 6. 查询我的订单
query_order
# 将显示完整的出发/到达时间信息,包括:
#   departureTime: 08:00 06-15
#   arrivalTime: 08:35 06-15

# 7. 路线查询
query_best_path -s 北京 -t 青岛 -p time

# 8. 退票
refund_ticket -i D2282 -d 08:00 06-15 -f 北京

常见错误及修正:

# ❌ 错误:首发时间格式错误
add_train -i 11 -m 100 -n 2 -s 北京/上海 -t 20/120 -p 100
#                                            ^^ 错误!应该是 20:00

# ✅ 正确:首发时间使用 HH:MM 格式
add_train -i 11 -m 100 -n 2 -s 北京/上海 -t 20:00/120 -p 100
#                                            ^^^^^ HH:MM格式

# ❌ 错误:时间缺少前导0
buy_ticket -i D2282 -d 8:00 06-15 -f 北京

# ✅ 正确:小时必须是2位数
buy_ticket -i D2282 -d 08:00 06-15 -f 北京

# ❌ 错误:票价数量不对(2站点应该1个票价)
add_train -i 11 -m 100 -n 2 -s 北京/上海 -t 08:00/120 -p 100/200

# ✅ 正确:2站点=1区段=1票价
add_train -i 11 -m 100 -n 2 -s 北京/上海 -t 08:00/120 -p 100

时间格式示例:

早班车: 06:00 06-15  (6月15日早上6点)
上午车: 09:30 06-15  (6月15日上午9:30)
午班车: 12:00 06-15  (6月15日中午12点)
下午车: 15:45 06-15  (6月15日下午3:45)
晚班车: 18:30 06-15  (6月15日晚上6:30)
夜班车: 23:00 06-14  (6月14日晚上11点,次日凌晨到达)
零点车: 00:00 06-15  (6月15日零点)

测试

项目包含完整的单元测试,确保数据结构和工具类的正确性:

# 运行所有测试
mvn test

# 运行特定测试
mvn test -Dtest=DateTest
mvn test -Dtest=TimeTest

测试覆盖:

  • ✅ 数据结构测试(List, Queue, Tree, Graph等)
  • ✅ 日期时间验证测试
  • ✅ 输入格式验证

差异文件(doc/difference.md)

C++ 与 Java 实现差异说明

Plus版本(trainsys_plus)

优化后的火车票务系统,项目操作更加人性化,更贴合现实项目
目前在做...

About

动手学数据结构与算法 Java语言实现

Resources

Stars

Watchers

Forks

Contributors 2

  •  
  •  

Languages