Menu
CoddyTech

停车场

本课属于 Coddy R 学习旅程的“面向对象编程”单元。第 55 课,共 57 课。

challenge icon

挑战

困难

构建一个停车场。Vehicle.R 声明虚拟 S4 类 Vehicle(槽位 plate)、泛型 size_rank(v) 和 rate(v),以及名称 SIZES:small、medium、large,分别对应等级 1、2 和 3。

  • 在 Motorbike.R、Car.R 和 Van.R 中,类已经声明;为它们添加方法:摩托车的等级为 1,每小时收费 1;汽车的等级为 2,每小时收费 3;厢式货车的等级为 3,每小时收费 5。
  • 在 Garage.R 中完成引用类 Garage。它的字段 free 存储各等级的空车位数量,parked 是一个按车牌索引的列表。park(v) 会占用车辆所属等级的空车位;如果没有空位,则占用下一个更高等级的空车位,并返回 parked AB12 in medium、full for AB12 或 AB12 is already parked。leave(plate, hours) 会释放车位,并返回 AB12 paid 9(费用为费率乘以小时数,至少按 1 小时计算)或 no vehicle AB12。status() 会返回 free: small 1, medium 0, large 2; parked: 1。

提供的代码会读取空车位数量,顺序为 small,medium,large,然后读取命令 park car AB12(类型可以是 bike、car 或 van)、leave AB12 3 或 status,并打印每条回复。

你的代码应写在 Vehicle.R、Motorbike.R、Car.R、Van.R 和 Garage.R 中。main.R 存放提供的输入/输出代码,不能编辑。

亲手试试

source("Vehicle.R")
source("Motorbike.R")
source("Car.R")
source("Van.R")
source("Garage.R")

# 提供的输入/输出代码:保持原样
input <- suppressWarnings(readLines(file("stdin")))
garage <- Garage$new(free = as.numeric(strsplit(input[1], ",")[[1]]))
for (line in input[-1]) {
  p <- strsplit(line, " ")[[1]]
  reply <- switch(p[1],
    park = garage$park(switch(p[2],
      bike = new("Motorbike", plate = p[3]),
      car = new("Car", plate = p[3]),
      van = new("Van", plate = p[3]))),
    leave = garage$leave(p[2], as.numeric(p[3])),
    status = garage$status())
  cat(reply, "\n", sep = "")
}

面向对象编程中的所有课

自己练习: R 在线编译器