U8_3
This commit is contained in:
parent
3dff8e2b86
commit
5e8556f6e0
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user