2011 Fuel Tank

<< 2011 AttractiveCritter | APQuestionsTrailIndex | 2011 RouteCipher >>

Question 3 from 2011 asks you to write two methods of the FuelDepot class, nextTankToFill and moveToLocation.

Click here to see the questions from 2011

FuelTank.java

public interface FuelTank 
{
	/** @return an integer value that ranges from 0 (empty) to 100 (full) */
	int getFuelLevel();
}

GasTank implements FuelTank

/**
 * A Helper class to get a working version 
 * @author Chris Thiel, OFMCap
 */
public class GasTank implements FuelTank
{
	private int level;
	public GasTank(int level){
		this.level=level;
	}
	public int getFuelLevel() {		
		return level;
	}
	public void addFuel(int amount){
		level+=amount;
		if (level>100)
			level=100;
	}
	public boolean dispenseFuel(int amount){
		level-=amount;
		if (level>=0)
			return true;
		level=0;
		return false;
	}

}

FuelRobot.java


public interface FuelRobot
{
/** @return the index of the current location of the robot */ 
	int getCurrentIndex();

/** Determine whether the robot is currently facing to the right
 *  @return true if the robot is facing to the right (toward tanks with larger indexes)
 *  false if the robot is facing to the left (toward tanks with smaller indexes) 
*/

boolean isFacingRight();

/** Changes the current direction of the robot */ 
void changeDirection();

/** Moves the robot in its current direction by the number of locations specified. 
 *  @param numLocs the number of locations to move. A value of 1 moves 
 *  the robot to the next location in the current direction. 
 *  Precondition: numLocs > 0
 */
void moveForward(int numLocs);
}

GasRobot implements FuelRobot

import java.util.List;
/**
 * A class to get a working version
 * @author Chris Thiel, OFMCap
 *
 */

public class GasRobot implements FuelRobot
{
	public static final int RIGHT=0;
	public static final int LEFT=1;
	private int robotLocation;
	private int direction;
	private List<FuelTank> tanks;
	public GasRobot(List<FuelTank> tanks){
		this.tanks=tanks;
		direction=RIGHT;
		robotLocation=0;
	}


	@Override
	public int getCurrentIndex() {		
		return robotLocation;
	}

	@Override
	public boolean isFacingRight() {
		return direction==RIGHT;
	}

	@Override
	public void changeDirection() {
		direction=(direction+1)%2;
	}

	@Override
	public void moveForward(int numLocs) {
		if (direction==RIGHT)
			robotLocation+=numLocs;
		else 
			robotLocation-=numLocs;
	}

}

FuelDepot

This is where you add your code for the methods you are asked to complete in parts (a) and (b)

import java.util.ArrayList;
import java.util.List;

public class FuelDepot
{
/** The robot used to move the filling mechanism */ 
private FuelRobot filler;

/** The list of fuel tanks */
private List<FuelTank> tanks;

/** Determines and returns the index of the next tank to be filled.
 *  @param threshold fuel tanks with a fuel level <= threshold may be filled
 *  @return index of the location of the next tank to be filled
 *  Postcondition: the state of the robot has not changed */
public int nextTankToFill(int threshold)
{ /* to be implemented in part (a) */ 

}

/** Moves the robot to location locIndex.
 *  @param locIndex the index of the location of the tank to move to 
 *  Precondition: 0 <=locIndex < tanks.size()
 * Postcondition: the current location of the robot is locIndex
 */
public void moveToLocation(int locIndex)
{ /* to be implemented in part (b) */ 

}
// There may be instance variables, constructors, and methods that are not shown.
// In fact...here are some that Fr Chris wrote to make this thing work:


public FuelDepot(int direction, int loc, int[] tankLevels){

	tanks=new ArrayList<FuelTank>();     //ArrayList implements List
	for (int level:tankLevels)
		tanks.add(new GasTank(level));    // GasTank implements FuelTank	
	filler = new GasRobot(tanks);        //GasRobot implements FuelRobot
	if (filler.isFacingRight()&&direction==GasRobot.LEFT)
		filler.changeDirection();
	while(filler.getCurrentIndex()!=loc)
		filler.moveForward(1);
}
public String toString(){
	String line1="Index->", line2="Level->",line3="Robot->";
	for (int i=0;i<tanks.size();i++){
		line1+=String.format("[ %3d ]",i);
		line2+=String.format("[ %3d ]", tanks.get(i).getFuelLevel());
		if (i!=filler.getCurrentIndex())
			line3+="[     ]";
		else if(filler.isFacingRight())
			line3+="[  -> ]";
		else line3+="[  <- ]";
	}
	return line1+"\n"+line2+"\n"+line3;
}


}

