面向对象程序设计上机实验

面向对象程序设计上机实验
面向对象程序设计上机实验

面向对象程序设计上机报告

----设计说明书班级: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){};

}

}

}

相关主题
相关文档
最新文档