Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Martin Mareš
prm2
Commits
97d5a67e
Commit
97d5a67e
authored
Apr 08, 2020
by
Martin Mareš
Browse files
Výrazy: Učesání
parent
310babe8
Changes
3
Hide whitespace changes
Inline
Side-by-side
06-vyrazy/objektove.py
View file @
97d5a67e
#!/usr/bin/python3
#
# V elementárním řešení bylo nešikovné, že implementace operátorů byla
# roztroušená po celém programu, takže přidat nový operátor vyžadovalo
# projít celý program.
#
# Zde ukazujeme, jak oddělit implementaci operátorů do samostatných tříd
# (odvozených od nějaké společné třídy Node).
#
class
Node
:
...
...
06-vyrazy/objektove2.py
View file @
97d5a67e
#!/usr/bin/python3
#
# Naše objektové řešení obsahovalo spoustu duplicitního kódu: speciálně
# všechny binární operátory měly identické metody __init__ a velmi podobné
# metody __str__ a eval.
#
# Zde se duplicit zbavíme tím, že je přesuneme do společného předka:
# třídy BinaryNode, která popisuje chování obecného binárního operátoru.
# Každý konkrétní operátor si pak pouze dodefinuje, jak se jmenuje a jaké
# funkci odpovídá.
#
class
Node
:
...
...
@@ -27,37 +37,40 @@ class BinaryNode(Node):
def
__str__
(
self
):
return
'('
+
str
(
self
.
left
)
+
self
.
op_name
+
str
(
self
.
right
)
+
')'
def
eval
(
self
):
return
self
.
eval_op
(
self
.
left
.
eval
(),
self
.
right
.
eval
())
class
AddNode
(
BinaryNode
):
op_name
=
'+'
def
eval
(
self
):
return
self
.
left
.
eval
()
+
self
.
right
.
eval
()
def
eval
_op
(
self
,
x
,
y
):
return
x
+
y
class
SubNode
(
BinaryNode
):
op_name
=
'-'
def
eval
(
self
):
return
self
.
left
.
eval
()
-
self
.
right
.
eval
()
def
eval
_op
(
self
,
x
,
y
):
return
x
-
y
class
MulNode
(
BinaryNode
):
op_name
=
'*'
def
eval
(
self
):
return
self
.
left
.
eval
()
*
self
.
right
.
eval
()
def
eval
_op
(
self
,
x
,
y
):
return
x
*
y
class
DivNode
(
BinaryNode
):
op_name
=
'/'
def
eval
(
self
):
return
self
.
left
.
eval
()
//
self
.
right
.
eval
()
def
eval
_op
(
self
,
x
,
y
):
return
x
//
y
x
=
AddNode
(
MulNode
(
NumNode
(
3
),
NumNode
(
4
)),
SubNode
(
NumNode
(
5
),
NumNode
(
6
)))
...
...
06-vyrazy/strom-vyrazu.py
View file @
97d5a67e
...
...
@@ -39,14 +39,6 @@ class Node:
x
=
Node
(
'+'
,
Node
(
'*'
,
Node
(
3
),
Node
(
4
)),
Node
(
'-'
,
Node
(
5
),
Node
(
6
)))
print
(
x
)
# x.print_tree()
# print(x.eval())
# Další úkoly:
# - doplnit unární operátory (třeba 'N' pro negaci)
# - počítání hloubky stromu
# - výpis stromu v postfixovém tvaru
# - převod postfixového tvaru na strom
# - výpis stromu v infixovém tvaru bez zbytečných závorek
# - prevod infixového tvaru na strom (*)
# print(x)
x
.
print_tree
()
print
(
x
.
eval
())
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment