正誤表

●第7問(p47)の問題文の訂正

誤: MoveTo()関数を使って座標(0,0)に開始点を設定し、次にLineTo()関数を使って100本の連続線を「でたらめに」引くソースコードを記述してください。 引く範囲はX座標が0〜399、Y座標が0〜299とします。 また、線を引くときには2分の1の確率でMoveTo()関数を使って新たな開始点を設けてください。

実際作成しているプログラムでは、100回のループ中、2分の1の確率でMoveTo()関数もしくはLineTo()関数を実行しているために、最終的には線は100本になりません。 というわけで、問題を次のように読み替えてください。

正: MoveTo()関数を使って座標(0,0)に開始点を設定してください。 次に100回の繰り返しの中で、2分の1の確率でLineTo()関数で線を引くか、もしくはMoveTo()関数で開始点を新たに設けてください。 座標は、でたらめな位置に決めてください。 そのとき、X座標は0〜399、Y座標は0〜299の範囲におさめてください。

経緯を明かすと、そもそもこの問題はLineTo()関数で100本の線を引くだけのものだったんですが、if文による条件判断をここに含めたかったので、後でif文の処理を追加したのです。 このとき、問題に影響があることをすっかり忘れていたという次第。失礼しました。 この指摘は東京都の大木さんからいただきました。ありがとうございます。

ちなみに、しっかり100本の線を引くには、LineTo()関数の実行回数を記憶しておくなどの処理が必要となるでしょうけれど、ここでは乱数とif文の使い方がわかればよいので、興味ある人は自分で考えてみてくださいませ。

●第26問の参考のアナログ時計(p188)

第26問の参考プログラムとなっているアナログ時計について、配布プログラムではちゃんとビルドできるのに、自分でソースを入力し、ビルドしてみると「定義されていない識別子です」 というエラーが出るという指摘を、うららさんからいただきました。 まったくその通りです。ご指摘ありがとうございました。 ちなみに原因は、sin()、cos()関数を使うための1行が抜けているためです。 この1行を入力する手順は次の通りです。

まずソリューションエクスプローラで[s26]-[ヘッダーファイル]と辿り「stdafx.h」というファイルを見つけます。 これをダブルクリックするとソースウィンドウに「プロジェクト独自のインクルードファイル」という箇所が出てきます。ここに以下のリストの赤色の行を追加します。

//////////////プロジェクト独自のインクルードファイル

// 参照回数が多くかつ変更されないインクルードファイルがあれば
// 必要に応じて追加してください

#include <atlimage.h>  // CImageクラスの設定を読み込む
#include "bmpdc.h"     // CBitmapDCクラスの設定を読み込む
#include <math.h>      // sin()関数、cos()関数の宣言を読み込む

ちなみにmath.hというファイルには数学関数を呼び出すための情報が記述されていて、#includeによってこれを読み込んでおくことで、sin()、cos()関数などの数学関数が使えるようになります。 逆に、これが入っていないと、sin()、cos()関数などの数学関数は使えないという次第です。