Menu
Coddy logo textTech

Servizio di noleggio veicoli

Fa parte della sezione Programmazione orientata agli oggetti del percorso Python di Coddy. Lezione 64 di 64.

challenge icon

Sfida

Medio

In questa sfida implementerai un sistema di noleggio veicoli. Il sistema modella veicoli, noleggi e un'agenzia di noleggio, con ereditarietà e incapsulamento adeguati.

  • vehicle.py - Implementa la classe base Vehicle
  • car.py - Implementa la sottoclasse Car
  • motorcycle.py - Implementa la sottoclasse Motorcycle
  • rental.py - Implementa la classe Rental
  • rentalagency.py - Implementa la classe RentalAgency

Ogni file contiene commenti TODO dettagliati che guidano la tua implementazione. Segui questi commenti per assicurarti che il tuo codice soddisfi tutti i requisiti.

Provalo tu

from vehicle import Vehicle
from car import Car
from motorcycle import Motorcycle
from rental import Rental
from rentalagency import RentalAgency

# Gestore completo dei casi di test
test_case = input()

if test_case == "create_vehicles":
    # Verifica la creazione dei veicoli
    car = Car("C123", "Toyota", "Camry", 50, 5)
    bike = Motorcycle("M456", "Honda", "CBR", 35, 600)
    
    print(car)
    print(bike)

elif test_case == "rental_workflow":
    # Verifica il flusso di noleggio
    agency = RentalAgency("Quick Rentals")
    
    # Aggiungi veicoli
    car = Car("C123", "Toyota", "Camry", 50, 5)
    bike = Motorcycle("M456", "Honda", "CBR", 35, 600)
    agency.add_vehicle(car)
    agency.add_vehicle(bike)
    
    # Controlla i veicoli disponibili
    print(f"Available before rental: {len(agency.available_vehicles())}")
    
    # Noleggia un veicolo
    rental_id = agency.rent_vehicle("C123", "John Doe", 3)
    print(f"Rental created: {rental_id}")
    
    # Controlla i veicoli disponibili dopo il noleggio
    print(f"Available after rental: {len(agency.available_vehicles())}")
    
    # Restituisci il veicolo
    agency.return_vehicle(rental_id)
    
    # Controlla i veicoli disponibili dopo la restituzione
    print(f"Available after return: {len(agency.available_vehicles())}")

elif test_case == "rental_cost":
    # Verifica il calcolo del costo del noleggio
    car = Car("C123", "Toyota", "Camry", 50, 5)
    rental = Rental("R1", car, "John Doe", 3)
    print(f"Rental cost for 3 days: ${rental.calculate_cost()}")

elif test_case == "vehicle_methods":
    # Verifica i metodi di Vehicle
    vehicle = Vehicle("V789", "Generic", "Vehicle", 25)
    print(vehicle)
    print(f"Start rental: {vehicle.start_rental()}")
    print(f"Start rental again: {vehicle.start_rental()}")
    print(f"End rental: {vehicle.end_rental()}")
    print(f"Start rental after end: {vehicle.start_rental()}")

elif test_case == "inheritance_check":
    # Verifica le relazioni di ereditarietà
    car = Car("C123", "Toyota", "Camry", 50, 5)
    bike = Motorcycle("M456", "Honda", "CBR", 35, 600)
    
    print(f"Car is a Vehicle: {isinstance(car, Vehicle)}")
    print(f"Motorcycle is a Vehicle: {isinstance(bike, Vehicle)}")
    print(f"Car is a Motorcycle: {isinstance(car, Motorcycle)}")

elif test_case == "polymorphism":
    # Verifica il comportamento polimorfico
    vehicles = [
        Vehicle("V789", "Generic", "Vehicle", 25),
        Car("C123", "Toyota", "Camry", 50, 5),
        Motorcycle("M456", "Honda", "CBR", 35, 600)
    ]
    
    for i, v in enumerate(vehicles):
        print(f"Vehicle {i+1}: {v}")

