第5章 練習問題11

  • 投稿日:
  • by
  • カテゴリ:

 第5章は、エラーである。C言語では、エラー処理は非常に煩雑なコードになりがちである。C++言語のcatch、throwという仕組みは、エラー処理をうまく記述できそうだ。
 練習問題11を引用する。

 フォボナッチ数列の先頭から指定された数の値を出力するプログラムを作成する。フィボナッチ数列とは、1 1 2 3 5 8 13 21 34で始まる数列のことだ。この数列の次の値は、前の2つの値の合計である。また、int型に収まるフィボナッチ数列の最大値も割り出す。

 フィボナッチ数列を求めるプログラムは簡単である。この章はエラーの章なので、「int型に収まるフィボナッチ数列の最大値を割り出す」というところで、エラー処理を使うのだと思った。つまり、int型の足し算でオーバーフローを検出できれば、その前までに求めたフィボナッチ数列がint型に収まるフィボナッチ数列の最大値になる。でも、int型の足し算でオーバーフローの検出というのは、どうすればいいのかわからなかった。
 回答例http://www.stroustrup.com/Programming/Solutions/Ch5/e5-10.cppを見ると変なコードになっている。while (n<m)というループで、それを抜けたときのnがint型に収まるフィボナッチ数列の最大値なのだ。エッ?
 int型の最大値を超えると、値はマイナスになる(少なくともC言語の処理系では、そうだ)。その時を捕まえるというやり方のようだ。なら素直にwhile (m>0)と書いた方がいいのでは、と思って、そう修正したら、ちゃんと動いた。この解法のどこがエラー処理の章の解法なのだろう???
 この回答例にあるcatch以下の記述も、本の内容と異なっている。このあたりは、きっちりと合わせて欲しかった。