面向对象程序设计上机实验
面向对象程序设计上机报告
----设计说明书班级:030113 学号:03011248 姓名:杨永升完成时间: 4.17
问题的简单描述:
该程序主要是仿真高速公路的客运情况,该高速公路被简化为由宝鸡和西安两个路线端点站,5个中途停靠站以及里程组成。
从上午7:30开始到下午5:59为止,每分钟分别在XN和BJ随机产生去往BJ和XN方向的新到达的乘客,每分钟到达的人数范围为0~5,并随机产生新到达的乘客的目的地。乘客到达端点站以后,先插入到候车人群的队列中,在某辆车即将驶出该站时,乘客依次上车(这样实现起来比原来的描述要简单的多,可达到的目的却是相同的);通过判断在某站是否有乘客下车,来判断是否将车停在该站,如果停车的话,停车两分钟;否则,该车不在该站停车。
端点站的客车分为两种:沃尔沃和依维柯,沃尔沃每个小时发出一辆,依维柯每20分钟发出一辆,直至没有车可以发行;到达终点站的车插入到同类车的后面,按调度来确定发车的时间,在中途站只有人上车,而没有人上车。
对所给的问题建立对应的模型:
对应的类:
防真流程:
对一些仿真过程的模拟实现:
乘客到达端点站的时候,先将他们安排在等待人群中(相当于火车站或汽车站的候车室),等待的人群是一个队列(满足先来先上车的原则);在端点站中,每分钟减少两种车型的第一辆车的等待时间,如果某一辆车到了发车的时间(即等待的时间为零),就让等待人群的乘客依次上该车,并将该车的状态设置为开车的状态;高速公路上的车,先判断它该时刻的状态,如果是运行状态的话,就将它的行驶时间加一,并判断它下一个时刻是不是到达某站,如果到达的话,看是不是有人在该站下车或者是该站是终点站,就将该车的下个时刻的状态设置为停留的状态,并设置停留的时间;如果该车是在停留状态的话,就让达到目的地的乘客下车,并判断该站是不是终点站,如果是终点站的话,就将该车从高速公路的车队中删除,插入到终点站的对应车型的队列中,并改变对应的信息,如果是不是终点站的话,就将等待的时间减一分钟,并判断是不是到了开车的时间(等待的时间为零),如果到了开车的时间的话,就将该车的状态设置为运行的状态;然后,判断是不是高速公路的两端是不是有车上高速,如果有的话,就将该车放在高速公路对应方向上的车的对列中;整个高速公路的系统,首先初始化对应的两个终点站(设置车的类型和对应车的数量),每分钟对高速公路系统的每一个部分(两个终点站和一个高速公路)进行一次刷新,并输出对应的信息.
------源程序清单
Sation.java文件
import https://www.360docs.net/doc/c7906505.html,ng.Math;
public class Station
{
public static final String fastwaystation[]={"宝鸡","虢镇","菜家坡","武功","兴平","咸阳","西安"}; //属性
private String stationname; //标识站的名称
//方法
public Station(String location){stationname=location;}//构造函数
public Station(){}{stationname=fastwaystation[(int)(7*Math.random())];}//随机产生名称
public void setname(String location){stationname=location;} //为某个站标识
public String getname(){ return stationname;} //取得站的名称
}
Passenger.java文件
public class Passenger
{
//属性
private Station aimland; //标识乘客的目的地
//方法
public Passenger(Station astation){aimland=astation;}//构造函数
public Passenger(){this(new Station());} //随机产生目的地
public Station getaimland(){ //取得目的地
return aimland;
}
public void setaimland(Station astation){//设置目的地
aimland=astation;
}
}
Bus.java文件
import java.util.Vector;
public abstract class Bus
{
public static final int stop=0;
public static final int run=1;
//属性
private Vector passengers;//乘客的队列
private String busnum;//车的编号
private int flag;//标识客车的状态
private int runtime;//标识在一次客运中运行的时间
protected String busmark; //车型
protected int lefttime; //离发车还剩余的时间
//方法
public Bus(String num){ //构造函数
passengers=new Vector();
busnum=num;
flag=stop;
runtime=0;
}
public Bus(){ //构造函数
this("");
}
public int getpassengernum(){ //取得乘客的数目
return passengers.size();
}
public void getonpassenger(Passenger person){//上一个乘客
passengers.addElement((Object)person);
}
public void getoffpassenger(Passenger person){//下一个乘客
passengers.removeElement((Object)person);
}
public String getbusnum(){ //取得车的编号
return busnum;
}
public void setbusnum(String num){ //设置车的编号
busnum=num;}
public void setflag(int condition){//设置车的状态
flag=condition;
}
public int getflag(){ //取得车的状态
return flag;
}
public void setruntime(int time){//设置车的行驶时间
runtime=time;
}
public void incruntime(){ //增加车的行驶时间
runtime+=1;
}
public int getruntime(){//取得车的行驶时间
return runtime;
}
public boolean stopat(Station astation){//判断在某个站是否有乘客下车
for(int i=0;i if(((Passenger)passengers.elementAt(i)).getaimland().getname()==astation.getname()) return true; } return false; public String getbusmark(){ //取得车型 return busmark; } public void setlefttime(int time){//设置剩余时间 lefttime=time; } public int getlefttime(){//取得剩余时间 return lefttime; } public void declefttime(){//减少剩余时间 lefttime-=1; } public abstract void setlefttime(); //无参设置 public abstract int maxpassengersnum(); //取得最大的乘客量 public abstract double getbusrate(); //取得车速 public void getoffat(Station astation){//到达目的地的乘客下车 for(int i=0;i if(((Passenger)passengers.elementAt(i)).getaimland().getname()==astation.getname()) passengers.removeElementAt(i); } } } Wowbus.java文件 public class Wowbus extends Bus { public static final int maxpassengernum=40;//最大的乘客量 public static final double busrate=2; //车的行驶速度 public static final int buswaitingtime=60; //车的候车时间 //方法 public Wowbus(String num){ //构造函数 super(num); busmark="沃尔沃"; lefttime=Wowbus.buswaitingtime; } public void setlefttime(){//无参设置 lefttime=Wowbus.buswaitingtime; } public int maxpassengersnum(){//取得最大的乘客量 return Wowbus.maxpassengernum; } public double getbusrate(){//取得车的速度 return Wowbus.busrate; } Yvkbus.java文件 public class Yvkbus extends Bus { public static final int maxpassengernum=21; //最大的乘客量public static final double busrate=1.4; //车的行驶速度public static final int buswaitingtime=20;//车的候车时间 //方法 public Yvkbus(String num){ //构造函数 super(num); busmark="依维柯"; lefttime=Yvkbus.buswaitingtime; } public void setlefttime(){//无参设置 lefttime=Yvkbus.buswaitingtime; } public int maxpassengersnum(){//取得最大的乘客量 return Yvkbus.maxpassengernum; } public double getbusrate(){//取得车的速度 return Yvkbus.busrate; } } Endstation.java文件 import https://www.360docs.net/doc/c7906505.html,ng.Math; import java.util.Vector; import java.io.*; public class Endstation{ //属性 private Station endstationname;//端点站名字 private Vector passengerlist;//等待乘客队列 private Vector wowbuslist;//沃尔沃客车队列 private Vector yvkbuslist;//依维柯客车队列 //方法 public Endstation(Station stationname){//构造函数endstationname=stationname; passengerlist=new Vector(); wowbuslist=new Vector(); yvkbuslist=new Vector(); } public void incpassenger(Passenger person){//增加了一个乘客passengerlist.addElement((Object)person); } public Passenger getfirstpassenger(){//取得第一个乘客 return (Passenger)passengerlist.elementAt(0); } public void removepassenger(){//去掉一个乘客 passengerlist.removeElementAt(0); } public int getwaitingpassengernum(){//取得等候乘客的数目 return passengerlist.size(); } public void insertwowbuslist(Wowbus abus){//加入一辆沃尔沃车wowbuslist.addElement((Object)abus); } public void insertyvkbuslist(Yvkbus abus){//加入一辆依维柯车yvkbuslist.addElement((Object)abus); } public void removeawowbus(){ //去掉一辆沃尔沃车 wowbuslist.removeElementAt(0); } public Wowbus getwowbusat(int busloc){ //取得车队的沃尔沃车 return (Wowbus)wowbuslist.elementAt(busloc); } public Yvkbus getyvkbusat(int busloc){ //取得车队的依维柯车 return (Yvkbus)yvkbuslist.elementAt(busloc); } public void removeayvkbus(){ //去掉一辆依维柯车 yvkbuslist.removeElementAt(0); } public int getwowbusnum(){//取得沃尔沃车的数目 return wowbuslist.size(); } public int getyvkbusnum(){//取得依维柯车的数目 return yvkbuslist.size(); } public Station getendstationname(){//取得端点站的名字 return endstationname; } public void initendstation(int wowbusnum,int yvkbusnum){//初始化端点站String name=endstationname.getname(); for(int i=0;i Wowbus abus=new Wowbus(name+i); insertwowbuslist(abus); } for(int i=0;i Yvkbus abus=new Yvkbus(name+i); insertyvkbuslist(abus); } public void endstationrefresh(){//对端点站进行刷新 //随机产生到达该站的乘客的数量(范围在0和5之间) //将这些乘客加入到等待的乘客的队列中 System.out.println(endstationname.getname()+"站当前的情况:"); int passengernum=(int)(6*Math.random()); for(int i=0;i Passenger newpassenger= new Passenger(new Station()); if(newpassenger.getaimland().getname()!=getendstationname().getname()) incpassenger(newpassenger); } //刷新两个车队的第一辆车,根据不同的情况设置车的状态,并输出他们的状态 if((getwowbusnum()!=0)||(getyvkbusnum()!=0)){ Bus abus; if(getwowbusnum()!=0){ Wowbus awowbus=getwowbusat(0); abus=(Bus)awowbus; } else{ Yvkbus ayvkbus=getyvkbusat(0); abus=(Bus)ayvkbus; } int i=2; while(i!=0){ abus.declefttime(); if(abus.getlefttime()==0){ //如果该车要驶出该站,则该车一定是最近的始发客车,乘客上车 int getonnum=0; while((getonnum removepassenger(); getonnum++; } abus.setflag(Bus.run); System.out.println(abus.getbusmark()+" "+abus.getbusnum()+" "+"将要驶出该站"); } else System.out.println(abus.getbusmark()+" "+abus.getbusnum()+" "+"处在等待状态"); i--; if(getyvkbusnum()!=0){ Yvkbus ayvkbus=getyvkbusat(0); abus=(Bus)ayvkbus; } else i--; //输出两个车队的车的型号,编号以及状态 for( i=1;i abus=(Bus)getwowbusat(i); System.out.println(abus.getbusmark()+" "+abus.getbusnum()+" "+"处在等待状态"); } for( i=1;i abus=(Bus)getyvkbusat(i); System.out.println(abus.getbusmark()+" "+abus.getbusnum()+" "+"处在等待状态"); } } else System.out.println("该站没有任何车辆!"); System.out.println("等车乘客人数:"+getwaitingpassengernum()); } } fastway.java文件 import java.util.Vector; import https://www.360docs.net/doc/c7906505.html,ng.Math; import java.io.*; public class Fastway{ public static final int stationnum=6; public static final int wedistance[]={24,45,107,128,152,174};//各个中途站到起始站的距离public static final int ewdistance[]={22,46,67,129,150,174};//各个中途站到起始站的距离public static final String wename[]={"宝鸡","虢镇","菜家坡","武功","兴平","咸阳","西安"}; public static final String ewname[]={"西安","咸阳","兴平","武功","菜家坡","虢镇","宝鸡"}; //属性 private Vector webuslist;//由西开往东的车队 private Vector ewbuslist;//由东开往西的车队 //方法 public Fastway(){ webuslist=new Vector(); ewbuslist=new Vector(); } //从西到东的方向 public void getwebusfrom(Endstation station){ //从某站得到一辆车 Bus abus; if(station.getwowbusnum()!=0){ abus=(Bus)station.getwowbusat(0); if(abus.getflag()==Bus.run){ station.removeawowbus(); webuslist.addElement((Object)abus); } } if(station.getyvkbusnum()!=0){ abus=(Bus)station.getyvkbusat(0); if(abus.getflag()==Bus.run){ station.removeayvkbus(); webuslist.addElement((Object)abus); } } } public Bus getwebusat(int index){//取得一辆车 return (Bus)webuslist.elementAt(index); } public void removewebusto(Endstation station,int index){//将第index位置的车放入某Bus abus=(Bus)webuslist.elementAt(index); webuslist.removeElementAt(index); if(abus instanceof Wowbus){ station.insertwowbuslist((Wowbus)abus); } else station.insertyvkbuslist((Yvkbus)abus); } private int weflag(double distance){//取得距离所在的区间 for(int i=0;i if(distance } return stationnum; } private boolean weonstation(Bus abus){//判断下一个时刻是否到站 double curdistance=abus.getbusrate()*abus.getruntime(); double nexdistance=curdistance+abus.getbusrate(); int flag1=weflag(curdistance),flag2=weflag(nexdistance); if(flag1!=flag2) return true; return false; } //从东到西的方向 public void getewbusfrom(Endstation station){ //从某站得到一辆车 Bus abus; if(station.getwowbusnum()!=0){ abus=(Bus)station.getwowbusat(0); if(abus.getflag()==Bus.run){ station.removeawowbus(); ewbuslist.addElement((Object)abus); } } if(station.getyvkbusnum()!=0){ abus=(Bus)station.getyvkbusat(0); if(abus.getflag()==Bus.run){ station.removeayvkbus(); ewbuslist.addElement((Object)abus); } } } public Bus getewbusat(int index){//取得一辆车 return (Bus)ewbuslist.elementAt(index); } public void removeewbusto(Endstation station,int index){//将第index位置的车放入某站Bus abus=(Bus)ewbuslist.elementAt(index); ewbuslist.removeElementAt(index); if(abus instanceof Wowbus){ station.insertwowbuslist((Wowbus)abus); } else station.insertyvkbuslist((Yvkbus)abus); } private int ewflag(double distance){//取得距离所在的区间 for(int i=0;i if(distance } return stationnum; } private boolean ewonstation(Bus abus){//判断下一个时刻是否到站 double curdistance=abus.getbusrate()*abus.getruntime(); double nexdistance=curdistance+abus.getbusrate(); int flag1=ewflag(curdistance),flag2=ewflag(nexdistance); if(flag1!=flag2) return true; return false; } public void fastwayrefresh(Endstation wstation,Endstation estation){ System.out.println("高速公路上行车的情况:"); if((webuslist.size()==0)&&(ewbuslist.size()==0)) System.out.println("高速公路上没有车辆!"); for(int i=0;i Bus abus=getwebusat(i); System.out.print(abus.getbusmark()+" "+abus.getbusnum()+" "); if(abus.getflag()==Bus.run){ abus.incruntime(); double distance=abus.getbusrate()*abus.getruntime(),leftdistance; int index=weflag(distance); if(index==0){ leftdistance=distance; } else{ leftdistance=distance-wedistance[index-1]; } System.out.println(wename[index]+"以东"+leftdistance+"公里"+" 乘客人数:"+abus.getpassengernum()); if(weonstation(abus)&&(abus.stopat(new Station(wename[index+1]))||index+1==stationnum)){ abus.setflag(Bus.stop); abus.setlefttime(2); } } else{ double distance=abus.getbusrate()*abus.getruntime(); int index=weflag(distance)+1; System.out.println("正在"+wename[index]+"站停车下人"); abus.getoffat(new Station(wename[index])); if(index==stationnum){ removewebusto(estation,i); abus.setlefttime(); abus.setruntime(0); } else{ abus.declefttime(); if(abus.getlefttime()==0){ abus.setflag(Bus.run); } } } } for(int i=0;i Bus abus=getewbusat(i); System.out.print(abus.getbusmark()+" "+abus.getbusnum()+" "); if(abus.getflag()==Bus.run){ abus.incruntime(); double distance=abus.getbusrate()*abus.getruntime(),leftdistance; int index=ewflag(distance); if(index==0){ leftdistance=distance; } else{ leftdistance=distance-ewdistance[index-1]; } System.out.println(ewname[index]+"以西"+leftdistance+"公里"+" 乘客人数:"+abus.getpassengernum()); if(ewonstation(abus)&&(abus.stopat(new Station(ewname[index+1]))||index+1==stationnum)){ abus.setflag(Bus.stop); abus.setlefttime(2); } } else{ double distance=abus.getbusrate()*abus.getruntime(); int index=ewflag(distance)+1; System.out.println("正在"+ewname[index]+"站停车下人"); abus.getoffat(new Station(ewname[index])); if(index==stationnum){ removeewbusto(wstation,i); abus.setlefttime(); abus.setruntime(0); } else{ abus.declefttime(); if(abus.getlefttime()==0){ abus.setflag(Bus.run); } } } } getwebusfrom(wstation); getewbusfrom(estation); } } Fastwaymode.java import java.*; public class Fastwaymode{ private Endstation wendstation; private Endstation eendstation; private Fastway fastway; public Fastwaymode(){ wendstation=new Endstation(new Station("宝鸡")); eendstation=new Endstation(new Station("西安")); fastway=new Fastway(); } public void initmode(){ wendstation.initendstation(4,14); eendstation.initendstation(5,12); wendstation.endstationrefresh(); eendstation.endstationrefresh(); fastway.fastwayrefresh(wendstation,eendstation); } public void run(){ wendstation.endstationrefresh(); eendstation.endstationrefresh(); fastway.fastwayrefresh(wendstation,eendstation); } public static void main(String[] args){ Fastwaymode fastwaymode=new Fastwaymode(); fastwaymode.initmode(); for(int i=0;i<600;++i){ System.out.println("************************************************"); fastwaymode.run(); try{ Thread.sleep(1000); }catch(InterruptedException x){}; } } }