Java课程设计开发项目 火车运营管理系统

先看一下题目:
1、一列火车在 WA——WB之间行驶,两地相距 110公里,之间还有等距的 10 个站点,如下:
WA-W1-W2-W3-W4-W5-W6-W7-W8-W9-W10-WB 当火车到达 WB 时反向行驶(即返航) ,当到达 WA 后火车还会正向行驶;
2、火车匀速行驶 60 公里/小时;
3、系统在每 30 分钟在下面站点(一次循环示例)施行交通管制:
Java课程设计开发项目 火车运营管理系统_第1张图片

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 分钟
Java课程设计开发项目 火车运营管理系统_第2张图片
2、候车命令 HC
Java课程设计开发项目 火车运营管理系统_第3张图片
3、查询乘客账单命令 CXZD(只针对下了车的乘客)
Java课程设计开发项目 火车运营管理系统_第4张图片
4、火车状态命令 HCZT
Java课程设计开发项目 火车运营管理系统_第5张图片
5、候车查询命令 HCCX
Java课程设计开发项目 火车运营管理系统_第6张图片

这里要说的是时间只有在执行HC CK01 这样的命令时才会改变,其他命令是无法改变时间的。这是大学java课程的项目设计,做完了,特此记下

你可能感兴趣的:(Java基础)