Храните этаж и состояние дверей в объекте лифта, а разбор команд отделите от изменения состояния. Диапазон этажей и начальное положение передавайте параметрами.
Реализуйте программу, имитирующую работу лифта в многоэтажном здании.
Храните этаж и состояние дверей в объекте лифта, а разбор команд отделите от изменения состояния. Диапазон этажей и начальное положение передавайте параметрами.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Реализуйте программу, имитирующую работу лифта в многоэтажном здании. Программа должна обрабатывать команды пользователя и выводить результаты их выполнения.
Программа должна быть поддерживаемой и расширяемой.
Требования:
- Программа должна начинаться с вывода текущего этажа лифта и перевода строки.
- Программа должна запрашивать ввод пользователя и обрабатывать команды, которые она умеет выполнять.
- Программа должна выводить ответ выполненной команды, текущий этаж лифта и перевод строки.
- Программа должна реализовывать следующие команды: 4.1. помощь: выводить список доступных команд одной строкой в виде: "Доступные команды: [список команд в виде строк разделенных запятыми]". 4.2. ехать на <этаж>: при наличии такого этажа в здании переместить лифт на этот этаж и вывести "Лифт прибыл на <этаж> этаж". При отсутствии такого этажа вывести "Этаж не существует". 4.3. открыть: открыть двери лифта и вывести "Двери лифта открыты". 4.4. закрыть: закрыть двери лифта и вывести "Двери лифта закрыты". 4.5. выход: завершить интерактивную сессию. 4.6. при вводе любой другой строки не совершать никаких действий и вернуться к запросу ввода команды.
Ответ
Храните этаж и состояние дверей в объекте лифта, а разбор команд отделите от изменения состояния. Диапазон этажей и начальное положение передавайте параметрами.
Минимальный пример: этажи 1…floors, старт на первом. Поездка закрывает двери — это явно выбранное правило, которого нет в условии.
class Elevator:
def __init__(self, floors):
if floors < 1:
raise ValueError('floors must be positive')
self.floors, self.floor, self.opened = floors, 1, False
def move(self, floor):
if not 1 <= floor <= self.floors:
return 'Этаж не существует'
self.opened, self.floor = False, floor
return f'Лифт прибыл на {floor} этаж'
def door(self, opened):
self.opened = opened
return 'Двери лифта открыты' if opened else 'Двери лифта закрыты'
def run(floors):
elevator = Elevator(floors)
help_text = 'Доступные команды: помощь, ехать на <этаж>, открыть, закрыть, выход'
actions = {
'помощь': lambda: help_text,
'открыть': lambda: elevator.door(True),
'закрыть': lambda: elevator.door(False),
}
print(elevator.floor)
while True:
try:
command = input().strip()
except EOFError:
break
if command == 'выход':
break
if command in actions:
result = actions[command]()
elif command.startswith('ехать на '):
try:
floor = int(command[len('ехать на '):])
except ValueError:
continue
result = elevator.move(floor)
else:
continue
print(result)
print(elevator.floor)
Неизвестная команда не меняет состояние и не печатает ответ. Параметр floors задаётся вызывающим кодом; асинхронное движение и очередь вызовов в условии не требуются.