OO駐車場を設計します。どのようなクラスと関数がありますか。それは、満員で空であり、バレーパーキングの場所を見つけることができるはずです。駐車場には、通常、障害者用、コンパクトの3種類の駐車場があります。
ありがとう!
OO駐車場を設計します。どのようなクラスと関数がありますか。それは、満員で空であり、バレーパーキングの場所を見つけることができるはずです。駐車場には、通常、障害者用、コンパクトの3種類の駐車場があります。
ありがとう!
回答:
ここにギアを回すためのクイックスタートがあります...
ParkingLotはクラスです。
ParkingSpaceはクラスです。
ParkingSpaceには入り口があります。
入り口には、場所、つまり入り口からの距離があります。
ParkingLotSignはクラスです。
ParkingLotには、ParkingLotSignがあります。
ParkingLotの駐車スペースの数には限りがあります。
HandicappedParkingSpaceは、ParkingSpaceのサブクラスです。
RegularParkingSpaceは、ParkingSpaceのサブクラスです。
CompactParkingSpaceは、ParkingSpaceのサブクラスです。
ParkingLotは、ParkingSpacesの配列と、エントランスからの距離順に、空のParkingSpacesの個別の配列を保持します。
ParkingLotSignは、.Full()、. Empty()、または.Normal()を呼び出すことで、「完全」、「空」、または「空白/通常/部分的に占有」を表示するように指示できます。
パーカーはクラスです。
パーカーはPark()できます。
パーカーはUnpark()できます。
ValetはParkerのサブクラスであり、ParkingLot.FindVacantSpaceNearestEntrance()を呼び出して、ParkingSpaceを返すことができます。
パーカーにはパーキングスペースがあります。
パーカーは、ParkingSpace.Take()およびParkingSpace.Vacate()を呼び出すことができます。
Parkerは、Entrance.Entering()およびEntrance.Exiting()を呼び出し、ParkingSpaceは、駐車または空きが出たときに、ParkingLotに通知して、ParkingLotが満杯かどうかを判断できるようにします。新しくいっぱいになった、または新しく空になった、または新しくいっぱいになった、または空にならない場合は、ParkingLotSign.Full()、ParkingLotSign.Empty()、ParkingLotSign.Normal()を変更する必要があります。
HandicappedParkerはParkerのサブクラス、CompactParkerはParkerのサブクラス、RegularParkerはParkerのサブクラスにすることができます。(実際にはやり過ぎかもしれません。)
このソリューションでは、Parkerの名前をCarに変更する必要がある可能性があります。
public class ParkingLot
{
Vector<ParkingSpace> vacantParkingSpaces = null;
Vector<ParkingSpace> fullParkingSpaces = null;
int parkingSpaceCount = 0;
boolean isFull;
boolean isEmpty;
ParkingSpace findNearestVacant(ParkingType type)
{
Iterator<ParkingSpace> itr = vacantParkingSpaces.iterator();
while(itr.hasNext())
{
ParkingSpace parkingSpace = itr.next();
if(parkingSpace.parkingType == type)
{
return parkingSpace;
}
}
return null;
}
void parkVehicle(ParkingType type, Vehicle vehicle)
{
if(!isFull())
{
ParkingSpace parkingSpace = findNearestVacant(type);
if(parkingSpace != null)
{
parkingSpace.vehicle = vehicle;
parkingSpace.isVacant = false;
vacantParkingSpaces.remove(parkingSpace);
fullParkingSpaces.add(parkingSpace);
if(fullParkingSpaces.size() == parkingSpaceCount)
isFull = true;
isEmpty = false;
}
}
}
void releaseVehicle(Vehicle vehicle)
{
if(!isEmpty())
{
Iterator<ParkingSpace> itr = fullParkingSpaces.iterator();
while(itr.hasNext())
{
ParkingSpace parkingSpace = itr.next();
if(parkingSpace.vehicle.equals(vehicle))
{
fullParkingSpaces.remove(parkingSpace);
vacantParkingSpaces.add(parkingSpace);
parkingSpace.isVacant = true;
parkingSpace.vehicle = null;
if(vacantParkingSpaces.size() == parkingSpaceCount)
isEmpty = true;
isFull = false;
}
}
}
}
boolean isFull()
{
return isFull;
}
boolean isEmpty()
{
return isEmpty;
}
}
public class ParkingSpace
{
boolean isVacant;
Vehicle vehicle;
ParkingType parkingType;
int distance;
}
public class Vehicle
{
int num;
}
public enum ParkingType
{
REGULAR,
HANDICAPPED,
COMPACT,
MAX_PARKING_TYPE,
}
vacantParkingSpaces
もうソートされていません。findNearestVacant
最寄りの駐車スペースを返すように並べ替える必要があります。
findNearestVacant
実装が空のスペースのみを見つけ、必ずしも「最も近い」空スペースを見つけないのに、なぜ関数がと名付けられているのですか?なぜ「findVacant」ではないのですか?クラスに格納されているいくつかの状態を使用して、「最も近い」空間を返すのは良いことですが。たぶん、「入口」と「出口」からの距離を「スペース」クラスに格納して、「最近接」も計算できるようにするか、単純にスペースの座標を指定して、すべての入口からの距離と出口は必要に応じて計算できます。
parkVehicle
は、車両が駐車されているかどうかを示すブール値を返す必要があります。
タイプ「スペース」の多次元配列(コンストラクターで指定)を保持する駐車場が必要になります。駐車場は、スペースを埋めたり空にしたりする関数の呼び出しを介して使用されるスペースの数を追跡できます。スペースは、スペースの種類を示す列挙型を保持できます。Spaceには、taken()メソッドもあります。バレーパーキングの場合は、最初に開いたスペースを見つけて、そこに車を置いてください。また、スペースに配置するCarオブジェクトも必要です。これは、障害のある車両、コンパクトな車両、または通常の車両であるかどうかを保持します。
class ParkingLot
{
Space[][] spaces;
ParkingLot(wide, long); // constructor
FindOpenSpace(TypeOfCar); // find first open space where type matches
}
enum TypeOfSpace = {compact, handicapped, regular };
enum TypeOfCar = {compact, handicapped, regular };
class Space
{
TypeOfSpace type;
bool empty;
// gets and sets here
// make sure car type
}
class car
{
TypeOfCar type;
}