Menu
CoddyTech

Servizio di noleggio veicoli

Fa parte della sezione Programmazione orientata agli oggetti del percorso GDScript di Coddy. Lezione 65 di 65.

challenge icon

Sfida

Medio

Crea un servizio di noleggio veicoli: veicoli di due tipi, noleggi e l’agenzia che gestisce entrambi. I prezzi sono espressi in dollari interi (int).

Vehicle in vehicle.gd:

  • Il costruttore accetta vin, make, model e daily_rate; available inizia con il valore true.
  • start_rental() -> bool: restituisce false quando il veicolo non è disponibile; altrimenti lo segna come non disponibile e restituisce true.
  • end_rental() lo rende nuovamente disponibile.
  • _to_string() restituisce MAKE MODEL (VIN: VIN) - Available, oppure termina con - Rented.

Car in car.gd e Motorcycle in motorcycle.gd estendono Vehicle. I loro costruttori accettano i quattro valori del veicolo più seats (auto) oppure engine_size (motocicletta). Il loro _to_string() si basa sul testo della classe genitore: Car: + testo del veicolo + - 5 seats, e Motorcycle: + testo del veicolo + - 600cc.

Rental in rental.gd:

  • Il costruttore accetta rental_id, l’oggetto vehicle, customer_name e days; is_active inizia con il valore true.
  • calculate_cost() -> int: la tariffa giornaliera moltiplicata per il numero di giorni.
  • end_rental() -> bool: restituisce false per un noleggio già terminato; altrimenti lo termina, termina il noleggio del veicolo e restituisce true.
  • _to_string(): Rental ID: MAKE MODEL for CUSTOMER, D days, $COST - Active, oppure - Completed.

RentalAgency in rental_agency.gd:

  • Il costruttore accetta agency_name. vehicles è un dizionario che associa il VIN al veicolo, rentals è un dizionario che associa l’id del noleggio al noleggio e next_rental_id inizia da 1.
  • add_vehicle(vehicle) memorizza un veicolo usando il suo VIN come chiave.
  • rent_vehicle(vin, customer_name, days) -> String: restituisce "" se il VIN è sconosciuto, se il noleggio dura meno di 1 giorno o se il veicolo non è disponibile. Altrimenti avvia il noleggio del veicolo, crea un Rental con l’id R1, R2... (il contatore aumenta solo in caso di noleggio riuscito), lo memorizza e restituisce l’id.
  • return_vehicle(rental_id) -> bool: restituisce false per un id sconosciuto; altrimenti restituisce il valore restituito da end_rental() del noleggio.
  • available_vehicles() -> Array[Vehicle]: i veicoli disponibili, nell’ordine in cui sono stati aggiunti.
  • total_revenue() -> int: la somma dei costi di tutti i noleggi, attivi o completati.

Un noleggio memorizza il proprio veicolo, ma un veicolo non memorizza il proprio noleggio, quindi nessuna coppia di oggetti punta l’uno all’altro. Con questo input:

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

l’output è:

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

Il tuo codice va inserito in vehicle.gd, car.gd, motorcycle.gd, rental.gd e rental_agency.gd. main.gd contiene il codice fornito per l’input/output e non può essere modificato.

Provalo tu

extends Node

func _ready():
	# Codice di input/output fornito: lascialo così com'è

	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()

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore GDScript online