Menu
CoddyTech

שירות השכרת רכבים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 אונליין