Menu
CoddyTech

Layanan Penyewaan Kendaraan

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 65 dari 65.

challenge icon

Tantangan

Sedang

Buat layanan penyewaan kendaraan: kendaraan dalam dua jenis, penyewaan, dan agensi yang mengelola keduanya. Harga dalam dolar bulat (int).

Vehicle di vehicle.gd:

  • Konstruktor menerima vin, make, model, dan daily_rate; available dimulai dengan nilai true.
  • start_rental() -> bool: mengembalikan false jika kendaraan tidak tersedia; jika tidak, tandai kendaraan sebagai tidak tersedia dan kembalikan true.
  • end_rental() membuat kendaraan tersedia kembali.
  • _to_string() mengembalikan MAKE MODEL (VIN: VIN) - Available, atau - Rented di bagian akhir.

Car di car.gd dan Motorcycle di motorcycle.gd mewarisi Vehicle. Konstruktor keduanya menerima empat nilai kendaraan ditambah seats (mobil) atau engine_size (sepeda motor). _to_string() keduanya menggunakan teks dari induknya: Car: + teks kendaraan + - 5 seats, dan Motorcycle: + teks kendaraan + - 600cc.

Rental di rental.gd:

  • Konstruktor menerima rental_id, object vehicle, customer_name, dan days; is_active dimulai dengan nilai true.
  • calculate_cost() -> int: tarif harian dikalikan jumlah hari.
  • end_rental() -> bool: mengembalikan false untuk penyewaan yang sudah berakhir; jika belum, akhiri penyewaan, akhiri penyewaan kendaraan, lalu kembalikan true.
  • _to_string(): Rental ID: MAKE MODEL for CUSTOMER, D days, $COST - Active, atau - Completed.

RentalAgency di rental_agency.gd:

  • Konstruktor menerima agency_name. vehicles adalah dictionary dari VIN ke kendaraan, rentals adalah dictionary dari id penyewaan ke penyewaan, dan next_rental_id dimulai dari 1.
  • add_vehicle(vehicle) menyimpan kendaraan menggunakan VIN-nya sebagai kunci.
  • rent_vehicle(vin, customer_name, days) -> String: mengembalikan "" jika VIN tidak dikenal, jumlah hari kurang dari 1, atau kendaraan tidak tersedia. Jika tidak, mulai penyewaan kendaraan, buat Rental dengan id R1, R2... (penghitung hanya bertambah jika penyewaan berhasil), simpan, lalu kembalikan id tersebut.
  • return_vehicle(rental_id) -> bool: mengembalikan false jika id tidak dikenal; jika tidak, kembalikan hasil dari end_rental() milik penyewaan tersebut.
  • available_vehicles() -> Array[Vehicle]: kendaraan yang tersedia, sesuai urutan penambahannya.
  • total_revenue() -> int: jumlah biaya semua penyewaan, yang masih aktif maupun yang sudah selesai.

Penyewaan menyimpan kendaraannya, tetapi kendaraan tidak menyimpan penyewaannya, sehingga tidak ada dua object yang saling menunjuk. Untuk input ini:

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

output-nya adalah:

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

Tulis kodemu di vehicle.gd, car.gd, motorcycle.gd, rental.gd, dan rental_agency.gd. main.gd berisi kode input/output yang disediakan dan tidak dapat diedit.

Coba sendiri

extends Node

func _ready():
	# Kode input/output yang disediakan: biarkan apa adanya

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

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler GDScript online