更改了1个方法里的问题,现在乘客p2-4已经乘坐电梯并到了目的地,但p3-1还没上来,我再改public void letIn() { //乘客进电梯 for(int i=0;i<MAXPERSON-1;++i) { if (passWait[curFloor-1][i]!=null){ //所在楼层有乘客在等待时 if (passWait[curFloor-1][i].directP==directE) { //而且该乘客期望的运行方向与电梯此时的运行方向一致 System.out.println(passWait[curFloor-1][i].name+" has come into the elevator,is going to floor "+passWait[curFloor-1][i].toFloor);
好了,把move()方法改为: public void move() { //调度电梯运行 boolean moveFlag=false; if (curFloor==MAXFLOOR) { directE=DOWN; //到顶楼时电梯转向 } if (curFloor==1) { directE=UP; //到底楼时电梯转向 } if (directE==UP) curFloor++; else curFloor--;
}
现贴上全部改后代码,其中 main()方法中加入了调试信息,可以看到调度过程 (当然我的代码里的move()方法虽然保证了功能,但不够完美,希望其他人继续优化)//模拟电梯运行过程 乘客p3-1:表示此人从3楼到1楼 public class Elevator { final int MAXPERSON=10; //每层最大乘客数(同时也设定为电梯内所能容纳的最大人数) final int MAXFLOOR=5; //最大层数 final static int UP=1; //上行 final static int DOWN=0; //下行
int numInLift=0; //电梯当前所载人数 static int directE=UP; //电梯当前运行方向 static int curFloor=1; //电梯当前所在楼层 static int sumPerson=0; //电梯系统目前总人数(乘客 到达目的楼层后视为离开系统)
public void letOut() { //乘客出电梯 for(int i=0;i<MAXPERSON;i++) { if(passInLift[i]!=null){ //如果电梯有人 if(passInLift[i].toFloor==curFloor) { //而且该乘客的目标楼层恰为电梯目前所在楼层 numInLift--; //出电梯 System.out.println(passInLift[i].name+" has left the elevator,come to floor "+curFloor);
public void letIn() { //乘客进电梯 for(int i=0;i<MAXPERSON-1;++i) { if (passWait[curFloor-1][i]!=null){ //所在楼层有乘客在等待时 if (passWait[curFloor-1][i].directP==directE) { //而且该乘客期望的运行方向与电梯此时的运行方向一致 System.out.println(passWait[curFloor-1][i].name+" has come into the elevator,is going to floor "+passWait[curFloor-1][i].toFloor);
while(myElevator.sumPerson!=0 ) { //当系统人数不为0时 try{Thread.sleep(1000);} //调试代码,可去掉 catch(Exception e) {} //调试代码,可去掉 System.out.println("Current floor :"+ curFloor); //调试代码,可去掉 System.out.println("Current person:"+ sumPerson); //调试代码,可去掉 myElevator.letOut(); myElevator.letIn(); //先进后出 myElevator.move(); //然后移动 } } } class Passenger { final static int UP=1; //乘客上楼 final static int DOWN=0; //乘客下楼 int directP=UP; //乘客上下状态 int fromFloor=0; //乘客的原楼层 int toFloor=0; //乘客的目的楼层 String name=new String(); //乘客标识 public Passenger(int from,int to,int direct,String name){ fromFloor=from; toFloor=to; directP=direct; this.name=name; }
public void addWaitTeam(Passenger obj) { //乘客加入相应楼层的等待队列 Elevator.passWait[obj.fromFloor-1][Elevator.numInWait[obj.fromFloor-1]]=obj; System.out.println(obj.name+" is waiting at floor "+obj.fromFloor); Elevator.numInWait[obj.fromFloor-1]++; Elevator.sumPerson++; //系统总人数加1 } }
对不起,还有1处错误要改,在letOut()和letIn()方法中要把 else break; 改为 else continue;否则同层楼上有2个以上人上电梯,但在不同楼层下电梯时就会出问题 现在程序如下,并且又加入了一位从2楼要上5楼的乘客//模拟电梯运行过程 乘客p3-1:表示此人从3楼到1楼 public class Elevator { final int MAXPERSON=10; //每层最大乘客数(同时也设定为电梯内所能容纳的最大人数) final int MAXFLOOR=5; //最大层数 final static int UP=1; //上行 final static int DOWN=0; //下行
int numInLift=0; //电梯当前所载人数 static int directE=UP; //电梯当前运行方向 static int curFloor=1; //电梯当前所在楼层 static int sumPerson=0; //电梯系统目前总人数(乘客 到达目的楼层后视为离开系统)
public void letOut() { //乘客出电梯 for(int i=0;i<MAXPERSON;i++) { if(passInLift[i]!=null){ //如果电梯有人 if(passInLift[i].toFloor==curFloor) { //而且该乘客的目标楼层恰为电梯目前所在楼层 numInLift--; //出电梯 System.out.println(passInLift[i].name+" has left the elevator,come to floor "+curFloor);
public void letIn() { //乘客进电梯 for(int i=0;i<MAXPERSON-1;++i) { if (passWait[curFloor-1][i]!=null){ //所在楼层有乘客在等待时 if (passWait[curFloor-1][i].directP==directE) { //而且该乘客期望的运行方向与电梯此时的运行方向一致 System.out.println(passWait[curFloor-1][i].name+" has come into the elevator,is going to floor "+passWait[curFloor-1][i].toFloor);
只是不能得到正常结果呀
for(int i=0;i<MAXPERSON-1;++i) {
if (passWait[curFloor-1][i]!=null){ //所在楼层有乘客在等待时
if (passWait[curFloor-1][i].directP==directE) { //而且该乘客期望的运行方向与电梯此时的运行方向一致
System.out.println(passWait[curFloor-1][i].name+" has come into the elevator,is going to floor "+passWait[curFloor-1][i].toFloor);
numInWait[curFloor-1]--; //该乘客出等待队列
numInLift++; //电梯内人数加1
passInLift[numInLift-1]=passWait[curFloor-1][i]; //该乘客进电梯内乘客队列
passWait[curFloor-1][i]=null; }
}
else break;
}
}
boolean moveFlag=false;
if (curFloor==MAXFLOOR) {
directE=DOWN; //到顶楼时电梯转向
}
if (curFloor==1) {
directE=UP; //到底楼时电梯转向
}
if (directE==UP)
curFloor++;
else
curFloor--;
}
(当然我的代码里的move()方法虽然保证了功能,但不够完美,希望其他人继续优化)//模拟电梯运行过程 乘客p3-1:表示此人从3楼到1楼
public class Elevator {
final int MAXPERSON=10; //每层最大乘客数(同时也设定为电梯内所能容纳的最大人数)
final int MAXFLOOR=5; //最大层数
final static int UP=1; //上行
final static int DOWN=0; //下行
int numInLift=0; //电梯当前所载人数
static int directE=UP; //电梯当前运行方向
static int curFloor=1; //电梯当前所在楼层
static int sumPerson=0; //电梯系统目前总人数(乘客 到达目的楼层后视为离开系统)
static int[] numInWait; //整型数组:对应元素存放对应楼层的等待人数
static Passenger[] passInLift; //对象数组:存放电梯当前容纳的乘客对象
static Passenger[][] passWait; //二维对象数组:一维下标指明楼层数,二维存放相应楼层等待的乘客对象
public Elevator(){ //构造函数
curFloor=1;
numInLift=0;
directE=UP;
numInWait=new int[MAXFLOOR];
passInLift=new Passenger[MAXPERSON];
passWait=new Passenger[MAXFLOOR][MAXPERSON];
}
public void letOut() { //乘客出电梯
for(int i=0;i<MAXPERSON;i++) {
if(passInLift[i]!=null){ //如果电梯有人
if(passInLift[i].toFloor==curFloor) { //而且该乘客的目标楼层恰为电梯目前所在楼层
numInLift--; //出电梯
System.out.println(passInLift[i].name+" has left the elevator,come to floor "+curFloor);
passInLift[i]=null;
sumPerson--; //出电梯系统
}
}
else break;
}
}
public void letIn() { //乘客进电梯
for(int i=0;i<MAXPERSON-1;++i) {
if (passWait[curFloor-1][i]!=null){ //所在楼层有乘客在等待时
if (passWait[curFloor-1][i].directP==directE) { //而且该乘客期望的运行方向与电梯此时的运行方向一致
System.out.println(passWait[curFloor-1][i].name+" has come into the elevator,is going to floor "+passWait[curFloor-1][i].toFloor);
numInWait[curFloor-1]--; //该乘客出等待队列
numInLift++; //电梯内人数加1
passInLift[numInLift-1]=passWait[curFloor-1][i]; //该乘客进电梯内乘客队列
passWait[curFloor-1][i]=null; }
}
else break;
}
}
public void move() { //调度电梯运行
boolean moveFlag=false;
if (curFloor==MAXFLOOR) {
directE=DOWN; //到顶楼时电梯转向
}
if (curFloor==1) {
directE=UP; //到底楼时电梯转向
}
if (directE==UP)
curFloor++;
else
curFloor--;
}
public static void main(String args[]) {
Elevator myElevator=new Elevator(); //生成电梯实例
Passenger p2_4=new Passenger(2,4,UP,"p2_4");
Passenger p3_1=new Passenger(3,1,DOWN,"p3_1"); //生成乘客实例
p2_4.addWaitTeam(p2_4);
p3_1.addWaitTeam(p3_1); //将乘客实例加入等待队列
while(myElevator.sumPerson!=0 ) { //当系统人数不为0时
try{Thread.sleep(1000);} //调试代码,可去掉
catch(Exception e) {} //调试代码,可去掉
System.out.println("Current floor :"+ curFloor); //调试代码,可去掉
System.out.println("Current person:"+ sumPerson); //调试代码,可去掉
myElevator.letOut(); myElevator.letIn(); //先进后出
myElevator.move();
//然后移动
}
}
}
class Passenger {
final static int UP=1; //乘客上楼
final static int DOWN=0; //乘客下楼 int directP=UP; //乘客上下状态
int fromFloor=0; //乘客的原楼层
int toFloor=0; //乘客的目的楼层
String name=new String(); //乘客标识
public Passenger(int from,int to,int direct,String name){
fromFloor=from;
toFloor=to;
directP=direct;
this.name=name;
}
public void addWaitTeam(Passenger obj) { //乘客加入相应楼层的等待队列
Elevator.passWait[obj.fromFloor-1][Elevator.numInWait[obj.fromFloor-1]]=obj;
System.out.println(obj.name+" is waiting at floor "+obj.fromFloor); Elevator.numInWait[obj.fromFloor-1]++;
Elevator.sumPerson++; //系统总人数加1
}
}
改为 else continue;否则同层楼上有2个以上人上电梯,但在不同楼层下电梯时就会出问题
现在程序如下,并且又加入了一位从2楼要上5楼的乘客//模拟电梯运行过程 乘客p3-1:表示此人从3楼到1楼
public class Elevator {
final int MAXPERSON=10; //每层最大乘客数(同时也设定为电梯内所能容纳的最大人数)
final int MAXFLOOR=5; //最大层数
final static int UP=1; //上行
final static int DOWN=0; //下行
int numInLift=0; //电梯当前所载人数
static int directE=UP; //电梯当前运行方向
static int curFloor=1; //电梯当前所在楼层
static int sumPerson=0; //电梯系统目前总人数(乘客 到达目的楼层后视为离开系统)
static int[] numInWait; //整型数组:对应元素存放对应楼层的等待人数
static Passenger[] passInLift; //对象数组:存放电梯当前容纳的乘客对象
static Passenger[][] passWait; //二维对象数组:一维下标指明楼层数,二维存放相应楼层等待的乘客对象
public Elevator(){ //构造函数
curFloor=1;
numInLift=0;
directE=UP;
numInWait=new int[MAXFLOOR];
passInLift=new Passenger[MAXPERSON];
passWait=new Passenger[MAXFLOOR][MAXPERSON];
}
public void letOut() { //乘客出电梯
for(int i=0;i<MAXPERSON;i++) {
if(passInLift[i]!=null){ //如果电梯有人
if(passInLift[i].toFloor==curFloor) { //而且该乘客的目标楼层恰为电梯目前所在楼层
numInLift--; //出电梯
System.out.println(passInLift[i].name+" has left the elevator,come to floor "+curFloor);
passInLift[i]=null;
sumPerson--; //出电梯系统
}
}
else continue;//changed
}
}
public void letIn() { //乘客进电梯
for(int i=0;i<MAXPERSON-1;++i) {
if (passWait[curFloor-1][i]!=null){ //所在楼层有乘客在等待时
if (passWait[curFloor-1][i].directP==directE) { //而且该乘客期望的运行方向与电梯此时的运行方向一致
System.out.println(passWait[curFloor-1][i].name+" has come into the elevator,is going to floor "+passWait[curFloor-1][i].toFloor);
numInWait[curFloor-1]--; //该乘客出等待队列
numInLift++; //电梯内人数加1
passInLift[numInLift-1]=passWait[curFloor-1][i]; //该乘客进电梯内乘客队列
passWait[curFloor-1][i]=null; }
}
else continue;//changed
}
}
public void move() { //调度电梯运行
boolean moveFlag=false;
if (curFloor==MAXFLOOR) {
directE=DOWN; //到顶楼时电梯转向
}
if (curFloor==1) {
directE=UP; //到底楼时电梯转向
}
if (directE==UP)
curFloor++;
else
curFloor--;
}
public static void main(String args[]) {
Elevator myElevator=new Elevator(); //生成电梯实例
Passenger p3_1=new Passenger(3,1,DOWN,"p3_1"); //生成乘客实例
Passenger p2_4=new Passenger(2,4,UP,"p2_4");
Passenger p2_5=new Passenger(2,5,UP,"p2_5");
p2_4.addWaitTeam(p2_4);
p3_1.addWaitTeam(p3_1); //将乘客实例加入等待队列
p2_5.addWaitTeam(p2_5);
while(myElevator.sumPerson!=0 ) { //当系统人数不为0时
try{Thread.sleep(1000);} //调试代码,可去掉
catch(Exception e) {} //调试代码,可去掉
System.out.println("Current floor :"+ curFloor); //调试代码,可去掉
System.out.println("Current person:"+ sumPerson); //调试代码,可去掉
myElevator.letOut(); myElevator.letIn(); //先出后进
myElevator.move();
//然后移动
}
}
}
class Passenger {
final static int UP=1; //乘客上楼
final static int DOWN=0; //乘客下楼 int directP=UP; //乘客上下状态
int fromFloor=0; //乘客的原楼层
int toFloor=0; //乘客的目的楼层
String name=new String(); //乘客标识
public Passenger(int from,int to,int direct,String name){
fromFloor=from;
toFloor=to;
directP=direct;
this.name=name;
}
public void addWaitTeam(Passenger obj) { //乘客加入相应楼层的等待队列
Elevator.passWait[obj.fromFloor-1][Elevator.numInWait[obj.fromFloor-1]]=obj;
System.out.println(obj.name+" is waiting at floor "+obj.fromFloor); Elevator.numInWait[obj.fromFloor-1]++;
Elevator.sumPerson++; //系统总人数加1
}
}
kinzey34朋友:我不认识你,但我谢谢你!
-------------------------------
我qq:87708747初学java ,还望今后不吝赐教阿!!