Menu
Coddy logo textTech

חניון

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Swift של Coddy. שיעור 55 מתוך 57.

challenge icon

אתגר

קשה

בנו חניון. לפרוטוקול Vehicle יש plate, size (enum בשם Size: Int, Comparable עם small = 1, medium = 2, large = 3) ו-hourlyRate. ממשו את Motorbike (קטן, 1 לשעה), את Car (בינוני, 3) ואת Van (גדול, 5). המחלקה Garage נוצרת עם מספר מקומות לכל גודל. park(_:) מחנה רכב במקום פנוי בגודל המתאים לו, או, אם אין מקום פנוי, במקום בגודל הבא אחריו, ומחזירה parked AB12 in medium או full for AB12. leave(plate:hours:) מפנה את המקום ומחזירה AB12 paid 9 (תעריף כפול מספר השעות, לפחות שעה אחת), או no vehicle AB12. status() מחזירה free: small 1, medium 0, large 2.

הקוד שסופק קורא את מספר המקומות בפורמט small,medium,large, ואז פקודות כגון park car AB12, leave AB12 3 או status, ומדפיס כל תשובה.

כתבו את הקוד שלכם בקבצים Size.swift, Vehicle.swift, Motorbike.swift, Car.swift, Van.swift ו-Garage.swift. הקובץ main.swift מכיל את קוד הקלט/פלט שסופק, ואי אפשר לערוך אותו.

נסו בעצמכם

// קוד קלט/פלט שסופק: יש להשאיר אותו כפי שהוא
var input: [String] = []
while let line = readLine() { input.append(line) }
let s = input[0].split(separator: ",").map { Int($0)! }
let garage = Garage(small: s[0], medium: s[1], large: s[2])
for cmd in input.dropFirst() {
    let p = cmd.split(separator: " ").map(String.init)
    switch p[0] {
    case "park":
        let v: any Vehicle
        switch p[1] {
        case "bike": v = Motorbike(plate: p[2])
        case "van": v = Van(plate: p[2])
        default: v = Car(plate: p[2])
        }
        print(garage.park(v))
    case "leave": print(garage.leave(plate: p[1], hours: Int(p[2])!))
    default: print(garage.status())
    }
}

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: Swift אונליין