Объектно-ориентированное программирование. Язык Python

Содержание

Слайд 2

Зачем нужно что-то новое?

программы из миллионов строк
тысячи переменных и массивов

Э. Дейкстра: «Человечество еще

Зачем нужно что-то новое? программы из миллионов строк тысячи переменных и массивов
в древности придумало способ управления сложными системами: «разделяй и властвуй»».

Структурное программирование:

декомпозиция по задачам

человек мыслит иначе, объектами

Слайд 3

Как мы воспринимаем объекты?

существенные свойства

Абстракция – это выделение существенных свойств объекта, отличающих

Как мы воспринимаем объекты? существенные свойства Абстракция – это выделение существенных свойств
его от других объектов.

Слайд 4

Использование объектов

Программа – множество объектов (моделей), каждый из которых обладает своими свойствами

Использование объектов Программа – множество объектов (моделей), каждый из которых обладает своими
и поведением, но его внутреннее устройство скрыто от других объектов.

декомпозиция по объектам

Слайд 5

С чего начать?

Объектно-ориентированный анализ (ООА):

выделить объекты
определить их существенные свойства
описать поведение (команды, которые

С чего начать? Объектно-ориентированный анализ (ООА): выделить объекты определить их существенные свойства
они могут выполнять)

Объектом можно назвать то, что имеет чёткие границы и обладает состоянием и поведением.

Состояние определяет поведение:

лежачий человек не прыгнет
незаряженное ружье не выстрелит

Класс – это множество объектов, имеющих общую структуру и общее поведение.

Слайд 6

Модель дороги с автомобилями

Объект «Дорога»:

методы (поведение)

свойства
(состояние)

название класса

Модель дороги с автомобилями Объект «Дорога»: методы (поведение) свойства (состояние) название класса

Слайд 7

Модель дороги с автомобилями

Объект «Машина»:

свойства: координаты и скорость

все машины одинаковы
скорость постоянна
на

Модель дороги с автомобилями Объект «Машина»: свойства: координаты и скорость все машины
каждой полосе – одна машина
если машина выходит за правую границу дороги, вместо нее слева появляется новая машина

Метод – это процедура или функция, принадлежащая классу объектов.

Слайд 8

Модель дороги с автомобилями

Взаимодействие объектов:

узнать длину

свойства объектов
методы: операции, которые они могут выполнять
связи

Модель дороги с автомобилями Взаимодействие объектов: узнать длину свойства объектов методы: операции,
(обмен данными) между объектами

Схема определяет

Слайд 9

Классы

программа – множество взаимодействующих объектов
любой объект – экземпляр какого-то класса
класс – описание

Классы программа – множество взаимодействующих объектов любой объект – экземпляр какого-то класса
группы объектов с общей структурой и поведением

Класс

Данные

Методы

отличие от структур!

состояние

поведение

Поле – это переменная, принадлежащая объекту.

Слайд 10

Класс «Дорога»

class TRoad:
pass

Описание класса:

Создание объекта:

road = TRoad()

Конструктор – это метод класса,

Класс «Дорога» class TRoad: pass Описание класса: Создание объекта: road = TRoad()
который вызывается для создания объекта этого класса.

вызов конструктора

Слайд 11

Новый конструктор – добавлений полей

class TRoad:
def __init__ ( self ):
self.length

Новый конструктор – добавлений полей class TRoad: def __init__ ( self ):
= 0
self.width = 0

initialization – начальные установки

ссылка для обращения к самому объекту

оба поля обнуляются

точечная запись

road = TRoad()
road.length = 60
road.width = 3

изменение значений полей

Слайд 12

Конструктор с параметрами

class TRoad:
def __init__ ( self, length0, width0 ):

Конструктор с параметрами class TRoad: def __init__ ( self, length0, width0 ):
self.length = length0
self.width = width0

Вызов:

road = TRoad( 60, 3 )

self

автоматически

Слайд 13

Защита от неверных данных

class TRoad:
def __init__ ( self, length0, width0 ):

