This commit is contained in:
Volodymyr Baliasnikov 2026-11-03 15:34:15 +01:00
parent 3dff8e2b86
commit 5e8556f6e0

View File

@ -3,8 +3,8 @@ class Node:
def __init__(self, text: str): def __init__(self, text: str):
self.text = text self.text = text
self.is_question = text.endswith('?') self.is_question = text.endswith('?')
self.left = None # Ссылка на левого потомка (выбор a да) self.left = None # Ссылка на левого потомка (выбор t да)
self.right = None # Ссылка на правого потомка (выбор n нет) self.right = None # Ссылка на правого потомка (выбор f нет)
class ZooExpertSystem: class ZooExpertSystem:
# Класс для управления системой зоопарка # Класс для управления системой зоопарка
@ -21,7 +21,7 @@ class ZooExpertSystem:
# Списки для разделенных строк входа # Списки для разделенных строк входа
self.db_lines = [] # Строки относящиеся к базе знаний (дереву) self.db_lines = [] # Строки относящиеся к базе знаний (дереву)
self.user_choices = ([]) # Строки с ответами пользователя (a или n) self.user_choices = ([]) # Строки с ответами пользователя (t или f)
def run(self): def run(self):
# контроллер запускает программу в строгом соответствии с жизненным циклом. # контроллер запускает программу в строгом соответствии с жизненным циклом.
@ -54,3 +54,55 @@ class ZooExpertSystem:
except EOFError: except EOFError:
pass pass
return tree_lines return tree_lines
def _parse_input(self) -> bool:
# Читаем базу знаний до пустой строки
self.db_lines = self._read_tree_lines()
if not self.db_lines:
return False
# Читаем оставшиеся строки с ответами пользователя (t / f)
try:
while True:
choice = input().rstrip("\r")
self.user_choices.append(choice)
except EOFError:
pass
return True
def _build_tree(self) -> bool:
# Рекурсивная сборка бинарного дерева из db_lines в формате Preorder
idx = 0
def parse_node():
nonlocal idx
if idx >= len(self.db_lines):
return None
text = self.db_lines[idx]
idx += 1
node = Node(text)
if node.is_question:
self.q_count += 1
# Сначала собираем левую ветку (Да / 'a'), затем правую (Нет / 'n')
node.left = parse_node()
node.right = parse_node()
# У каждого вопроса обязательно должны быть оба потомка
if node.left is None or node.right is None:
return None
else:
self.a_count += 1
return node
self.root = parse_node()
# Если структура ломается или в базе остались лишние неиспользованные строки
if self.root is None or idx != len(self.db_lines):
return False
return True