Follow the instructions and templates please Instructions 1
Follow the instructions and templates, please.
Instructions
1 What to implement?
For this homework, you will implement a class Gym to simulate the Gymnasium using the Gate class. Please read the comments in the le Gym.java for the requirements of the methods.
2 What is provided
We provide a driver class Hwk4.java and a template Gym.java for the Gym class. You should use your solution to the class Gate.
3 What does output look like?
If you run the driver class Hwk4.java, you will see output that looks like the followings (due to random simulation, the actual numbers may dier):
After 5000 simulations: 482 persons are in the gym
Gate gate_0 is open to get in. 518 persons came in through this gate
Gate gate_1 is open to get in. 508 persons came in through this gate
Gate gate_2 is open to get in. 486 persons came in through this gate
Gate gate_3 is open to get out. 521 persons went out through this gate
Gate gate_4 is open to get out. 509 persons went out through this gate
Templates
Hwk4.java
package hwk4;
import java.util.Random;
public class Hwk4 {
public static void main(String[] args) {
int numOfGates = 5;
Gym gym = new Gym(numOfGates);
gym.open(3);
int numOfSimulations = 5000;
Random random = new Random();
for(int i=0; i<numOfSimulations; i++) {
int gateNumber = random.nextInt(numOfGates);
int inOrOut = random.nextInt(2);
if(inOrOut == 1) {
gym.getIn(gateNumber);
}
else {
gym.getOut(gateNumber);
}
}
String output = String.format(\"After %d simulations: %d persons are in the gym\ \",
numOfSimulations,
gym.personsInside());
System.out.printf(\"%s\ %s\", output, gym);
}
}
Gate.java
package hwk4;
enum State {IN, OUT, LOCKED}
public class Gate {
private State tripod;
// If negative, then it means the number of persons went outside through this gate
private int personGoneInside = 0;
private String name;
// Gate Constructor
public Gate(String name) { this(name, State.LOCKED); }
public Gate(String name, State state) {
this.name = name;
this.tripod = state;
}
public int numPersonGoneInside() { return personGoneInside; }
// To set the tripod direction
public void setTripod(State dir) { tripod = dir; }
// return true if and only if the gate is currently locked and will be unlocked after the call
public boolean open(State dir) {
boolean ret = tripod == State.LOCKED && dir != State.LOCKED;
setTripod(dir);
return ret;
}
// to close the gate
public void close() { tripod = State.LOCKED; }
// to check if the gate is locked or not
public boolean isLocked() { return tripod == State.LOCKED; }
// to return the tripod direction
public State tripodState() { return tripod ; }
public void getIn(int x) {
if (tripod == State.IN) {
personGoneInside += x;
}
}
public void getOut(int x) {
if (tripod == State.OUT) {
personGoneInside -= x;
}
}
// override of the toString method
public String toString() {
String state = \"\";
switch(tripod) {
case LOCKED: state = \"locked\"; break;
case IN: state = \"open to get in\"; break;
case OUT: state = \"open to get out\"; break;
}
String out;
if(personGoneInside > 0) {
out = \"came in through this gate\";
}
else {
out = \"went out through this gate\";
}
return String.format(\"Gate %s is %s.\ %d persons %s\ \", name, state, Math.abs(personGoneInside), out);
}
@Override
public boolean equals(Object that) {
boolean ret;
if(that instanceof Gate) {
Gate thatGate = (Gate) that;
ret = name.equals(thatGate.name) &&
tripod == thatGate.tripod &&
personGoneInside == thatGate.personGoneInside;
}
else {
ret = false;
}
return ret;
}
}
Gym.java
package hwk4;
public class Gym {
final Gate[] gates; // array of gates
final int capacity; // capacity of the gym
// initialize with number of gates set to 3 and capacity set to 1000
public Gym() {
// TODO
}
// initialize with specified number of gates and capacity set to 1000
public Gym(int numOfGates) {
// TODO
}
// initialize with specified number of gates and with specified capacity
public Gym(int numOfGates, int capacity) {
// TODO
}
// lock all gates
public void lockDown() {
// TODO
}
// open (roughly) half of the gates for in and the other half for out
public void open() {
// TODO
}
// if numOfInGate >= gates.length, then open (gates.length-1) gates for in and 1 for out
// if numOfInGate <= 0, then open 1 gate for in and rest for out
// otherwise, open \"numOfInGate\" gates for in and leave the rest for out
public void open(int numOfInGate) {
// TODO
}
// enters 1 person at gates[gateNumber] if the persons inside do not exceed capacity
// do nothing is the gateNumber is not legal
public void getIn(int gateNumber) {
// TODO
}
// exits 1 person at gates[gateNumber] if there is at least 1 person inside
// do nothing is the gateNumber is not legal
public void getOut(int gateNumber) {
// TODO
}
// returns true if and only if capacity is not reached
public boolean canGoIn() {
// TODO
}
// returns true if and only if it is not empty
public boolean canGoOut() {
// TODO
}
// return the number of persons inside the gym
public int personsInside() {
// TODO
}
// print each gate of the gym
@Override
public String toString() {
// TODO
}
}
Solution
Please find the code for the above question as follows:-
Gym.java
package com.chegg.gym;
public class Gym {
final Gate[] gates; // array of gates
final int capacity; // capacity of the gym
// initialize with number of gates set to 3 and capacity set to 1000
public Gym() {
// TODO
capacity = 1000;
gates = new Gate[3];
for(int i=0; i<gates.length; i++){
gates[i] = new Gate(\"gate_\"+i);
}
}
// initialize with specified number of gates and capacity set to 1000
public Gym(int numOfGates) {
// TODO
capacity = 1000;
gates = new Gate[numOfGates];
for(int i=0; i<gates.length; i++){
gates[i] = new Gate(\"gate_\"+i);
}
}
// initialize with specified number of gates and with specified capacity
public Gym(int numOfGates, int capacity) {
// TODO
this.capacity = capacity;
gates = new Gate[numOfGates];
for(int i=0; i<gates.length; i++){
gates[i] = new Gate(\"gate_\"+i);
}
}
// lock all gates
public void lockDown() {
// TODO
for (int i = 0; i < gates.length; i++) {
gates[i].close();
}
}
// open (roughly) half of the gates for in and the other half for out
public void open() {
// TODO
for (int i = 0; i < gates.length / 2; i++) {
gates[i].open(State.IN);
}
for (int i = gates.length / 2 + 1; i < gates.length; i++) {
gates[i].open(State.OUT);
}
}
// if numOfInGate >= gates.length, then open (gates.length-1) gates for in
// and 1 for out
// if numOfInGate <= 0, then open 1 gate for in and rest for out
// otherwise, open \"numOfInGate\" gates for in and leave the rest for out
public void open(int numOfInGate) {
// TODO
if (numOfInGate >= gates.length) {
int i;
for (i = 0; i < gates.length - 1; i++) {
gates[i].setTripod(State.IN);
}
gates[i].setTripod(State.OUT);
} else if (numOfInGate <= 0) {
int i;
for (i = 0; i < gates.length; i++) {
gates[i].setTripod(State.OUT);
}
gates[i].setTripod(State.IN);
} else{
int i;
for (i = 0; i < numOfInGate; i++) {
gates[i].setTripod(State.IN);
}
for(;i<gates.length;i++){
gates[i].setTripod(State.OUT);
}
}
}
// enters 1 person at gates[gateNumber] if the persons inside do not exceed
// capacity
// do nothing is the gateNumber is not legal
public void getIn(int gateNumber) {
// TODO
if (gateNumber <= gates.length) {
gates[gateNumber].getIn(1);
}
}
// exits 1 person at gates[gateNumber] if there is at least 1 person inside
// do nothing is the gateNumber is not legal
public void getOut(int gateNumber) {
// TODO
if (gateNumber <= gates.length) {
gates[gateNumber].getOut(1);
}
}
// returns true if and only if capacity is not reached
public boolean canGoIn() {
// TODO
int numPersonsInside = 0;
for(int i=0; i<gates.length; i++){
numPersonsInside += gates[i].numPersonGoneInside();
}
if(numPersonsInside<capacity){
return true;
}else
return false;
}
// returns true if and only if it is not empty
public boolean canGoOut() {
// TODO
int numPersonsInside = 0;
for(int i=0; i<gates.length; i++){
numPersonsInside += gates[i].numPersonGoneInside();
}
if(numPersonsInside>0){
return true;
}else
return false;
}
// return the number of persons inside the gym
public int personsInside() {
// TODO
int numPersonsInside = 0;
for(int i=0; i<gates.length; i++){
numPersonsInside += gates[i].numPersonGoneInside();
}
if(numPersonsInside>0){
return numPersonsInside;
}else
return 0;
}
// print each gate of the gym
@Override
public String toString() {
// TODO
String gateStatus = \"\";
for(int i=0; i<gates.length; i++){
gateStatus += gates[i].toString();
}
return gateStatus;
}
}





