Exercise 2.78 ~ 2.80