FuelTankTester.java



public class FuelTankTester 
{
	public static void main(String[] args){
		int [] theTanks1={80,70,20,45,50,25};
		FuelDepot depot=new FuelDepot(GasRobot.RIGHT,2, theTanks1);
		System.out.println("First Example\n"+depot+"\n");
		int [] theTanks2={20,30,80,55,50,75,20};
		depot=new FuelDepot(GasRobot.RIGHT,2, theTanks2);
		System.out.println("Part A Example\n"+depot+"\n");
		System.out.println("nextTankToFill(50) should return 0 or 6:");
		System.out.println("your method returns "+depot.nextTankToFill(50));
		System.out.println("nextTankToFill(15) should return 2:");
		System.out.println("your method returns "+depot.nextTankToFill(15));
		System.out.println("\nPart B Testing:");
		System.out.println("Testing moving without changing direction:");
		depot.moveToLocation(4);
		System.out.println("moveToLocation(4)\n"+depot+"\n");
		depot.moveToLocation(6);
		System.out.println("moveToLocation(6)\n"+depot+"\n");
		System.out.println("Testing moving beyond the last tank--make sure you still have an arrow showing:");
		depot.moveToLocation(8);
		System.out.println("moveToLocation(8)\n"+depot+"\n");
		System.out.println("Testing moving that requires changing direction--make sure arrow points left:");
		depot.moveToLocation(4);
		System.out.println("moveToLocation(4)\n"+depot+"\n");
		System.out.println("Testing moving beyond the first tank--make sure you still have an arrow showing:");
		depot.moveToLocation(-1);
		System.out.println("moveToLocation(-1)\n"+depot+"\n");
	}
}

If everything is working well you should see this output to the Tester:

First Example
Index->[   0 ][   1 ][   2 ][   3 ][   4 ][   5 ]
Level->[  80 ][  70 ][  20 ][  45 ][  50 ][  25 ]
Robot->[     ][     ][  -> ][     ][     ][     ]

Part A Example
Index->[   0 ][   1 ][   2 ][   3 ][   4 ][   5 ][   6 ]
Level->[  20 ][  30 ][  80 ][  55 ][  50 ][  75 ][  20 ]
Robot->[     ][     ][  -> ][     ][     ][     ][     ]

nextTankToFill(50) should return 0 or 6:
your method returns 0
nextTankToFill(15) should return 2:
your method returns 2

Part B Testing:
Testing moving without changing direction:
moveToLocation(4)
Index->[   0 ][   1 ][   2 ][   3 ][   4 ][   5 ][   6 ]
Level->[  20 ][  30 ][  80 ][  55 ][  50 ][  75 ][  20 ]
Robot->[     ][     ][     ][     ][  -> ][     ][     ]

moveToLocation(6)
Index->[   0 ][   1 ][   2 ][   3 ][   4 ][   5 ][   6 ]
Level->[  20 ][  30 ][  80 ][  55 ][  50 ][  75 ][  20 ]
Robot->[     ][     ][     ][     ][     ][     ][  -> ]

Testing moving beyond the last tank--make sure you still have an arrow showing:
moveToLocation(8)
Index->[   0 ][   1 ][   2 ][   3 ][   4 ][   5 ][   6 ]
Level->[  20 ][  30 ][  80 ][  55 ][  50 ][  75 ][  20 ]
Robot->[     ][     ][     ][     ][     ][     ][  -> ]

Testing moving that requires changing direction--make sure arrow points left:
moveToLocation(4)
Index->[   0 ][   1 ][   2 ][   3 ][   4 ][   5 ][   6 ]
Level->[  20 ][  30 ][  80 ][  55 ][  50 ][  75 ][  20 ]
Robot->[     ][     ][     ][     ][  <- ][     ][     ]

Testing moving beyond the first tank--make sure you still have an arrow showing:
moveToLocation(-1)
Index->[   0 ][   1 ][   2 ][   3 ][   4 ][   5 ][   6 ]
Level->[  20 ][  30 ][  80 ][  55 ][  50 ][  75 ][  20 ]
Robot->[     ][     ][     ][     ][  <- ][     ][     ]