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

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

Phân tích thiết kế giải thuật 8回目

2019年10月15日、Phân tích thiết kế giải thuậtの8回目授業が実施された。
この日は中間試験を行うことが知らされていた。
昨年度この先生の別な科目を受けたが、中間試験の日はまず試験を行い、休憩後に授業を行うという方式であった。
このため、この日も同様と考え、息せき切って教室に向かったが、予想に反し問題を解く時間となっていた。
結果として前半の1時間半ぐらいが通常の授業、休憩はなく試験の時間となった。
これであれば急いでくる必要はなかったかも。
とはいえこの日の授業でやったのとまったく同じ問題が試験に出たので来た意味はあったかな。
問題はこれだ。
f:id:k4h8:20191016113425j:plainf:id:k4h8:20191016113430j:plain
昨年度の過去問に比べて、格段に難しくなっている。大問も増えたし。
新設されたのは問4だ。
これは対策の仕様もなかったし仕方ないが、得点源となるはずだった問2、しかも配点も20%と大きいのだが、これも昨年度より大幅に難しくなっており、最後までできなかった。
翌日になって落ち着いてやってみれば、ずっと続く部分は2のx乗分の1に集約でき、2のx乗をかけなおすことで結局は1になり、単純な形となる。
プログラミング言語でやってみたところ正しいようだ。