Защита от неверных данных class TRoad: def __init__ ( self, length0, width0

if length0 > 0:
self.length = length0
else:
self.length = 0
if width0 > 0:
self.width = width0
else:
self.width = 0

self.length = length0 if length0 > 0 else 0
self.width = width0 if width0 > 0 else 0

Слайд 14

Класс «Машина»

class TCar:
def __init__ ( self, road0, p0, v0 ):
self.road

Класс «Машина» class TCar: def __init__ ( self, road0, p0, v0 ):
= road0
self.P = p0
self.V = v0
self.X = 0

дорога, по которой едет

скорость

полоса

координата

Слайд 15

Класс «Машина» – метод move

class TCar:
def __init__ ( self, road0, p0,

Класс «Машина» – метод move class TCar: def __init__ ( self, road0,
v0 ):
...
def move ( self ):
self.X += self.V
if self.X > self.road.length:
self.X = 0

перемещение за Δt = 1

если за пределами дороги

Равномерное движение:

перемещение за одну единицу времени

Слайд 16

Основная программа

road = TRoad( 65, 3 )
car = TCar( road, 1, 10

Основная программа road = TRoad( 65, 3 ) car = TCar( road,
)
car.move()
print ( "После 1 шага:" )
print ( car.X )
for i in range(10):
car.move()
print ( car.X )

10

10
20
30
40
50
60
0
10
20
30
40

дошли до конца дороги

class TCar:
...
def move ( self ):
self.X += self.V
if self.X > self.road.length:
self.X = 0

Слайд 17

Массив машин

N = 3
cars = []
for i in range(N):
cars.append ( TCar(road,

Массив машин N = 3 cars = [] for i in range(N):
i+1, 2*(i+1)) )
for k in range(100): # 100 шагов
for i in range(N): # для каждой машины
cars[i].move()
print ( "После 100 шагов:" )
for i in range(N):
print ( cars[i].X )

Слайд 18

Что в этом хорошего и плохого?

основная программа – простая и понятная
классы могут

Что в этом хорошего и плохого? основная программа – простая и понятная
разрабатывать разные программисты независимо друг от друга (+интерфейс!)
повторное использование классов

неэффективно для небольших задач

ООП – это метод разработки больших программ!

Слайд 19

Задание

«A»: Построить класс Попугай (Parrot), который умеет говорить какую-то фразу, заранее определённую

Задание «A»: Построить класс Попугай (Parrot), который умеет говорить какую-то фразу, заранее
при описании класса.
Пример:
p = Parrot()
p.say() Привет, друзья!

«B»: Изменить класс из задания A так, чтобы фраза задавалась при создании конкретного экземпляра.
Пример:
p1 = Parrot( "Гав!" )
p2 = Parrot( "Мяу!" )
p1.say() Гав!
p2.say() Мяу!

Слайд 20

Задание

«С»: Изменить класс из задания B так, чтобы фразу можно было изменять

Задание «С»: Изменить класс из задания B так, чтобы фразу можно было
во время работы программы.
Пример:
p = Parrot( "Гав!" )
p.say() Гав!
p.newText( "Мяу!" )
p.say() Мяу!

«D»: Изменить класс из задания C так, чтобы при вызове метода say можно было задать число повторений.
Пример:
p = Parrot( "Гав!" )
p.say() Гав!
p.newText( "Мяу!" )
p.say( 3 ) Мяу! Мяу! Мяу!

Слайд 21

Задание

«E»: Изменить класс из задания D так, чтобы можно было добавлять фразы

Задание «E»: Изменить класс из задания D так, чтобы можно было добавлять
в набор фраз, которые знает попугай. При вызове метода say попугай выдаёт случайную фразу из своего набора.
Пример:
p = Parrot( "Гав!" )
p.say() Гав!
p.learn( "Мяу!" )
p.say() Гав!
p.say(3) Мяу! Мяу! Мяу!

Слайд 22

Зачем скрывать внутреннее устройство?

Объектная модель задачи:

интерфейсы

защита внутренних данных
проверка входных данных на корректность
изменение

Зачем скрывать внутреннее устройство? Объектная модель задачи: интерфейсы защита внутренних данных проверка
устройства с сохранением интерфейса

Инкапсуляция («помещение в капсулу») – скрытие внутреннего устройства объектов.

Слайд 23

Защита внутренних данных

метод есть
+ энергия
+ настроение
- голод

метод спать
+

Защита внутренних данных метод есть + энергия + настроение - голод метод
энергия
+ голод

метод играть
- энергия
+ настроение
+ голод

состояние

методы

Слайд 24

class TPen:
def __init__ ( self ):
self.__color = "000000"

Пример: класс

class TPen: def __init__ ( self ): self.__color = "000000" Пример: класс
«перо»

class TPen:
def __init__ ( self ):
self.color = "000000"

R

G

B

__color

Слайд 25

Пример: класс «перо»

class TPen:
def __init__ ( self ):
self.__color = "000000"

Пример: класс «перо» class TPen: def __init__ ( self ): self.__color =
def getColor ( self ):
return self.__color
def setColor ( self, newColor ):
if len(newColor) != 6:
self.__color = "000000"
else:
self.__color = newColor

def getColor ( self ):
return self.__color

def setColor ( self, newColor ):
if len(newColor) != 6:
self.__color = "000000"
else:
self.__color = newColor

если ошибка, чёрный цвет

метод чтения

метод записи

Слайд 26

Пример: класс «перо»

Использование:

pen = TPen()
pen.setColor ( "FFFF00" )
print ( "цвет пера:", pen.getColor()

Пример: класс «перо» Использование: pen = TPen() pen.setColor ( "FFFF00" ) print
)

установить цвет

прочитать цвет

pen.color = "FFFF00"
print ( "цвет пера:", pen.сolor )

Слайд 27

Свойство color

class TPen:
def __init__ ( self ):
...
def __getColor (

Свойство color class TPen: def __init__ ( self ): ... def __getColor
self ):
...
def __setColor ( self, newColor ):
...
color = property ( __getColor,
__setColor )

Свойство – это способ доступа к внутреннему состоянию объекта, имитирующий обращение к его внутренней переменной.

color = property ( __getColor,
__setColor )

свойство

метод чтения

метод записи

pen.color = "FFFF00"
print ( "цвет пера:", pen.сolor )

Слайд 28

Изменение внутреннего устройства

class TPen:
def __init__ ( self ):
self.__color = 0

Изменение внутреннего устройства class TPen: def __init__ ( self ): self.__color =
def __getColor ( self ):
return "{:06x}".format ( self.__color )
def __setColor ( self, newColor ):
if len(newColor) != 6:
self.__color = 0
else:
self.__color = int ( newColor, 16 )
color = property (__getColor, __setColor)

Удобнее хранить цвет в виде числа:

число

число

число

Слайд 29

Преобразование int → hex

Целое – в шестнадцатеричную запись:

"0000FF"

правильно так!

16711935 → "FF00FF"

x

Преобразование int → hex Целое – в шестнадцатеричную запись: "0000FF" правильно так!
= 16711935
sHex = "{:x}".format(x)

x = 16711935
sHex = "{:06x}".format(x)

в шестнадцатеричной системе

дополнить нулями слева

занять 6 позиций

Слайд 30

Преобразование hex → int

"FF00FF" → 16711935

sHex = "FF00FF"
x = int ( sHex,

Преобразование hex → int "FF00FF" → 16711935 sHex = "FF00FF" x =
16 )

система счисления

Слайд 31

Свойство «только для чтения»

class TCar:
def __init__ ( self ):
self.__v =

Свойство «только для чтения» class TCar: def __init__ ( self ): self.__v
0
v = property ( lambda x: x.__v )

нет метода записи

Скорость машины можно только читать:

Слайд 32

Скрытие внутреннего устройства

Инкапсуляция («помещение в капсулу»)

интерфейс (public)

внутреннее устройство (private)

Скрытие внутреннего устройства Инкапсуляция («помещение в капсулу») интерфейс (public) внутреннее устройство (private)

Слайд 33

Задание

«A»: Построить класс РядЛампочек (LampRow), который хранит состояние ряда из 8 лампочек

Задание «A»: Построить класс РядЛампочек (LampRow), который хранит состояние ряда из 8
в виде символьной строки. Цифра 0 обозначает выключенную лампочку, цифра 1 – включенную.
Свойство state скрывает внутреннюю переменную __state, которая хранит состояние лампочек. При записи нового значения проверяется, что длина строки состояния равна 8, иначе записываются все нули.
Метод show выводит на экран состояние лампочек, обозначая выключенную лампочку как минус, а включённую – как «*».
Пример:
lamps = LampRow()
lamps.show() --------
lamps.state = "10101010"
print( lamps.state ) 10101010
lamps.show() *-*-*-*-

Слайд 34

Задание

«B»: Дополните класс LampRow из задания A так, чтобы количество лампочек в

Задание «B»: Дополните класс LampRow из задания A так, чтобы количество лампочек
цепочке можно было задавать в конструкторе.
Пример:
lamps = LampRow( 6 )
lamps.show() ------
lamps.state = "101010"
print( lamps.state ) 101010 lamps.show() *-*-*-
lamps.state = "10101010" # ошибка
print( lamps.state ) 000000 lamps.show() ------

Слайд 35

Задание

«С»: Дополните класс LampRow из задания B так, чтобы лампочки могли гореть

Задание «С»: Дополните класс LampRow из задания B так, чтобы лампочки могли
одним из двух цветов – красный цвет имеет код 1 и обозначается при выводе как «*», а зелёный цвет имеет код 2 и обозначается как «о».
Пример:
lamps = LampRow( 6 )
lamps.show() ------
lamps.state = "102102"
print( lamps.state ) 102102 lamps.show() *-o*-o
lamps.state = "10201010" # ошибка
print( lamps.state ) 000000 lamps.show() ------

Слайд 36

Задание

«D»: Дополните класс LampRow из задания C так, чтобы код состояния хранился

Задание «D»: Дополните класс LampRow из задания C так, чтобы код состояния
как целое число. При этом интерфейс (способ чтения и записи свойства state) не должен измениться.
Пример:
lamps = LampRow( 6 )
lamps.show() ------
lamps.state = "102102"
print( lamps.state ) 102102 lamps.show() *-o*-o*
lamps.state = "10201010" # ошибка
print( lamps.state ) 000000 lamps.show() ------

Слайд 37

Классификации

Классификация – разделение изучаемых объектов на группы (классы), объединенные общими признаками.

Яблоко

Груша

Банан

Апельсин

базовый класс

Фрукт

классы-наследники

это

Классификации Классификация – разделение изучаемых объектов на группы (классы), объединенные общими признаками.
фрукт, у которого…

Слайд 38

Что такое наследование?

класс Двудольные
семейство Бобовые
род Клевер
горный клевер

наследует свойства (имеет

Что такое наследование? класс Двудольные семейство Бобовые род Клевер горный клевер наследует
все свойства)

Класс Б является наследником класса А, если можно сказать, что Б – это разновидность А.

яблоко – это фрукт

машина – двигатель

яблоко – фрукт

горный клевер – клевер

горный клевер – это растение рода Клевер

машина содержит двигатель (часть – целое)

Слайд 39

Иерархия логических элементов

Логический элемент

с одним входом

с двумя входами

НЕ

Объектно-ориентированное программирование – это такой

Иерархия логических элементов Логический элемент с одним входом с двумя входами НЕ
подход к программированию, при котором программа представляет собой множество взаимодействующих объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.

Слайд 40

Базовый класс

class TLogElement:
def __init__ ( self ):
self.__in1 = False
self.__in2

Базовый класс class TLogElement: def __init__ ( self ): self.__in1 = False
= False
self._res = False

можно моделировать элементы с памятью (триггеры)

поле доступно наследникам!

Слайд 41

Базовый класс

class TLogElement:
def __init__( self ):
self.__in1 = False
self.__in2 =

Базовый класс class TLogElement: def __init__( self ): self.__in1 = False self.__in2
False
self._res = False
def __setIn1 ( self, newIn1 ):
self.__in1 = newIn1
self.calc()
def __setIn2 ( self, newIn2 ):
self.__in2 = newIn2
self.calc()
In1 = property (lambda x: x.__in1, __setIn1)
In2 = property (lambda x: x.__in2, __setIn2)
Res = property (lambda x: x._res )

только для чтения

пересчёт выхода

Слайд 42

Метод calc

class TLogElement:
...
def calc ( self ):
pass

заглушка

Метод calc class TLogElement: ... def calc ( self ): pass заглушка

Слайд 43

Абстрактный класс

Абстрактный метод – это метод класса, который объявляется, но не реализуется

Абстрактный класс Абстрактный метод – это метод класса, который объявляется, но не
в классе.

Абстрактный класс – это класс, содержащий хотя бы один абстрактный метод.

все логические элементы должны иметь метод calc
метод calc невозможно написать, пока неизвестен тип логического элемента

нет логического элемента «вообще», как не «фрукта вообще», есть конкретные виды

TLogElement – абстрактный класс из-за метода calc

Слайд 44

Абстрактный класс

class TLogElement:
def __init__ ( self ):
self.__in1 = False
self.__in2

Абстрактный класс class TLogElement: def __init__ ( self ): self.__in1 = False
= False
self._res = False
if not hasattr ( self, "calc" ):
raise NotImplementedError(
"Нельзя создать такой объект!")

если у объекта нет атрибута (поля или метода) с именем calc…

создать («поднять», «выбросить») исключение

Слайд 45

Что такое полиморфизм?

греч.: πολυ — много, μορφη — форма

Полиморфизм – это возможность

Что такое полиморфизм? греч.: πολυ — много, μορφη — форма Полиморфизм –
классов-наследников по-разному реализовать метод с одним и тем же именем.

class TLogElement:
def __init__( self ):
...
def __setIn1 ( self, newIn1 ):
self.__in1 = newIn1
self.calc()

self.calc()

для каждого наследника вызывается свой метод calc

Слайд 46

Элемент «НЕ»

class TNot ( TLogElement ):
def __init__ ( self ):

Элемент «НЕ» class TNot ( TLogElement ): def __init__ ( self ):
TLogElement.__init__ ( self )
def calc ( self ):
self._res = not self.In1

наследник от TLogElement

вызов конструктора базового класса

self.In1

Слайд 47

Элемент «НЕ»

n = TNot()
n.In1 = False
print ( n.Res )

Использование:

создание объекта

установка

Элемент «НЕ» n = TNot() n.In1 = False print ( n.Res )
входа

вывод результата

Слайд 48

Элементы с двумя входами

class TLog2In ( TLogElement ):
pass

наследник от TLogElement

нельзя, он

Элементы с двумя входами class TLog2In ( TLogElement ): pass наследник от TLogElement нельзя, он абстрактный
абстрактный

Слайд 49

Элементы с двумя входами

class TAnd ( TLog2In ):
def __init__ ( self

Элементы с двумя входами class TAnd ( TLog2In ): def __init__ (
):
TLog2In.__init__ ( self )
def calc ( self ):
self._res = self.In1 and self.In2

class TOr ( TLog2In ):
def __init__ ( self ):
TLog2In.__init__ ( self )
def calc ( self ):
self._res = self.In1 or self.In2

Элемент «И»:

Элемент «ИЛИ»:

Слайд 50

Пример: элемент «И-НЕ»

elNot = TNot()
elAnd = TAnd()
print ( " A | B

Пример: элемент «И-НЕ» elNot = TNot() elAnd = TAnd() print ( "
| not(A&B) " );
print ( "-------------------" );
for A in range(2):
elAnd.In1 = bool(A)
for B in range(2):
elAnd.In2 = bool(B)
elNot.In1 = elAnd.Res
print ( " ", A, "|", B, "|",
int(elNot.Res) )

Слайд 51

Модульность

class TLogElement:
...
class TNot ( TlogElement ):
...
class TLog2In ( TLogElement ):

Модульность class TLogElement: ... class TNot ( TlogElement ): ... class TLog2In
pass
class TAnd ( TLog2In ):
...
class TOr ( TLog2In ):
...

Идея: выделить классы в отдельный модуль logelement.py.

Слайд 52

Модульность

В основную программу:

import logelement
elNot = logelement.TNot()
elAnd = logelement.TAnd()
...

Модульность В основную программу: import logelement elNot = logelement.TNot() elAnd = logelement.TAnd() ...

Слайд 53

Сообщения между объектами

class TLogElement:
def __init__ ( self ):
...
self.__nextEl =

Сообщения между объектами class TLogElement: def __init__ ( self ): ... self.__nextEl
None
self.__nextIn = 0
...
def link ( self, nextEl, nextIn ):
self.__nextEl = nextEl
self.__nextIn = nextIn

адрес следующего элемента в цепочке

номер входа следующего элемента

установка связи

Слайд 54

Сообщения между объектами

class TLogElement:
...
def __setIn1 ( self, newIn1 ):

Сообщения между объектами class TLogElement: ... def __setIn1 ( self, newIn1 ):
self.__in1 = newIn1
self.calc()
if self.__nextEl:
if self.__nextIn == 1:
self.__nextEl.In1 = self._res
elif __nextIn == 2:
__nextEl.In2 = self._res

После изменения выхода «дергаем» следующий элемент:

если следующий элемент установлен…

передать результат на нужный вход

Слайд 55

Сообщения между объектами

elNot = TNot()
elAnd = TAnd()
elAnd.link ( elNot, 1 )
print (

Сообщения между объектами elNot = TNot() elAnd = TAnd() elAnd.link ( elNot,
" A | B | not(A&B) " );
print ( "-------------------" );
for A in range(2):
elAnd.In1 = bool(A)
for B in range(2):
elAnd.In2 = bool(B)
elNot.In1 = elAnd.Res
print ( " ", A, "|", B, "|",
int(elNot.Res) )

Изменения в основной программе:

elAnd.link ( elNot, 1 )

установить связь

это уже не нужно!

Слайд 56

Задание

«A»: Постройте класс Pet (домашнее животное) с двумя скрытыми полями: __name (имя)

Задание «A»: Постройте класс Pet (домашнее животное) с двумя скрытыми полями: __name
и __age (возраст). Они должны быть доступны для чтения через свойства name и age и недоступны для записи. Метод gettingOlder увеличивает возраст на 1 год. Класс Pet – абстрактный, он имеет абстрактный метод say.
Постройте два класса-наследника – Cat (кошка) и Dog (собака).Они должны реализовать метод say.
Описания классов должны быть в отдельном модуле animals.py.
Пример: см. следующий слайд.

Слайд 57

Задание

«A»:
Пример:
from animals import *
p = Dog("Шарик", 5)
p.gettingOlder()
print( p.name + ":",

Задание «A»: Пример: from animals import * p = Dog("Шарик", 5) p.gettingOlder()
p.age, "лет")
pets = [ Cat("Мурка", 3), p ]
for p in pets:
p.say()

Шарик: 6 лет Мурка: Мяу!
Шарик: Гав!

Слайд 58

Задание

«B»: Добавьте класс Mammal (млекопитающее) – наследник класса Pet и предок для

Задание «B»: Добавьте класс Mammal (млекопитающее) – наследник класса Pet и предок
классов Cat и Dog. Он должен иметь метод run (бежать), который выводит сообщение вида «Вася побежал».
Пример:
from animals import *
pets = [Cat("Мурзик", 3),
Dog("Шарик", 5) ]
for p in pets:
p.say()
p.run()

Мурзик: Мяу!
Мурзик побежал...
Шарик: Гав!
Шарик побежал...

Слайд 59

Задание

«C»: Добавьте класс Reptilia (рептилии) – наследник класса Pet и предок для

Задание «C»: Добавьте класс Reptilia (рептилии) – наследник класса Pet и предок
новых классов Turtle (черепаха) и Snake (змея). Он должен иметь метод crawl (ползти), который выводит сообщение вида «Вася пополз…».
Пример:
from animals import *
pets = [Cat("Мурзик", 3),
Turtle("Зак", 32),
Dog("Шарик", 5),
Snake("Чаки", 2) ]
for p in pets:
p.say()
if isinstance(p, Mammal):
p.run()
if isinstance(p, Reptilia):
p.crawl()

Мурзик: Мяу!
Мурзик побежал...
Зак: ...
Зак пополз...
Шарик: Гав!
Шарик побежал...
Чаки: ш-ш-ш-ш...
Чаки пополз...

Слайд 60

Задание

«A»: Собрать полную программу и построить таблицу истинности последовательного соединения элементов «ИЛИ»

Задание «A»: Собрать полную программу и построить таблицу истинности последовательного соединения элементов
и «НЕ».
Пример:
A | B | not(A+B)
-------------------
0 | 0 | 1
0 | 1 | 0
1 | 0 | 0
1 | 1 | 0

Слайд 61

Задание

«B»: Добавить в иерархию классов элементы «И-НЕ» (TNAnd) и «ИЛИ-НЕ» (TNOr), которые

Задание «B»: Добавить в иерархию классов элементы «И-НЕ» (TNAnd) и «ИЛИ-НЕ» (TNOr),
представляют собой последовательные соединения элементов «И» и «ИЛИ» с элементом «НЕ». Построить их таблицы истинности.
Пример:
A | B | A nand B
-------------------
0 | 0 | 1
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0
A | B | A nor B
-------------------
0 | 0 | 1
0 | 1 | 0
1 | 0 | 0
1 | 1 | 0

Слайд 62

Задание

«C»: Добавить в иерархию классов элемент «исключающее ИЛИ» (TXor) и «импликация» (TImp).

Задание «C»: Добавить в иерархию классов элемент «исключающее ИЛИ» (TXor) и «импликация»
Построить их таблицы истинности.
Пример:
A | B | A xor B
-------------------
0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0
A | B | A -> B
-------------------
0 | 0 | 1
0 | 1 | 1
1 | 0 | 0
1 | 1 | 1