投稿或申请专栏请先 [ 登 陆 ] 新版进入 旧版进入
您的位置: 首页>网络编程>其他相关>正文
站内搜索
    
最新论文TOP10
·保持共产党员先进性教育心得体会
·工商局2006年度工作计划
·县交通局党委2006年工作计划
·医院工会工作总结
·2005年度医院护理工作总结
·2006年护理工作计划
·2006年度保险公司工作计划
·公路局工会副主任个人工作总结
·公路局助理工程师个人业务工作总
·市地税局1—10月份工作总结
热点论文TOP10

·小学数学论文的撰写
·毕业论文范文
·年度个人述职报告
·毛泽东思想概论心得
·寒假社会调查报告
·开题报告范文
·寒假社会调查报告
·寒假社会实践调查报告
·计算机毕业论文
·述职报告

相关论文TOP10

用Delphi编写圆周率模拟器

作者:佚名    来源:网络    时间:2005-12-8 17:18:28  浏览:

  圆周率π是个古老的东西,早在1700多年前祖冲之已将其值精确到小数点后7位,而如今通过电脑程序已能算到十亿位之多!我是个圆周率爱好者,这个“爱好”至少是出于对这个无理数的热衷,我不但可以背诵到小数点后100位,而且还收藏着从网上找到的几个计算π的程序,你有兴趣可以到我的小站nihg.yeah.net找一下。文章中的源程序以及可执行程序可以在http://www.cfan.com.cn/11program/200502/htkdma.html找到。

1.模拟器原理

  本程序并不使用计算π值的算法,它只是一个概率模拟,即在边长为200的正方形内随机产生多个点,将点以圆弧为界分开统计,由于点的个数很多,直至几乎布满整个区域。此时,点的个数就可以看作就是它所在区域的面积。可以得到如下推导:

(1)蓝色区内点个数:总个数≈蓝色面积:总面积

(2)蓝色区内点个数:总个数≈圆面积/4:总面积

(3)蓝色区内点个数:总个数≈π×200×200/4:200×200

(4)π≈ 4×蓝色区内点个数/总个数

  当然,点的位置会重复,所以结果与π值是有差别的,不过,当点足够多时,可以看到一个非常接近的结果。

2.程序设计

  打开Delphi 7,首先按照图1设计窗体(见图)。

  程序首先在Image1控件区域内画一个边长为200的正方形作为程序的演示窗口,故FormCreate事件如下:

procedure TForm1.FormCreate(Sender: TObject);
begin
  // 画亮绿色的正方形演示框
Image1.Canvas.Brush.Color:=clBlack;
Image1.Canvas.FillRect(Rect(0,0,199,199));
Image1.Canvas.Pen.Color:=cllime;
Image1.Canvas.Rectangle(0,0,199,199);

DoubleBuffered := True;
end;

接着放入一个Timer实现点的绘制以及π的计算:
procedure TForm1.Timer1Timer(Sender: TObject);
var
a,b,i,ii:longint;
pi,piok:single;
begin
// 随机产生坐标点
i:=random(200);
ii:=random(200);

if (i*i+ii*ii<40000) then
begin
// 以200为半径的圆内的点设为蓝色
Image1.canvas.Pen.Color:=claqua;
a:=StrToInt(Label1.Caption);
Label1.Caption:=IntToStr(a+1);
//显示当前点的坐标
Label6.Caption:=IntToStr(Image1.Canvas.PenPos.X);
Label7.Caption:=IntToStr(Image1.Canvas.PenPos.Y);
end
else
begin
// 超出这个区域的点都在圆外设为黄色
Image1.Canvas.Pen.Color:=clyellow;
b:=StrToInt(Label2.Caption);
Label2.Caption:=IntToStr(b+1);
end;

// 画点(长为1像素的直线)
Image1.Canvas.MoveTo(i,ii);
Image1.Canvas.LineTo(i,ii+1);

// 计算pi的值
pi:=(4*(StrToInt(Label1.Caption))/(StrToInt(Label1.Caption)+StrToInt(Label2.Caption)));
Label3.Caption:=FloatToStr(pi);
// Label4显示的是最接近真实pi的值。
piok:=StrToFloat(Label4.Caption);
//得出最接近的圆周率值 piok
if (abs(pi-3.141592653589))<(abs(piok-3.141592653589)) then
Label4.Caption:=FloatToStr(pi);
end;

  最后加入两个SpeedButton作为开始和暂停按钮,代码分别是Timer1.EnableD:=true;和Timer1.EnableD:=false;。好了,程序这样就完成了,赶快按下F9亲自模拟一下π的计算吧!

3.小结

  虽然程序并没有采用圆周率的算法,但能通过随机数对π进行逼近,而由无数点描成的美妙圆弧让我们叹为观止。其实,这样的思想可以用于许多场合,比如对某个数学定理或者自然规律进行模拟,希望这样的思路对您有所启发。

首席范文网版权与免责声明:

 
凡本网注明“来源:范文123网(范文网123)”的所有作品,版权均属于范文123网(范文网123),未经本网授权不得转载、摘编或利用其它方式使用上述作品。已经本网授权使用作品的,应在授权范围内使用,并注明“来源:范文123网”。违反上述声明者,本网将追究其相关法律责任。
凡本网注明“来源:XXX(非范文123网)”的作品,均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。
如因作品内容、版权和其它问题需要同本网联系的,请在30日内进行。