《超级画板》第八篇算法编程Word文件下载.docx

上传人:b****6 文档编号:8350400 上传时间:2023-05-11 格式:DOCX 页数:19 大小:286.23KB
下载 相关 举报
《超级画板》第八篇算法编程Word文件下载.docx_第1页
第1页 / 共19页
《超级画板》第八篇算法编程Word文件下载.docx_第2页
第2页 / 共19页
《超级画板》第八篇算法编程Word文件下载.docx_第3页
第3页 / 共19页
《超级画板》第八篇算法编程Word文件下载.docx_第4页
第4页 / 共19页
《超级画板》第八篇算法编程Word文件下载.docx_第5页
第5页 / 共19页
《超级画板》第八篇算法编程Word文件下载.docx_第6页
第6页 / 共19页
《超级画板》第八篇算法编程Word文件下载.docx_第7页
第7页 / 共19页
《超级画板》第八篇算法编程Word文件下载.docx_第8页
第8页 / 共19页
《超级画板》第八篇算法编程Word文件下载.docx_第9页
第9页 / 共19页
《超级画板》第八篇算法编程Word文件下载.docx_第10页
第10页 / 共19页
《超级画板》第八篇算法编程Word文件下载.docx_第11页
第11页 / 共19页
《超级画板》第八篇算法编程Word文件下载.docx_第12页
第12页 / 共19页
《超级画板》第八篇算法编程Word文件下载.docx_第13页
第13页 / 共19页
《超级画板》第八篇算法编程Word文件下载.docx_第14页
第14页 / 共19页
《超级画板》第八篇算法编程Word文件下载.docx_第15页
第15页 / 共19页
《超级画板》第八篇算法编程Word文件下载.docx_第16页
第16页 / 共19页
《超级画板》第八篇算法编程Word文件下载.docx_第17页
第17页 / 共19页
《超级画板》第八篇算法编程Word文件下载.docx_第18页
第18页 / 共19页
《超级画板》第八篇算法编程Word文件下载.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

《超级画板》第八篇算法编程Word文件下载.docx

《《超级画板》第八篇算法编程Word文件下载.docx》由会员分享,可在线阅读,更多相关《《超级画板》第八篇算法编程Word文件下载.docx(19页珍藏版)》请在冰点文库上搜索。

《超级画板》第八篇算法编程Word文件下载.docx

(2)以P为圆心作圆,与两圆分别交于不同于A、B的点D、E;

(3)分别以D、E为圆心作圆,,交于不同于P的点C.

(4)连接线段AB、BC、CA。

则三角形ABC为正三角形.

调用超级画板的作图函数,写出程序如下:

A=Point(1,0,A);

B=Point(2.6,0,B);

c1=CircleOfRadius(A,1,c1);

c2=CircleOfRadius(B,1,c2);

P=IntersectionOfCircle(c1,c2,1,P);

c3=CircleOfRadius(P,1,c3);

D=IntersectionOfCircle(c1,c3,1,D);

E=IntersectionOfCircle(c2,c3,2,E);

c4=CircleOfRadius(D,1,c4);

c5=CircleOfRadius(E,1,c5);

C=IntersectionOfCircle(c4,c5,1,C);

Segment(A,B,);

Segment(A,C,);

Segment(C,B,);

作圆时圆的名字常被放在圆心附近。

如果希望把圆的名字放在圆周附近,可先执行菜单命令“查看|显示选中对象的把手”,再用鼠标把名子拖到所要的位置。

上述命令运行的情形保存为文件“8-2用单位圆规作正三角形.zjz”,如图8-2。

图8-2

[习题8-1]写出计算圆台表面积的函数程序并运行实例。

[习题8-2]写出画三角形的外接圆和内切圆的程序并运行。

二条件语句

在超级画板提供的编程环境中,条件语句的一般格式是:

if(A){B}else{C}

这里A是条件,B是A成立时要执行的一些语句,C是A不成立时要执行的一些语句.

在花括弧内的B和C,也可以是条件语句.

比起一般的伪代码,超级画板提供的编程环境省略了(A)和{B}之间的“then”。

例2编写求一元二次方程

的实根的函数程序.

解先判断是否有实根,有实根时再用公式求根.函数定义如下:

root(a,b,c,i)

{d=b^2-4*a*c;

if(d<

0){No;

}

else{if(i==1){(-b+d^(1/2))/(2*a);

else{(-b-d^(1/2))/(2*a);

}}}

若无实根返回“No”;

有实根则当i=1,2时分别给出两根.

注意,判断条件i=1要写成i==1,以区别于赋值语句。

执行后返回:

root(a,b,c,i)#

若方程为

执行情形为:

root(1,-3,2,1);

2#

root(1,-3,2,2);

1#

无实根的情形如:

root(1,1,2,1);

No#

利用条件语句,可以定义分段函数。

例2的实际运行见文件“8-3解一元二次方程.zjz”,如图8-3。

图8-3

例3符号函数sgn(x)的定义是:

x>

0时sgn(x)=1,x<

0时sgn(x)=-1,x=0时sgn(x)=0)。