# include
import math
#funcation
def saiki(n):
	if(n == 1):
		return 0
	else:
		return 2 * saiki(n // 2) + n + 1
def tanbun(n):
	return int((2 ** math.log2(n)) * (math.log2(n) + 1) - 1)
def toi2(limit, kansuumei):
	print("実行する関数は", kansuumei)
	num = 1
	while(num < limit):
		print(num, kansuumei(num))
		num *= 2
# main
print("中間試験問2")
max = 100
toi2(max, saiki)
toi2(max, tanbun)

惜しむらくは試験中にこの正解までたどり着けず、得点源をみすみす逃がしてしまったことだ。

Nguyên lý ngôn ngữ lập trình 7回目

2019年10月14日、Nguyên lý ngôn ngữ lập trìnhの7回目授業が実施された。
もともと告知されていたスケジュールによるとこの日からASTに入るはずであったが、FPを継続、というか前回やれなかったFPを行うこととなった。
そのFPも今回完了していないので、次回ASTに入るかどうかも怪しいところである。
しかしながら2年前より確実に授業のスピードは上がっているはずなので、次回ASTを行う可能性を見ておいた方が良いだろう。

Cấu trúc dữ liệu và giải thuật 6回目

2019年10月12日、Cấu trúc dữ liệu và giải thuậtの6回目授業が実施された。
前回の続きで、問題を解き、というか各自自宅であらかじめ解いておいた問題の答えを有志が板書する方式だ。
おそらく最初の問題は簡単だから誰でも板書できる。そう思って最後の一番難しい問題を含め全部事前にやっておいた。
ところが、最初の簡単な問題を誰も板書しようとしない。リンクドリストの指定順の物を消す関数だ。
その理由はその時はわからなかったが、ひとまず平常点アップの絶好の機会だ。
結果、100%の完全な正解ではなく、delete関数により不要となったメモリの解放を書いていなかったものの、指定の順番まで進め、リンクを付け替えるアルゴリズム自体は当たっていたので考え方そのものは合っているということで平常点に加点された。
点数は0.25点で、これは誰でも同じなようだ。正解したかどうかより、積極的に板書したことに対する勇気というかやる気に加点するということだろうか。
1日に1回しか加点しないようなので、同じ日に同じ学生が何度も板書するより、一人でも多くの学生に板書の機会を得てもらおうという仕組みだ。
意外にも、一番難しい問題に板書する学生が2名も現れたことだ。
おそらくほとんどの学生が、事前に問題をやっておいてはいないのだろう。
しかし、彼らは授業中のわずかな時間を利用して問題を完了させることができる。
とはいえさすがに10秒とかでは無理で、数分は要する。それでも十分すごいけどね。
このため最初の問題は自分以外誰も板書できなかったわけだ。
しかし最後の問題に至るまでは十分な時間があったため、その間に準備ができたということになる。
つまり彼らは頭の回転は速いのだが、事前に準備をしていない。
だから頭の回転の速さで勝負せず、事前の準備をすることで平常点獲得が可能となったわけだ。

また、大宿題1の内容が告知された。
2048とかいうネット上のゲームをc++で作るというもの。
このゲームはネット上にあるが、いわゆるネットゲームではなく、対戦とかもなく、通信機能は不要なので本来であればオフラインでも遊べるようなものだ。
締め切りはこの日から4週間後である。

さらに、定期試験の過去問も表示された。
f:id:k4h8:20191016124136j:plainf:id:k4h8:20191016124140j:plainf:id:k4h8:20191016124144j:plain

Mạng máy tính 7回目

2019年10月11日、Mạng máy tínhの授業7回目が実施された。
休憩中に先生に期末試験のことを聞いた。
持ち込みは一切不可だそうだ。
ただ、多肢選択式であり、落第者は出さない方針だそうだ。
この日をもって4章は終わったが、5章のスライドは未アップ。
次回はintra -AS routingからだ。

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問題をやって解散となった。

Cấu trúc dữ liệu và giải thuật 5回目

2019年10月5日、Cấu trúc dữ liệu và giải thuậtの5回目授業が実施された。
今までは聞いていることがほとんどだったが、この日はすべて問題を考える時間となった。
授業時間があっという間に感じられたが、疲労度もすごい。
次回も問題の続きをやるらしいので準備しておき、板書のチャンスがあれば積極的に挙手し、平常点を稼いでおきたい。

Mạng máy tính 6回目

2019年10月4日、Mạng máy tínhの授業6回目が実施された。
この日は大雨で渋滞もひどく、1時間半遅れでの入室。
が、教室に学生はたったの3名しかいない。自分を含めても4名だ。
ハメハメハ大王よろしく、雨が降ったらお休みなのだろうか。

Nguyên lý ngôn ngữ lập trình 5回目

2019年9月30日、Nguyên lý ngôn ngữ lập trìnhの5回目授業が実施された。
前回授業まではLexerを2週にわたって行うなど、予定のずれ込みがあったことから、今回はParserの2回目の実習になると思われていた。
が、この日はOOPに入った。つまり、2年前には行われていたParserの2回目の実習は行われないということになる。
それでもこれは宿題をやるうえで大きな助けになってので、この部分の予習が無駄になったとは思わないけどね。
実際、すでに宿題の締め切りはこの日の前日で終わっており、締め切りの延長もなかったのでParserをこれ以上やる必要はないということになる。
OOPの演習は言語が違うこともあり2年前とは違う内容だった。
f:id:k4h8:20191009171423j:plain
これは小テストにも出たが、オブジェクト指向の参照順である。

Nguyên lý ngôn ngữ lập trình 小テスト3カンペ

1
The declaration of class A is correct but B is wrong

2
f2
fun3
f3
fun2

3
Statement //a is correct but statement //b is wrong

4
(2) – D
(1) – C
(3) – B

5
b = (B) c;
a = (A) c;

6
b, c

7
76

8
a = new B()
c = new D()

9
print(x + y) will give the result 8
print(y * x) will give the result 15

10
a (if b is referred to a B object)
c (if b is referred to a C object}

Cấu trúc dữ liệu và giải thuật 4回目

2019年9月28日、Cấu trúc dữ liệu và giải thuậtの4回目授業が実施された。
久々に出席を取ったのと、問題を学生に当てて答えさせる場面があった。
答える学生は2名おり、1名はランダムな番号による指名によりもので、もう1名は志願者だ。
解答の度合いに応じて平常点に加算される。
この仕組みは授業開始時に明らかになったので、次回からは問題を事前にやっておき、積極的に答えるようにし、平常点を満点に近づけておきたい。

Mạng máy tính 5回目

2019年9月27日、Mạng máy tínhの授業5回目が実施された。
この日の授業もいつも通りただスライドを読み上げるだけの単調なもので出席も取らなかった。
また、宿題で同じチームとなった者のうち1名は欠席しており、打ち合わせもできなかった。

Phân tích thiết kế giải thuật 5回目

2019年9月24日、Phân tích thiết kế giải thuậtの5回目授業が実施された。
肛門にも校門にも引っかかることなく学校へ到着。
体調不良のせいか食欲もなかったので食事をする時間も必要なかった。
結局5分遅れ位で入室したが、授業がちょうど始まるかどうかのタイミングであった。
最初の1時間近くを問題演習に費やし、その後はスライドの読み上げ。