Menu
CoddyTech
flag Ar iconالعربيةdown icon

خدمة تأجير المركبات

جزء من قسم البرمجة كائنية التوجّه في رحلة GDScript على Coddy. الدرس 65 من 65.

challenge icon

التحدي

متوسط

أنشئ خدمة لتأجير المركبات: مركبات من نوعين، وعقود تأجير، ووكالة تدير كليهما. الأسعار بالدولار الصحيح (int).

Vehicle في vehicle.gd:

  • يستقبل المُنشئ vin وmake وmodel وdaily_rate؛ وتبدأ قيمة available بـ true.
  • start_rental() -> bool: يعيد false عندما لا تكون المركبة متاحة؛ وإلا يجعلها غير متاحة ويعيد true.
  • end_rental() يجعلها متاحة مجددًا.
  • تعيد _to_string() القيمة MAKE MODEL (VIN: VIN) - Available، أو - Rented في النهاية.

يمتد كل من Car في car.gd وMotorcycle في motorcycle.gd من Vehicle. يستقبل المُنشئ في كل منهما قيم المركبة الأربع، بالإضافة إلى seats للسيارة أو engine_size للدراجة النارية. تعتمد دالة _to_string() فيهما على نص الفئة الأب: Car: + نص المركبة + - 5 seats، وMotorcycle: + نص المركبة + - 600cc.

Rental في rental.gd:

  • يستقبل المُنشئ rental_id وكائن vehicle وcustomer_name وdays؛ وتبدأ قيمة is_active بـ true.
  • calculate_cost() -> int: السعر اليومي مضروبًا في عدد الأيام.
  • end_rental() -> bool: يعيد false إذا كان عقد التأجير قد انتهى بالفعل؛ وإلا ينهيه، وينهي تأجير المركبة، ويعيد true.
  • _to_string(): Rental ID: MAKE MODEL for CUSTOMER, D days, $COST - Active، أو - Completed.

RentalAgency في rental_agency.gd:

  • يستقبل المُنشئ agency_name. يحتوي vehicles على قاموس يربط VIN بالمركبة، وrentals على قاموس يربط معرّف عقد التأجير بالعقد، وتبدأ قيمة next_rental_id بـ 1.
  • تخزّن add_vehicle(vehicle) المركبة باستخدام VIN الخاص بها كمفتاح.
  • rent_vehicle(vin, customer_name, days) -> String: يعيد "" إذا كان VIN غير معروف، أو كان عدد الأيام أقل من 1، أو لم تكن المركبة متاحة. وإلا يبدأ تأجير المركبة، وينشئ عقد Rental بمعرّف R1 أو R2... (لا يزداد العداد إلا عند نجاح التأجير)، ويخزّنه ثم يعيد المعرّف.
  • return_vehicle(rental_id) -> bool: يعيد false إذا كان المعرّف غير معروف؛ وإلا يعيد القيمة التي تعيدها دالة end_rental() الخاصة بعقد التأجير.
  • available_vehicles() -> Array[Vehicle]: يعيد المركبات المتاحة بترتيب إضافتها.
  • total_revenue() -> int: مجموع تكاليف جميع عقود التأجير، النشطة منها والمنتهية.

يخزّن عقد التأجير مركبته، لكن المركبة لا تخزّن عقد تأجيرها، لذا لا يشير أي كائنين إلى بعضهما. في حالة الإدخال هذه:

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

يكون الناتج:

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

ضع شيفرتك في vehicle.gd وcar.gd وmotorcycle.gd وrental.gd وrental_agency.gd. يحتوي main.gd على شيفرة الإدخال/الإخراج المقدمة، ولا يمكن تعديله.

جرّب بنفسك

extends Node

func _ready():
	# شفرة الإدخال والإخراج المقدَّمة: اتركها كما هي

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

جميع دروس البرمجة كائنية التوجّه

تدرّب بنفسك: مترجم GDScript عبر الإنترنت