Uploaded by Ivan Goranov

Q&A

advertisement
Проект 4 (логически функции)
Въпрос:
От къде да започна?
Отговор:
Нужна е йерархия от класове, представяща операндите и операторите, чрез
която може да се изгради дърво представящо логическия израз. Всеки възел в дървото
ще има виртуално свойство Value, дефинирано в базовия клас за възел и пренаписано
във възлите операнди и оператори. Операндите ще могат да получават и съхраняват
стойност за Value (например чрез метод SetValue и скрито поле _value). Операторите
ще изчисляват Value, чрез Value стойностите на свързаните възли, които могат да са
оператори или операнди.
При команда “Define” трябва да се построи дървото съответстващо на израза, който
може да е в обратен полски запис.
Изграденото дърво трябва да се запише в колекция (най-добре речник) заедно със
зададеното име.
1. DEFINE func1(a, b): "a & b" - построява дърво с три възелa:
2. DEFINE func2(a, b, c): "func1(a, b) | c"
*Построяване на дърво от обратен полски запис е най-лесно чрез употреба на
стек.
3. SOLVE func2(1, 0, 1) - намира изграденото дърво по неговото име и чрез търсене
в дълбочина или широчина намира възлите за операндите “a”, “b” и “c” задава им
стойности съответно true, false, true (0, 1, 0) и извиква пропертито Value на
корена, което води до рекурсивно изчисление на дървото.
Въпрос:
Как да изградя дървото?
Отговор:
Една възможна реализация би изглеждала така:
1. Нужни класове:
Node { string Name; abstract bool Value { get }; }
OperandNode { override Value { get ... set ... }; , ... } // може да се задава стойност
OperatorNode { override Value; List<Node> Operands; } // изчислява своето Value чрез
Value на операндите и според типа си
2. Създаване на дърво, чрез стек и обратен полски запис (пр: DEFINE func1(a, b) a b c &
|):
- Прочита се командата - DEFINE;
- Прочита се името на функцията - func1;
- Прочитат се аргументите и се запомня техния ред за по-късно (команда SOLVE)
- Прочита се 'а' - проверява се в хештаблица има ли вече дефинирана функция с това
име, ако не проверяват се базовите функции & и |, ако не е от тях се създава нов
OperandNode и се поставя в стека;
- Прочита се 'b' -//- Прочита се 'c' -//- Прочита се '&' - съвпада с името на базова функция, създава се OperatorNode, в
неговите операнди се добавят двата възела от върха на стека, новосъздаденият възел
се поставя в стека;
- Прочита се '|' -//- Накрая в стека има само един възел - корена на дървото, което се поставя в хеш
таблицата с име func1
Въпрос:
Трябва ли задължително да има интервали между операциите и операндите или
не е задължително?
Отговор:
Не е задължително.
Въпрос:
Как да реализирам условието “Намиране на логическа функция”?
Отговор:
Нужно е да се реализира функция създаваща всички възможни дървета с
височина 1, 2, … Възможните дървета с определена височина са ограничени от вида на
възлите. Ако височината е 1, това могат да бъдат само оператори. Ако височината е 2,
това могат да са една операция или един оператор на последното ниво и същото, като
за предното дърво и тн. За генериране на вариации може да се използва
лексикографския алгоритъм от упр. 2.
Download