停车场
本课属于 Coddy R 学习旅程的“面向对象编程”单元。第 55 课,共 57 课。
挑战
困难构建一个停车场。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 在线编译器