プログラムの実装手順

計算ボタンをダブルクリックすると,メンバ関数の追加のダイアログがでる。 ここでOKボタンをクリックすると,次のようなOnButton1()イベントハンドラが表示される。

\framebox{
\begin{tabular}{l}
void CMonteDlg::OnButton1() \\
\{\\
\hspace{1cm} // TODO: この位置にコントロール通知ハンドラ用のコードを追加する\\
\}
\end{tabular}}

そこで,$ \{ \}$の中に試行回数$ n$を用いて$ \pi$を求めるためのプログラムを次のように書く。

=======================================================
void CMonteDlg::OnButton1()
{
//乱数発生回数の読み込み
UpdateData(TRUE);
int n = m_Edit1;
// n個の乱数を発生
int count = 0;
srand((unsigned) time(NULL));//種をまく
for (int i=1; i$ <$= n; i++){
double x = rand()/(RAND_MAX+1.0);//0から1間の乱数
double y = rand()/(RAND_MAX+1.0);
double xg = 100*x; //0から100の乱数に変換
double yg = 100*y;
//円の内側か調べる
if(x*x + y*y $ <$ 1){
count++;
}
CString temp; //乱数の表示
temp.Format("%d %1.2lf %1.2lf $ \yen$r$ \yen$n",i,x,y);
m_sEdit3 += temp;
}
double pi = 4.0*count/n; //円周率の計算
m_sEdit2.Format("%lf" ,pi);
UpdateData(FALSE);
}
=======================================================

//描画の領域確保
CWnd* h=GetDlgItem(IDC_PICTURE);
CDC* pDC=h-$ >$GetDC();
CRect r;
h-$ >$GetClientRect(&r);
//描画領域の設定
CRgn s;
s.CreateRectRgn(0,0,100,100);
pDC-$ >$SelectClipRgn(&s);
//乱数発生回数の読み込み
UpdateData(TRUE);
int n = m_Edit1;
// n個の乱数を発生
srand((unsigned) time(NULL));//種をまく
for (int i=1; i$ <$= n; i++){
double x = rand()/(RAND_MAX+1.0);//0から1間の乱数
double y = rand()/(RAND_MAX+1.0);
double xg = 100*x; //0から100の乱数に変換
double yg = 100*y;
//円の内側か調べる
if(x*x + y*y $ <$= 1){
pDC-$ >$SetPixel((int)xg,(int)yg,RGB(255,0,0));
}
else {
pDC-$ >$SetPixel((int)xg,(int)yg,RGB(0,0,255));
}
s.DeleteObject();
h-$ >$ReleaseDC(pDC);
}