编写程序来定义sgn(x)。

解由sgn(x)的定义可得:

sgn(x){if(x==0){0;

else{if(x>

0){1;

}else{-1;

}}}

请执行并检验是否正确.

将上列程序略加改动,可以定义其他分段函数.

例4设m(a,b,c)是a,b,c三个实数中最小者,写出计算m(a,b,c)的程序.

解显然有

m(a,b,c){if(a<

b){if(a<

c){a;

}else{c;

}}

else{if(b<

c){b;

}}}

也可以先定义一个函数从两个数中选出较小的,再用复合函数求出三个或4个数中最小的数来.例如,一次执行下列四行程序:

m(a,b){if(a<

b){a;

}else{b;

}}

m3(a,b,c){m(m(a,b),c);

m4(a,b,c,d){m(m(a,b),m(c,d));

m5(a,b,c,d,e){m(m(a,b),m3(c,d,e));

就分别定义了从2、3、4、5个数中选出最小数的函数.若直接编写从5个数中选出最小数的函数的程序,要费事得多.可见函数概念多么有用。

有了m5,一下就能写出从25个数中选出最小数的程序!

有了求最小数的程序m(a,b,c),容易写出求最大数的程序M(a,b,c):

M(a,b,c){-m(-a,-b,-c);

运行一下,看效果如何?

上列两例的运行保存为文件“8-4条件语句1.zjz”,如图8-4。

图8-4

例5设m,n是两个整数且m>

0,写出函数程序计算用m除n的余数.也就是满足条件:

n=qm+r(q,r是整数,0≤r<m)

的r.

此函数一般记作Mod(m,n),叫做模n求余函数.超级画板有此内置函数,为避免重名,

我们将它取名为mod1.

解函数floor(x)表示不大于x的最大整数.利用它容易写出:

mod1(n,m){m*(n/m-floor(n/m));

请执行并用算例检验.

例6闰年的2月是29天,比平年的2月多1天.判断某一年是不是闰年,先看此年份能否被4整除,不能整除就是平年;

能被4整除但不能被100整除则为闰年;

能被100整除时若又能被400整除则为闰年,否则是平年.写出根据年份判断是否闰年的程序,并用来检验下列年份是否闰年:

1816,1994,1800,2000.

解调用函数Mod(m,n)或floor(x),都可以检验年份能否被4,100,400整除。

程序为:

Rn(m){if(m/4–floor(m/4)>

else{if(m/100-floor(m/100)>

0){Yes;

else{if(m/400-floor(m/400)==0){Yes;

else{No;

}}}}

执行后检验:

运行Rn(1816);

Rn(1994);

Rn(1800);

Rn(2000);

分别返回Yes,No,No,Yes.

如果用函数Mod(m,n),则程序显得简单些:

Rn(m){if(Mod(m,4)>

else{if(Mod(m,100)>

0){Yes;

else{if(Mod(m,400)==0){Yes;

例5和例6的运行记录保存为文件“8-5条件语句2.zjz”,如图8-5。

图8-5

[习题8-3]写出求5个数的中位数的程序。

[习题8-4]能否不用条件语句,利用函数sign(a,b)直接写出计算余数的表达式和判断闰年的函数?

三循环语句

超级画板中的循环语句,主要有for语句和while语句。

while语句比较灵活,格式为

while(条件){一些语句}

当条件满足时就顺次执行花括弧中的语句,每执行一轮就检查一次条件,当条件不满足时就退出循环,跳过花括弧执行后面的语句。

用While语句可以实现各种循环过程,不论是否预先知道循环次数都行。

例7用while语句编写求两个正整数a,b的最大公约数的程序.

解在第一篇中,曾用更相减损法写出求最大公约数的函数gcd(a,b),程序如下:

gcd(a,b){while(a>

b||a<

b)

{if(a>

b){a=a-b;

}else{b=b-a;

这里“||”是逻辑连接词“或”,条件(a>

b)即“a>

b或a<

b”,也就是a和b不相等之意。

当a=b时,循环结束。

执行后,返回的是最后一次循环后的a或b的值:

gcd(56,35);

gcd(273,147);

21#

gcd(7267,6192);

43#

若用欧几里得辗转相除法,程序如下:

gcd(a,b)

{if(a<

b){c=b;

b=a;

a=c;

while(a*b>

0)

{c=b;

b=Mod(a,b);

}}

这里第一行程序的意思是若a<

b则将a、b的值互换,使得以后总保持a不小于b。

这样,就可以将a除以b得到更小的余数。

例7的运行情形保存为文件“8-6循环语句求最大公约数.zjz”,如图8-6。

图8-6

例8用while语句编写程序计算小于n(n>

1)的正奇数的平方和。

解用S(n)记所求的和,有

S(n){k=-1;

s=0;

while(k+2<

n){k=k+2;

s=s+k^2;

}}

执行后计算几个例子:

S(4);

10#

S(10);

165#

S(100);

166650#

S(1000);

166666500#

例9用1000块正方体的积木,垒一个金字塔,自上而下第n层用

块积木,问最多能垒几层?

用while语句编程计算。

解从1000中依次减去1,4,9,…,到不够减时,返回减的次数;

程序为

m=1000;

n=1;

while(n^2==m||n^2<

m){m=m-n^2;

n=n+1;

n-1;

执行后返回13.

其中条件(n^2=m||n^2<

m)即

小于或等于m之意.

若有m块积木,则金字塔的层数c(m)为:

c(m){n=1;

}

执行c(30000)得44,可见30000块积木最多能垒44层。

上面两例运行情形见文件“8-7用while循环语句求和.zjz”,如图8-7。

图8-7

例10编写一个程序,判断正整数n(n>

2)是不是素数.

解如果n不是素数,则有两个大于1的正整数a和b,满足ab=n。

a和b中较小的一定不超过

.因此,只要检验n是否有不超过n^(1/2)的因子即可.由此编出程序:

p(n){if((n-2)*(n-3)==0){prm;

else{if(Mod(n,2)==0){2;

else{k=3;

while(Mod(n,k)>

0&

&

k*k<

n)

{k=k+2;

if(Mod(n,k)==0){k;

}else{prm;

}}}}}

其中“&

”为联结词“且”,“A&

B”意即条件A和B同时成立.

此程序当n为素数时返回“prm”,否则返回n的最小素因子.例如:

p(35);

5#

p(127);

prm#

p(91);

例11一个正整数被3除余2,被5除余3,被7除余6,编写程序求出此数的最小值.

解从6开始,不断加7,每次检查是否被5除余3且被3除余2,满足时即为所求.程序如下:

n=6;

while((Mod(n,5)-3)^2+(Mod(n,3)-2)^2>

0){n=n+7;

如果要求被3除余a,被5除余b,被7除余c,写成函数就是:

ty357(a,b,c){n=c;

while((Mod(n,5)-b)^2+(Mod(n,3)-a)^2>

此函数要求a、b、c是分别小于3、5、7的正整数.执行后,运行下列命令得到:

ty357(2,3,4);

53#

ty357(2,4,3);

59#

ty357(1,2,3);

52#

更一般情形,如果要求被m除余a,被n除余b,被p除余c,写成函数就是:

ty(m,n,p,a,b,c){x=c;

while((Mod(x,m)-a)^2+(Mod(x,n)-b)^2>

0){x=x+p;

 

此函数要求a、b、c是分别小于m、n、p的正整数,且m、n、p两两互素.

执行后,运行下列命令得到:

ty(11,13,7,8,6,3);

591#

ty(12,5,11,9,2,7);

117#

例11原题的算法,可以改进为:

从6开始,不断加7,每次检查是否被5除余3,满足后每次加5×

7=35,每次检查是否被3除余2,满足时即为所求.程序如下:

n=6;

while(Mod(n,5)!

=3){n=n+7;

while(Mod(n,3)!

=2){n=n+35;

这里“!

”是否定连接词,“!

=”就是“不等于”。

写成一般的函数就是:

tynew(m,n,p,a,b,c){x=c;

while(Mod(x,m)!

=a){x=x+p;

while(Mod(x,n)!

=b){x=x+p*m;

tynew(3,5,7,1,2,3);

tynew(13,8,9,2,5,3);

93#

想一想,算法tynew比ty好在哪里?

例12抛掷一枚均匀的色子,出现1、2、3、4、5、6点的机会是一样的.所以当抛掷次数很多时,出现5点的频率应当接近1/6;

请编写一个程序模拟抛掷色子的过程,并计算出现5点的频率.

解在超级画板提供的编程环境中,有一个随机函数rand(a,b),它能够产生a到b之间的随机数.取a=1,b=7,用floor(rand(1,7))=5表示出现5点.抛掷100次的模拟程序为:

k=0;

s=0;

while(k<

100)

{k=k+1;

if(floor(rand(1,7))==5){s=s+1;

s/100;

一般说来,抛掷n次,出现a点的频率为:

se(n,a){k=0;

{k=k+1;

s/n;

执行后再运行下列命令,可得模拟抛掷10000次出2点的频率:

se(10000,2);

(102)/(625)=0.1632#

不过,你做的可能不是这个结果。

如果要求抛掷n次中点数大于a的频率,函数要改写为:

se1(n,a){k=0;

if(floor(rand(1,7))>

a){s=s+1;

执行后再运行下列命令,可得模拟抛掷1000次中点数大于3的频率:

se1(1000,3);

(517)/(1000)=0.517#

例12的运行情形见文件“8-9模拟掷色子.zjz”,如图8-8。

图8-8

在本书第六篇中,曾用嵌套测量的方法,对掷色子进行过模拟。

注意将两种方法比较,会对程序的编写有更好的理解。

上面的6个例子,都使用了while语句。

其中有些问题,如例8和例12,循环的次数可以事先确定,就可以用for语句.超级画板编程环境中的for语句格式为:

for(i=a;

i<

b;

i=i+d){S}

其中圆括弧中的i是循环变量,也可以用其它字母表示循环变量.i=a表示i的值从a开始,a为初值;

i<

b说明了i的上限为b;

i=i+d表示i每次加d,d为步长.花括弧中的S表示一些语句,叫做循环体.程序对每个i的值顺次执行循环体中的语句.

例13用for语句编写程序计算所有小于100的正奇数的倒数和。

解循环变量的初值为1,上限为100,步长为2.程序为:

for(k=1;

k<

100;

k=k+2){s=s+1/k;

执行后返回为:

(2908397099990131201)/(990000000000000000)=2.93777#

计算所有小于n的正奇数的倒数和的函数程序为:

sq(n){s=0;

k<

n;

k=k+2){s=s+1/k;

用此函数求所有小于1000的正奇数的倒数和:

sq(1000);

(4084970086409177269)/(999000000000000000)=4.08906#

例14用for语句编写模拟抛掷均匀硬币并计算n次中出现正面的频率的函数程序.

解用rand(0,2)>

1表示一次抛掷出现正面,所要的程序为:

Z(n){s=0;

for(k=0;

k=k+1){if(rand(0,2)>

1){s=s+1;

s/n;

执行后再运行下列命令,可得模拟抛掷1000次中出正面的频率:

Z(1000);

(503)/(1000)=0.503#

(521)/(1000)=0.521#

我们看到,每次模拟结果可能不同。

上述两例运行情形见文件“8-10用for循环语句编程.zjz”,如图8-9。

图8-9

用二分法计算函数的零点,是新课标高中数学教学内容之一。

下面给出的二分法的程序,能够同时画出直观的图像.

例20编写用二分法求函数零点的程序,求函数

的零点.

解令f(x)=

则f(-1)<

0,f(0)>

0,在0到1之间必有f(x)的零点.用二分法求此零点的程序和执行情形如下:

Float

(1);

(此行单独执行!

计算结果显示浮点数#

f(x){e^x+x;

a=-1;

b=0;

u=f(a);

v=f(b);

while(u*v<

b-a>

0.000001)

{c=(a+b)/2;

w=f(c);

if(w==0){u=w;

else{if(u*w<

0){v=w;

b=c;

else{u=w;

(a+b)/2;

执行后得到:

f(x)

-(1134285926818847)/(2000000000000000)=-0.567143#

结果精确到小数点后6位.

上述程序可以写成函数形式:

eff(a,b,d){u=f(a);

d)

else{if(u*w<

执行后,如果要计算方程

在1到2之间的根精确到4位小数,可以运行:

f(x){x^3-x-1;

eff(1,2,0.0001);

返回为:

f(x)

(43409)/(32768)=1.32474#

上面的程序运行记录保存为文件“8-11二分法.zjz”,如图8-10。

图8-10

为了使学生更好地理解二分法,需要在求根的同时画出函数曲线和二分法过程图。

程序可以改进为计算的同时也画图:

effh(a,b,d){

Function(t,f(t),t,a-1,b+1,50,);

u=f(a);

x=Point(a,0,,,,1);

y=Point(a,u,,,,1);

Segment(x,y,);

Hide(y);

x=Point(b,0,,,,2);

y=Point(b,v,,,,2);

i=3;

w=u;

while(u*v<

(b-a>

d&

abs(w)>

d))

{c=(a+b)/2;

x=Point(c,0,,,,i);

y=Point(c,w,,,,i);

Hide(y);

i=i+1;

if(u*w<

if(b-a<

d){(a+b)/2;

effh(a,b,d)#

运行下列命令,图像同时出现:

f(x){x^3/27-x/3-0.6;

effh(3,6,0.01);

f(x)

(117)/(32)=3.65625#

程序运行情形见文件“8-12二分法并画图.zjz”,如图8-11。

图8-11

为了看起来清楚,程序中用语句“Hide(y);

”隐藏了曲线上的点,并且给近似值编了号。

程序当二分区间长度小于预给的值或区间中点的函数值小于预给的值时结束。

返回零点的近似值。

[习题8-5]能否用for循环语句编写求最大公约数的程序?

[习题8-6]能否用for循环语句编写求函数零点的二分法的程序

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2