elif test_case == "rental_edge_cases":
    # Verifica i casi limite del noleggio
    agency = RentalAgency("Edge Rentals")
    
    # Prova a noleggiare un veicolo inesistente
    print(f"Rent non-existent: {agency.rent_vehicle('X999', 'John Doe', 3)}")
    
    # Aggiungi un'auto e noleggiala
    car = Car("C123", "Toyota", "Camry", 50, 5)
    agency.add_vehicle(car)
    rental_id = agency.rent_vehicle("C123", "John Doe", 3)
    print(f"Valid rental: {rental_id}")
    
    # Prova a noleggiare di nuovo la stessa auto
    print(f"Rent unavailable car: {agency.rent_vehicle('C123', 'Jane Smith', 2)}")
    
    # Prova a restituire un noleggio inesistente
    print(f"Return non-existent rental: {agency.return_vehicle('R999')}")
    
    # Restituisci il veicolo del noleggio valido
    print(f"Return valid rental: {agency.return_vehicle(rental_id)}")
    
    # Prova a restituire di nuovo il veicolo dello stesso noleggio
    print(f"Return completed rental: {agency.return_vehicle(rental_id)}")

elif test_case == "agency_operations":
    # Verifica tutte le operazioni dell'agenzia
    agency = RentalAgency("Full Service Rentals")
    
    # Aggiungi 5 veicoli
    vehicles = [
        Car("C1", "Toyota", "Camry", 50, 5),
        Car("C2", "Honda", "Accord", 55, 5),
        Car("C3", "Ford", "Focus", 45, 5),
        Motorcycle("M1", "Honda", "CBR", 35, 600),
        Motorcycle("M2", "Yamaha", "R1", 40, 1000)
    ]
    
    for v in vehicles:
        agency.add_vehicle(v)
    
    print(f"Available vehicles: {len(agency.available_vehicles())}")
    
    # Noleggia 3 veicoli
    rental_ids = [
        agency.rent_vehicle("C1", "Customer 1", 3),
        agency.rent_vehicle("C2", "Customer 2", 5),
        agency.rent_vehicle("M1", "Customer 3", 2)
    ]
    
    print(f"Available after rentals: {len(agency.available_vehicles())}")
    
    # Restituisci 2 veicoli
    agency.return_vehicle(rental_ids[0])
    agency.return_vehicle(rental_ids[1])
    
    print(f"Available after returns: {len(agency.available_vehicles())}")
    
    # Stampa i veicoli disponibili
    print("Available vehicles:")
    for v in agency.available_vehicles():
        print(f"  {v}")

elif test_case == "stress_test":
    # Test di carico con molti veicoli
    agency = RentalAgency("Stress Test Rentals")
    
    # Aggiungi 100 veicoli
    for i in range(100):
        if i % 2 == 0:
            vehicle = Car(f"C{i}", "Make{i}", f"Model{i}", 50, 5)
        else:
            vehicle = Motorcycle(f"M{i}", "Make{i}", f"Model{i}", 35, 600)
        agency.add_vehicle(vehicle)
    
    # Noleggia 50 veicoli
    rental_ids = []
    for i in range(50):
        vin = f"C{i*2}" if i % 2 == 0 else f"M{i*2-1}"
        rental_id = agency.rent_vehicle(vin, f"Customer{i}", 3)
        rental_ids.append(rental_id)
    
    print(f"Available after 50 rentals: {len(agency.available_vehicles())}")
    
    # Restituisci tutti i veicoli noleggiati
    for rental_id in rental_ids:
        agency.return_vehicle(rental_id)
    
    print(f"Available after all returns: {len(agency.available_vehicles())}")

elif test_case == "invalid_inputs":
    # Test con input non validi
    car = Car("C123", "Toyota", "Camry", -50, 5)
    print(f"Car with negative rate: {car}")
    
    bike = Motorcycle("M456", "Honda", "CBR", 35, 0)
    print(f"Motorcycle with zero engine: {bike}")
    
    rental_zero = Rental("R1", car, "John Doe", 0)
    print(f"Rental with zero days cost: ${rental_zero.calculate_cost()}")
    
    rental_neg = Rental("R2", car, "Jane Smith", -3)
    print(f"Rental with negative days cost: ${rental_neg.calculate_cost()}")

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Python online