Menu
CoddyTech

Fahrzeugvermietung

Teil des Abschnitts Objektorientierte Programmierung der GDScript-Journey von Coddy. Lektion 65 von 65.

challenge icon

Aufgabe

Mittel

Erstelle einen Fahrzeugvermietungsdienst: Fahrzeuge zweier Arten, Mietverträge und die Agentur, die beides verwaltet. Die Preise sind ganze Dollarbeträge (int).

Vehicle in vehicle.gd:

  • Der Konstruktor nimmt vin, make, model und daily_rate entgegen; available ist anfangs true.
  • start_rental() -> bool: gibt false zurück, wenn das Fahrzeug nicht verfügbar ist; andernfalls markiert es das Fahrzeug als nicht verfügbar und gibt true zurück.
  • end_rental() macht es wieder verfügbar.
  • _to_string() gibt MAKE MODEL (VIN: VIN) - Available zurück, oder am Ende - Rented.

Car in car.gd und Motorcycle in motorcycle.gd erweitern Vehicle. Ihre Konstruktoren nehmen die vier Fahrzeugwerte sowie seats (Auto) oder engine_size (Motorrad) entgegen. Ihr _to_string() baut auf dem Text der Elternklasse auf: Car: + Fahrzeugtext + - 5 seats und Motorcycle: + Fahrzeugtext + - 600cc.

Rental in rental.gd:

  • Der Konstruktor nimmt rental_id, das vehicle-Objekt, customer_name und days entgegen; is_active ist anfangs true.
  • calculate_cost() -> int: der Tagessatz multipliziert mit der Anzahl der Tage.
  • end_rental() -> bool: false für einen Mietvertrag, der bereits beendet wurde; andernfalls beendet es den Mietvertrag, beendet die Vermietung des Fahrzeugs und gibt true zurück.
  • _to_string(): Rental ID: MAKE MODEL for CUSTOMER, D days, $COST - Active oder - Completed.

RentalAgency in rental_agency.gd:

  • Der Konstruktor nimmt agency_name entgegen. vehicles ist ein Dictionary, das VINs Fahrzeugen zuordnet, rentals ein Dictionary, das Mietvertrags-IDs Mietverträgen zuordnet, und next_rental_id beginnt bei 1.
  • add_vehicle(vehicle) speichert ein Fahrzeug unter seiner VIN.
  • rent_vehicle(vin, customer_name, days) -> String: gibt "" zurück, wenn die VIN unbekannt ist, weniger als 1 Tag angegeben wurde oder das Fahrzeug nicht verfügbar ist. Andernfalls beginnt es die Vermietung des Fahrzeugs, erstellt einen Rental mit der ID R1, R2... (der Zähler wird nur bei einer erfolgreichen Vermietung erhöht), speichert ihn und gibt die ID zurück.
  • return_vehicle(rental_id) -> bool: false bei einer unbekannten ID; andernfalls gibt es den Rückgabewert von end_rental() des Mietvertrags zurück.
  • available_vehicles() -> Array[Vehicle]: die verfügbaren Fahrzeuge in der Reihenfolge, in der sie hinzugefügt wurden.
  • total_revenue() -> int: die Summe der Kosten aller Mietverträge, aktiver und abgeschlossener.

Ein Mietvertrag speichert sein Fahrzeug, aber ein Fahrzeug speichert nicht seinen Mietvertrag, sodass keine zwei Objekte aufeinander verweisen. Bei dieser Eingabe:

Speedy Rentals
car C1|Toyota|Camry|50|5
moto M1|Honda|CBR|40|600
rent C1|Ana|3
rent C1|Ben|2
available
kind M1
rentals
revenue

lautet die Ausgabe:

Rented C1 as R1: $150
Cannot rent C1
Available at Speedy Rentals:
- Motorcycle: Honda CBR (VIN: M1) - Available - 600cc
M1: Vehicle true, Car false, Motorcycle true
Rental R1: Toyota Camry for Ana, 3 days, $150 - Active
Revenue: $150

Dein Code gehört in vehicle.gd, car.gd, motorcycle.gd, rental.gd und rental_agency.gd. main.gd enthält den bereitgestellten Ein-/Ausgabecode und kann nicht bearbeitet werden.

Probier es selbst

extends Node

func _ready():
	# Vorgegebener Eingabe-/Ausgabecode: unverändert lassen

	var agency := RentalAgency.new(OS.read_string_from_stdin())

	var line := OS.read_string_from_stdin()
	while line != "":
		var parts := line.split(" ", true, 1)
		var f: PackedStringArray = parts[1].split("|") if parts.size() > 1 else PackedStringArray()
		match parts[0]:
			"vehicle":
				agency.add_vehicle(Vehicle.new(f[0], f[1], f[2], int(f[3])))
			"car":
				agency.add_vehicle(Car.new(f[0], f[1], f[2], int(f[3]), int(f[4])))
			"moto":
				agency.add_vehicle(Motorcycle.new(f[0], f[1], f[2], int(f[3]), int(f[4])))
			"rent":
				var rental_id: String = agency.rent_vehicle(f[0], f[1], int(f[2]))
				if rental_id == "":
					print("Cannot rent ", f[0])
				else:
					var rental: Rental = agency.rentals[rental_id]
					print("Rented %s as %s: $%d" % [f[0], rental_id, rental.calculate_cost()])
			"return":
				print("Return ", f[0], ": ", agency.return_vehicle(f[0]))
			"available":
				print("Available at ", agency.agency_name, ":")
				for vehicle in agency.available_vehicles():
					print("- ", vehicle)
			"fleet":
				for vin in agency.vehicles:
					print(agency.vehicles[vin])
			"kind":
				var vehicle: Vehicle = agency.vehicles[f[0]]
				print("%s: Vehicle %s, Car %s, Motorcycle %s" % [f[0], vehicle is Vehicle, vehicle is Car, vehicle is Motorcycle])
			"rentals":
				for rental_id in agency.rentals:
					print(agency.rentals[rental_id])
			"revenue":
				print("Revenue: $", agency.total_revenue())

		line = OS.read_string_from_stdin()

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-GDScript-Compiler