U8_3
This commit is contained in:
parent
3dff8e2b86
commit
5e8556f6e0
@ -3,8 +3,8 @@ class Node:
|
||||
def __init__(self, text: str):
|
||||
self.text = text
|
||||
self.is_question = text.endswith('?')
|
||||
self.left = None # Ссылка на левого потомка (выбор a да)
|
||||
self.right = None # Ссылка на правого потомка (выбор n нет)
|
||||
self.left = None # Ссылка на левого потомка (выбор t да)
|
||||
self.right = None # Ссылка на правого потомка (выбор f нет)
|
||||
|
||||
class ZooExpertSystem:
|
||||
# Класс для управления системой зоопарка
|
||||
@ -21,7 +21,7 @@ class ZooExpertSystem:
|
||||
|
||||
# Списки для разделенных строк входа
|
||||
self.db_lines = [] # Строки относящиеся к базе знаний (дереву)
|
||||
self.user_choices = ([]) # Строки с ответами пользователя (a или n)
|
||||
self.user_choices = ([]) # Строки с ответами пользователя (t или f)
|
||||
|
||||
def run(self):
|
||||
# контроллер запускает программу в строгом соответствии с жизненным циклом.
|
||||
@ -54,3 +54,55 @@ class ZooExpertSystem:
|
||||
except EOFError:
|
||||
pass
|
||||
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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user