これがベトナム大学院の実態だ!

Trường Đại Học Bách Khoa Thành Phố Hồ Chí Minhの大学院修士課程に社会人入学

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()

一応他の人の回答案はこちら。
f:id:k4h8:20191009172208j:plainf:id:k4h8:20191009172214j:plainf:id:k4h8:20191009172218j:plain

これをもとに実装すると、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問題をやって解散となった。