שירות השכרת רכבים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-GDScript של Coddy. שיעור 65 מתוך 65.
אתגר
בינוניבנו שירות להשכרת כלי רכב: כלי רכב משני סוגים, השכרות וסוכנות שמנהלת את שניהם. המחירים הם בדולרים שלמים (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()
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםמילת המפתח selfמתודותמאפייניםבנאי (_init)חזרה – מחשבון פשוט2מאפייני מחלקה
משתני מופע לעומת משתנים סטטייםפונקציות סטטיותקובעי מאפייניםמאחזרי מאפייניםפרטיים לפי מוסכמהסיכום – מנהל חשבון בנק5כימוס
איברים ציבוריים ופרטייםאימות באמצעות Settersהסתרת מידעמאפיינים לקריאה בלבדסיכום – מערכת לניהול רשומות תלמידיםתרגלו בעצמכם: קומפיילר GDScript אונליין