先看一下题目:
1、一列火车在 WA——WB之间行驶,两地相距 110公里,之间还有等距的 10 个站点,如下:
WA-W1-W2-W3-W4-W5-W6-W7-W8-W9-W10-WB 当火车到达 WB 时反向行驶(即返航) ,当到达 WA 后火车还会正向行驶;
2、火车匀速行驶 60 公里/小时;
3、系统在每 30 分钟在下面站点(一次循环示例)施行交通管制:
4、运营时间 7:30 至 21:30,21:30 之后乘客均下车;
5、乘客上下车不计算耗时;
6、乘客任何时刻均可候车;
7、火车最多乘客数为 20 人[CK01,CK20],编号可以超出 CK20 范围;
8、火车乘客计费: 起车价 10 元(包括 10 公里起步里程);超出起步里程每公里 1.5 元;停车等候每累 计 5 分钟加收 1 公里费用;
我们就先把运营时间表写出来,然后存储到一个类中去
第一个类LXT:
public class LXT {
public String zdqd; //站点起点
public String zdzd; //终点站点
public String qssj; //起始时间
public String zzsj; //终止时间
public int tlsj; //停留时间
public int cd;
public LXT(){
zdqd="";
zdzd="";
qssj="";
zzsj="";
tlsj=0;
cd=0;
}
@Override
public String toString() {
return "LXT{" +
"zdqd='" + zdqd + '\'' +
", zdzd='" + zdzd + '\'' +
", qssj='" + qssj + '\'' +
", zzsj='" + zzsj + '\'' +
", tlsj=" + tlsj +
", cd=" + cd +
'}';
}
}
然后创建类LXTTABLE ,存储各个时间段。
public class LXTTable {
public static LXT[] lxt=new LXT[79];
public static String[] zd=new String[12];
public static String zzsj(String qssj){
String[] ss=qssj.split(":");
String tt;
if(Integer.parseInt(ss[1])+10==60){
if(Integer.parseInt(ss[0])+1>9)
tt=(Integer.parseInt(ss[0])+1) +":00";
else
tt="0"+(Integer.parseInt(ss[0])+1)+":00";
}
else
tt=ss[0]+":"+(Integer.parseInt(ss[1])+10);
return tt;
}
static {
String sj="07:30";
zd[0]="WA";
for(int i=1;i<=10;i++){
zd[i]="W"+i;
}
zd[11]="WB";
for(int h=0;h<lxt.length;h++){ //开始注册lxt ,即时间表
if(h<=10||(h>=22&&h<=32)||(h>=44&&h<=54)||(h>=66&&h<=76))
{
lxt[h]=new LXT();
lxt[h].cd=10;
lxt[h].zdqd=zd[h%11];
lxt[h].zdzd=zd[h%11+1];
lxt[h].tlsj=0;
lxt[h].qssj=sj;
if(h==66){
lxt[h].qssj="19:10";
lxt[h].tlsj=10;
}
if(h==68){
lxt[h].qssj="19:40";
lxt[h].tlsj=10;
}
lxt[h].zzsj=zzsj(lxt[h].qssj);
sj=lxt[h].zzsj;
}
if(h>=11&&h<=21||(h>=33&&h<=43)||(h>=55&&h<=65)||(h>=77&&h<=78)){
lxt[h]=new LXT();
lxt[h].cd=10;
lxt[h].zdqd=zd[11-h%11];
lxt[h].zdzd=zd[11-(h%11+1)];
lxt[h].qssj=sj;
lxt[h].tlsj=0;
if(h==33){
lxt[h].qssj="13:10";
lxt[h].tlsj=10;
}
if(h==41){
lxt[h].qssj="14:40";
lxt[h].tlsj=10;
}
if(h==58){
lxt[h].qssj="17:40";
lxt[h].tlsj=10;
}
lxt[h].zzsj=zzsj(lxt[h].qssj);
sj=lxt[h].zzsj;
}
}
}
}
然后创建乘客类:
public class CK {
private String ckbh="";//乘客编号
private String qszd="";//起始站点
private String zzzd="";//终止站点
private String hcsk="";//候车时间
private double fy=0;//费用
private int cfzdxb=0; //出发站点下标
public double getFy() {
return fy;
}
public void setFy(double fy) {
this.fy = fy;
}
public int getCfzdxb() {
return cfzdxb;
}
public void setCfzdxb(int cfzdxb) {
this.cfzdxb = cfzdxb;
}
public int getMdzdxb() {
return mdzdxb;
}
public void setMdzdxb(int mdzdxb) {
this.mdzdxb = mdzdxb;
}
public int getTlsj() {
return tlsj;
}
public void setTlsj(int tlsj) {
this.tlsj = tlsj;
}
int mdzdxb=0;//目的站点下标
int tlsj=0; //停留时间
public void setCkbh(String ckbh) {
this.ckbh = ckbh;
}
public void setQszd(String qszd) {
this.qszd = qszd;
}
public void setZzzd(String zzzd) {
this.zzzd = zzzd;
}
public void setHcsk(String hcsk) {
this.hcsk = hcsk;
}
public CK(){
}
public String getCkbh() {
return ckbh;
}
public String getQszd() {
return qszd;
}
public String getZzzd() {
return zzzd;
}
public String getHcsk() {
return hcsk;
}
public CK(String bh){
this.ckbh=bh;
this.fy=0;
this.tlsj=0;
}
@Override
public String toString() {
return "CK{" +
"ckbh='" + ckbh + '\'' +
", qszd='" + qszd + '\'' +
", zzzd='" + zzzd + '\'' +
", hcsk='" + hcsk + '\'' +
", fy=" + fy +
", cfzdxb=" + cfzdxb +
", mdzdxb=" + mdzdxb +
", tlsj=" + tlsj +
'}';
}
public void jstlsj(){ //计算停留时间
int s=0;
for(int i=cfzdxb;i<mdzdxb;i++){
s=s+LXTTable.lxt[i].tlsj;
tlsj=s;
}
}
public void jsfy(){ //计算费用
if(this.mdzdxb-this.cfzdxb>=1) {
this.fy = ((this.mdzdxb - this.cfzdxb )*10 + (this.tlsj / 5)) * 1.5 + 10;
HC.hcfy += fy;
}
else {
this.fy=10 + (this.tlsj/5)*1.5;
HC.hcfy+=this.fy;
}
}
}
然后创建火车类:
import java.util.ArrayList;
import java.util.List;
public class HC {
public static String CurrentTime="07:30"; //当前时间
static double hcfy=0;//费用
static int timeindex=0; //用来给current Time赋值的
public static List<CK> ck=new ArrayList<CK>(); //乘客
public static List<CK> hcck=new ArrayList<CK>(); //候车乘客
public static List<CK> xcck=new ArrayList<CK>(); //下车乘客
public static void Init(){
HC.CurrentTime="07:30";
HC.hcfy=0;
HC.timeindex=0;
ck.clear();
hcck.clear();
xcck.clear();
}
public static boolean pdsfncc(CK ck){ //判断是否能上车
int qi=-1,zi=-1;
int Flag=0;
for(int i=0;i<79;i++){
if(qi==-1&&LXTTable.lxt[i].zdqd.equals(ck.getQszd())) { //从时间表里面找起始站点,这里是起始站点相同的时候
qi = i;
for (int k = i; k < 79; k++){
if(zi==-1&&LXTTable.lxt[k].zdzd.equals(ck.getZzzd())){
zi=k;
if(ck.getHcsk().compareTo(LXTTable.lxt[qi].qssj)<=0&&(HC.CurrentTime.compareTo(LXTTable.lxt[qi].qssj)<=0)) //候车时刻要比起始时刻小的时候才取这个值
{
ck.setCfzdxb(qi);
ck.setMdzdxb(zi);
ck.jstlsj(); //计算好停留时间
ck.jsfy(); //计算费用
Flag=1;
break;
}
else
{
i=qi+1;
qi=-1;
zi=-1;
break;
}
}
}
if(Flag==1) return true;
}
}
return false;
}
public static void AddHCCK(CK x){
HC.hcck.add(x);
if((HC.CurrentTime.compareTo("07:30"))>=0&&(HC.CurrentTime.compareTo("21:30")<=0)) { //把候车乘客到时间的转换为上车乘客
for (int i = 0; i < HC.hcck.size(); i++) {
if (ck.size() < 20) {
CK temp = HC.hcck.get(i);
if (temp.getCfzdxb()==HC.timeindex) { //也就是站点刚好相等,起始时间和当前时间相等
ck.add(temp);
System.out.println(temp.getCkbh() + "上车");
System.out.println();
HC.hcck.remove(i);
}
} else {
System.out.println("火车已满!");
break;
}
}
}
for(int i=0;i<ck.size();i++){ //检测能下车的乘客
CK temp=(ck.get(i));
if(temp.getMdzdxb()==HC.timeindex){ //这里就在检测下车乘客,就是你每次添加候车乘客的
System.out.println(temp.getCkbh()+"下车");
HC.xcck.add(temp);
ck.set(i,null);
}
}
for(int i=0;i<ck.size();i++)//在乘客列表里面删除下车乘客
{
if(ck.get(i)==null){
ck.remove(i);
}
}
}
public static void CXZD(String name){ //查询账单
if(xcck.size()==0){
System.out.println(name+"没有账单");
}
for(int index=0;index<xcck.size();index++) {
CK ck1=xcck.get(index);
if(ck1.getCkbh().equals(name)){
System.out.println("系统当前时间:" +CurrentTime);
System.out.println("乘客编号:"+name);
System.out.println("上车站点:"+ck1.getQszd());
System.out.println("下车站点:"+ck1.getZzzd());
System.out.println("候车时刻:"+ck1.getHcsk());
System.out.println("上车时刻:"+LXTTable.lxt[ck1.getCfzdxb()].qssj);
System.out.println("下车时刻:"+LXTTable.lxt[ck1.getMdzdxb()].zzsj);
System.out.println("乘车里程:"+(ck1.getMdzdxb()-ck1.getCfzdxb()+1)*10);
System.out.println("停车等待时间:"+ck1.getTlsj());
System.out.println("金额(乘车发生的费用):"+ck1.getFy());
}
}
}
public static void HCZT(){
System.out.println("系统当前时间:" +CurrentTime);
System.out.println("当前位置:"+LXTTable.lxt[timeindex].zdqd+"--"+LXTTable.lxt[timeindex].zdzd);
if(timeindex==0)
System.out.println("当前状态:匀速行驶");
else
System.out.println("当前状态:"+(LXTTable.lxt[timeindex-1].tlsj==10?"停车等候":"匀速行驶"));
System.out.println("当前乘客人数:"+ck.size());
System.out.println("行驶总里程"+timeindex*10);
System.out.println("当前总收入(包括车上和下车乘客费用):"+hcfy);
}
public static void HCCX(){
System.out.println("系统当前时间:" +CurrentTime);
System.out.println("当前候乘人数:"+hcck.size());
if(hcck.size()!=0) {
System.out.print("候车乘客:");
for (CK ck : hcck) {
System.out.print(ck.getCkbh());
}
}
System.out.println();
}
}
最后创建主程序类:
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class mymain {
public static void main(String[] args) throws Exception{
HC.CurrentTime=LXTTable.lxt[HC.timeindex].qssj;
System.out.println("欢迎进入火车运营管理系统");
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));
System.out.println("乘客候车:HC ,如HC CK01 07:20 WA W4"+"\r\n"+"退出系统: exit");
System.out.println("初始化: Init");
System.out.println("查询账单: CXZD CK01");
System.out.println("查询火车状态: HCZT");
System.out.println("查询候车状态: HCCX");
while(true){ //这里开始运行了
System.out.println("----------------------------------------------------------");
System.out.println("当前时间为"+HC.CurrentTime); //每次输入前都要看到时间
if(HC.hcck.size()>0){ //有乘客就先输出
System.out.println("已候车乘客编号为:");
for(int i=0;i<HC.hcck.size();i++) { //这个就简单的输出
CK ckt1 = (HC.hcck.get(i));
System.out.println(ckt1.getCkbh() + "");
if (i == HC.hcck.size() - 1) System.out.println(); //到最后一个乘客的时候就打印空行了
}
}
if(HC.ck.size()>0){
System.out.println("已上车乘客编号为:"); //看看上车乘客的数量
for(int i=0;i<HC.ck.size();i++){ //简单的输出
CK ckt2=(HC.ck.get(i));
if(ckt2!=null)
System.out.println(ckt2.getCkbh()+"");
}
System.out.println(); //到最后一个乘客的时候就打印空行了
}
System.out.println("请输入命令:");
String sinstr=bufferedReader.readLine(); //输入命令
if(sinstr.equals("exit")){
System.out.println("您已退出本系统");
System.out.println();
break;
}
if(sinstr.startsWith("CXZD")){
if(sinstr.length()<9) {
System.out.println("输入错误了");
continue;
}
sinstr = sinstr.substring(5); //这里就是把sinstr字符串前面的HC去掉了
String[] CKHCStr = sinstr.split(" "); //分别把CK01,07:30,WA,W4分开到字符串数组里
HC.CXZD(CKHCStr[0]);
System.out.println();
continue;
}
if(sinstr.equals("Init")){
HC.Init();
System.out.println("初始化成功");
System.out.println();
continue;
}
if(sinstr.equals("HCZT")){
HC.HCZT();
System.out.println();
continue;
}
if(sinstr.equals("HCCX"))
{
HC.HCCX();
System.out.println();
continue;
}
if(sinstr.startsWith("HC")&&(!sinstr.equals("HCCX"))&&(!sinstr.equals("HCZT"))) {
sinstr = sinstr.substring(3); //这里就是把sinstr字符串前面的HC去掉了
String[] CKHCStr = sinstr.split(" "); //分别把CK01,07:30,WA,W4分开到字符串数组里
int Flag = 0;
for (int i = 0; i < HC.hcck.size(); i++) {
CK ckt1 = (HC.hcck.get(i));
if (CKHCStr[0].equals(ckt1.getCkbh())) { //看一看乘客名字是否有存在
Flag = 1;
break;
}
}
if (Flag == 1) {
System.out.println("编号为" + CKHCStr[0] + "的乘客已在候车!"); //如果存在,执行这里
continue; //直接进行下次输入
}
Flag = 0;
for (int i = 0; i < HC.ck.size(); i++){ //这里检查已经上车的乘客里面有没有
CK ckt2 =(HC.ck.get(i));
if (CKHCStr[0].equals(ckt2.getCkbh())) {
Flag = 1;
break;
}
}
if (Flag == 1) {
System.out.println("编号为" + CKHCStr[0] + "的乘客已在车上");//如果存在,执行这里
continue;
}
if(CKHCStr.length<4){
System.out.println("输入有错误");
continue;
}
CK ck = new CK();
ck.setCkbh(CKHCStr[0]);
ck.setHcsk(CKHCStr[1]);
ck.setQszd(CKHCStr[2]);
ck.setZzzd(CKHCStr[3]);
if (HC.pdsfncc(ck)) { //判断能上车, 还有怎么判断能下车?
System.out.println(ck.getCkbh() + "开始候车!");
HC.AddHCCK(ck);
System.out.println(ck);
} else {
System.out.println("该乘客不能候车");
}
System.out.println();
HC.timeindex++;
HC.CurrentTime=LXTTable.lxt[HC.timeindex].qssj; //这里就是在变化时间
continue;
}
sinstr=bufferedReader.readLine();
}
}
}
完成代码后,我们可以实现如下要求:
1、初始化命令 Init
设置系统初始时刻为 7:30;火车位置是 WA;乘客 0 人;收入 0 元;行驶里程 0 公 里;火车时速 60 公里/小时;火车停车等候 0 分钟
2、候车命令 HC
3、查询乘客账单命令 CXZD(只针对下了车的乘客)
4、火车状态命令 HCZT
5、候车查询命令 HCCX
这里要说的是时间只有在执行HC CK01 这样的命令时才会改变,其他命令是无法改变时间的。这是大学java课程的项目设计,做完了,特此记下