Дело в том, что из вентилей составляют более сложные схемы, которые позволяют выполнить арифметические операции и хранить информацию. Причем схему, выполняющую определенные функции, можно построить из различных по сочетанию и количеству вентилей. Поэтому значение формального представления логической схемы чрезвычайно велико. Оно необходимо для того, чтобы разработчик имел возможность выбрать наиболее подходящий ему вариант построения схемы из вентилей. Процесс разработки общей логической схемы устройства (в том числе и компьютера в целом) таким образом становится иерархическим, причем на каждом следующем уровне в качестве «кирпичиков» используются логические схемы, созданные на предыдущем этапе.
Алгебра логики дала в руки конструкторам мощное средство разработки, анализа и совершенствования логических схем. В самом деле, гораздо проще, быстрее и дешевле изучать свойства и доказывать правильность работы схемы с выражающей ее формулы, чем создавать реальное техническое устройство. Именно в этом состоит смысл любого математического моделирования.
Логические схемы необходимо строить из минимально возможного количества элементов, что в свою очередь, обеспечивает большую скорость работы и увеличивает надежность устройства.
Алгоритм построения логических схем:
1) Определить число логических переменных.
2) Определить количество базовых логических операций и их порядок.
3) Изобразить для каждой логической операции соответствующий ей вентиль.
4) Соединить вентили в порядке выполнения логических операций.
Пример 10
Составить логическую схему для логического выражения: F=¬XvY&X.
1) Две переменные – X и Y.
2) Две логические операции: 1 3 2
¬XvY&X.
3) Строим схему, соединяя вентили в порядке выполнения логических операций:
Пример 11
Постройте логическую схему, соответствующую логическому выражению F=X&Yv¬(YvX).
Вычислить значения выражения для X=1, Y=0.
1) Переменных две: X и Y.
2) Логических операций четыре: конъюнкция, две дизъюнкции и отрицание. Определяем порядок выполнения операций:
1 4 3 2
X&Yv ¬(YvX).
3) Схему строим слева направо в соответствии с порядком выполнения логических операций:
4) Вычислим значение выражения: F=1&0v¬(0v1)=0.
Упражнение 15
Постройте логическую схему, соответствующую логическому выражению, и найдите значение логического выражения:
1) F=AvB&¬C, если A=1, B=1, C=1.
2) F = ¬(AvB&C), если A=0, B=1, C=1.
3) F =¬AvB&C, если A=1, B=0, C=1.
4) F =(AvB)&(CvB), если A=0, B=1, C=0.
5) F = ¬(A&B&C), если A=0, B=0, C=1.
6) F=B&¬Av¬B&A, если A=0, B=0.
7) F=¬(A&B&C)v(B&Cv¬A), если A=1, B=1, C=0.
Объяснение:
--- Python 3.8.3 ---
import typing
from typing import Iterable
from typing import List
from typing import Any
from typing import AnyStr
from typing import Callable
from typing import NoReturn
def _Ok(func: Callable[[Any], Any]):
def OkWrapper(*a, **kw):
r = func(*a, **kw)
if(r):
print('ok')
else:
print('Error')
return OkWrapper
class Queue:
buffer = []
_t = None
_iterPos = 0
def __init__(self, t, InitSeq : Iterable[Any] = None):
if (InitSeq != None):
self.buffer.extend(InitSeq)
self._t = t
def __getitem__(self, position):
return self.buffer[position]
def __len__(self):
return len(self.buffer)
@property
def T(self):
return self._t
@_Ok
def push(self, item):
assert isinstance(type(item), type(self._t))
self.buffer.append(item)
self._length = len(self.buffer)
return True
@_Ok
def clear(self):
self.buffer.clear()
return True
def front(self):
return self._peek(0)
@_Ok
def pop(self):
if (len(self.buffer) > 0):
self.buffer.pop(0); return True
return False
def _peek(self, itempos):
if (len(self.buffer) > 0):
return self.buffer[itempos]
print('Error: Empty Queue'); return
def CommandHandler(q: Queue, cmds: List[AnyStr]) -> NoReturn:
IsRunning = True
while IsRunning:
NewCmd = input()
Tokens = NewCmd.split(' ')
if (Tokens[0] == 'push'):
try:
q.push(q.T(Tokens[1]))
except IndexError:
print('Invalid Command')
except AssertionError:
print('Invalid pushed type')
if (Tokens[0] == 'pop'):
q.pop()
if (Tokens[0] == 'front'):
print(q.front())
if (Tokens[0] == 'size'):
print( len(q) )
if (Tokens[0] == 'clear'):
q.clear()
if (Tokens[0] == 'exit'):
print('bye')
IsRunning = False
def main():
q = Queue(int)
avCommands = ['push','pop','front','size','clear', 'exit']
CommandHandler(q, avCommands)
if __name__ == "__main__":
main()
Пояснения:
Экземпляр Queue может инициализироваться как пустой очередью, так и уже заполненной. Что бы инициализировать пустую очередь, не передавайте в конструктор InitSeq:
q = Queue(int)
Что бы инициализировать очередь с некоторыми значениями, передайте в конструктор InitSeq:
q = Queue(int, [1,2,4,5,6])
Класс Queue строго типизирован, и каждый новый элемент будет проверяться на соответствие хранимому типу, с которым был инициализирован текущий экземпляр.
В моей реализации класс Queue не поддерживает изменение хранимого типа с приведением всех хранимых значений к новому типу
В моей реализации класс Queue не поддерживает изменение хранимого типа без приведения хранимых значений
В моей реализации класс Queue не поддерживает изменение хранимого типа при пустом буфере.
В моей реализации класс Queue является итерируемым объектом (Поддерживает простой перебор в цикле for), а так же поддерживает доступ к элементу по индексу из вне.
q[index] -> q.buffer[index]
9 вроде
Объяснение: