Nguyên lý ngôn ngữ lập trình 6回目
2019年10月7日、Nguyên lý ngôn ngữ lập trìnhの6回目授業が実施された。
前回行ったOOPの問題の続きから。
てっきりこの日はFPだけだと思ってたんで、この日の授業開始前までに残りの問題は全部終わらせてしまっていた。
なので即提出だ。
自分が作ったソースコード
''' python Tutorial3_OOP_Q3.py ''' # class class Expr(): pass class Var(Expr): def __init__(self, name): self.name = name self.num = 1 class Number(Expr): def __init__(self, num): self.num = num def print(self): print(round(self.num, 5)) class UnOp(Expr): def __init__(self, operatier, arg): pass class BinOp(Expr): def __init__(self, operatier, left, right): self.operatier = operatier self.left = left self.right = right def eval(self): if(type(self.left) == BinOp): self.left = self.left.eval() if(type(self.right) == BinOp): self.right = self.right.eval() if(self.operatier == '+'): return Number(self.left.num + self.right.num) elif(self.operatier == '-'): return Number(self.left.num - self.right.num) elif(self.operatier == '*'): return Number(self.left.num * self.right.num) elif(self.operatier == '/'): return Number(self.left.num / self.right.num) else: raise Exception("operatier is not correct") # function # main v = Var("x") op1 = BinOp("+", Number(1), v) op1.left.print() op1.eval().print() t = BinOp("*", BinOp("+",Var("x"),Number(0.2)), Number(3)) t.eval().print() t = BinOp("/", BinOp("+",Var("x"),Number(0.02)), BinOp("-",Var("x"),Number(1.23))) t.eval().print()
一応他の人の回答案はこちら。
これをもとに実装すると、class Var(Expr)とclass Number(Expr)にもメソッドが追加になる。
どっちがいいかわからなくなったが、こうすればエラーなく実行できる。
''' python Tutorial3_OOP_Q3_tanin.py ''' # class class Expr(): pass class Var(Expr): def __init__(self, name): self.name = name self.num = 1 def eval(self): return Number(self.num) class Number(Expr): def __init__(self, num): self.num = num def eval(self): return Number(self.num) def print(self): print(round(self.num, 5)) class UnOp(Expr): def __init__(self, operatier, arg): pass class BinOp(Expr): def __init__(self, operatier, left, right): self.operatier = operatier self.left = left self.right = right def eval(self): if(self.operatier == '+'): return Number(self.left.eval().num + self.right.eval().num) elif(self.operatier == '-'): return Number(self.left.eval().num - self.right.eval().num) elif(self.operatier == '*'): return Number(self.left.eval().num * self.right.eval().num) elif(self.operatier == '/'): return Number(self.left.eval().num / self.right.eval().num) else: raise Exception("operatier is not correct") # function # main v = Var("x") op1 = BinOp("+", Number(1), v) op1.left.print() op1.eval().print() t = BinOp("*", BinOp("+",Var("x"),Number(0.2)), Number(3)) t.eval().print() t = BinOp("/", BinOp("+",Var("x"),Number(0.02)), BinOp("-",Var("x"),Number(1.23))) t.eval().print()
そんなこともあり、もともとこの日はFPのはずだったが、結局OOPの続きが大半で、最後にFPのscala問題をやって解散となった。