3.6 计算器中的内部函数

在计算器中点击“下三角”(sin的右边),弹出函数面板,移动鼠标选择内部函数,面板下有简短的说明。不用时在对话框的其它地方点击自动关闭。

jhtbhelp

表达式中支持的函数近40种,下面对一些函数的定义作进一步说明。

(1)abs(x):绝对值函数,数学格式显示时用“|x|”表示。例如:abs(-2.1)=2.1。

(2)sqrt(x),cbrt(x):算术平方根、立方根函数。例如:sqrt(4)=2,cbrt(-8)=-2。

(3)int(x),ceil(x):取整函数。int(x)是向下取整,表示求不大于x的最大整数。例如:int(3.6)=3,int(-3.2)=-4,int(-4)=-4。ceil(x)是向上取整,如ceil(3.2)=4,ceil(5)=5,ceil(-3.2)=-3。

(4)round(x):四舍五入函数,把x舍入到整数。例如:round(3.2)=3,round(-3.5)=-4,round(3)=3。将近似数3.15保留一位小数 round(3.15*10)/10=3.2。

(5)mod(a,b):取模函数,同运算符“%”,表示a除以b的余数,结果与b同号。例如:mod(22,5)=2,mod(22,-5)=-3。

(6)log(a,x):对数函数,计算以a为底的正数x的对数。log(x)同lg(x),计算x的常用对数。ln(x)计算自然对数。例如:log(2,8)=3,lg(2)+log(5)=1,ln(e^2)=2。

(7)sgn(x):符号函数,当x>0时,返回1;当x<0时,返回-1;当 x=0时,返回0。例如:sgn(2.6)=1,sgn(-4)=-1。

(8)max()与min():最值函数,分别是求若干个数的最大值与最小值,多个参数之间用“,”分隔。例如:max(1,9,2.6,Pi,-3)=9,min(e,2,3)=2。

(9)varpa():计算样本总体的方差,即各数与其平均的差的平方的平均。例如:varpa(1,2,3,4,5)=2。

(10)prime():判断质数,若是质数,值为1,否则值为0。定义域是自然数,运用它可以制作质数表。例如:prime(1)=0,prime(31)=1,prime(39)=0。

(11)spf(): 用于求大于1的自然数的最小质因数。运用它可以把合数进行质因数分解。例如:spf(1001)=7,spf(1001/7))=11,spf(1001/7/11)=13,所以1001=7*11*13。

(12)gcd():是求最大公约数函数。例如: gcd(6,8)=2,gcd(24,36,48)=12.由此还可以求最小公倍数,因为两数的最小公倍数与最大公约数之积就是两数之积。 6与8的最小公倍数为6*8/gcd(6,8)=24。 

(13)fact(n):阶乘函数,计算n!。计算中自然数n不要超过12,n>12时结果不准确。有时候,我们也会用Gamma函数来定义非整数的阶乘。

(14)if(p1,y1,p2,y2[,...,yn] ):条件分支函数

函数if( )与算法中的if-else分支结构类似,参数个数是正整数都可以。 if(p1,y1,p2,y2,y3)的求值过程是,先计算表达式p1的值,如果为真(值非0),就计算y1的值,结果就是y1的值;如果p1为假(值为0),不会计算y1,转到计算p2,若p2为真,结果是y2的值;若p2为假,结果为最后一个y3的值。多个参数两个一组,由前向后,前一个是条件,真时就返回后一个的值,假时进入下一组判断。若参数个数为奇数个,前面条件均不真时就取最后一个默认值。若个数为偶数个,每个条件均不真时就返回一个无效值(显示?号)。

if()函数用于分段函数绘制特别方便。比如绝对值函数可以写为if(t<0,-t,t==0,0,t>0,t),也可以写为if(t>=0,t,-t),当然用abs(t)最简单。再看下图中的三个例子体会此函数的运用。分段函数

(15)set(n,x):赋值函数,向第n个内置变量中赋值x。程序为您申请了1024个位置,可以存放数值,称为内部存贮器,编号从0到1023,类似于高级语言中的数组。在程序运行时就存在,关闭后消失,各页共用。

(16)get(n):读取函数,从内存单元(程序中设置了1024个供用户使用的内置变量)n中读取数值。当n为非整数时,先取其整数部分,并对1024取余,使值在0到1023之间,例如get(2049.8),表示从第1个内置变量中取出所存的实数。

逗号除了用于函数的几个参数之间,还可以作为一种运算符,依次对各部分进行计算,其结果是最后一个式子的值。如(2+3,6-4,0,2*3)的结果就是6。前面的三个式子也是计算的,结果不保存。操作内存变量时,可以一个计算式进行多个并列且有序的运算。例如:(set(1,2),set(1,get(1)+2),set(2,5),get(1)+get(2)) 的结果是9。

(17)accum(n[,x]):累加函数,把n号内置变量中的值加1[或x]。accum(n)表示把n号变量的值加1,具有计数功能;accum(n,x)表示把n号变量的值加x,“和”仍然保存在n号变量中,它合并了“读取,相加及赋值”三个函数功能。

图霸中显示时用m[n]表示n号变量,不直接用变量名,相当于用身份证号表示某人。其中“←”表示赋值, 显示的更易读。

jhtbhelp

例:新建参数s,选取它,分别加入四个计算,如上图左。拖动参数的滑块,各个函数依次分别执行求值,显示效果与输入的不一样,更直观,如上图右。思考一下,通过上述计算后,第20号变量中当前值是多少?(20)

(18)for():循环函数,有条件地重复执行一些运算。

下图是用伪代码表示的算法:

jhtbhelp

可以看到,有四个部分组成:1. 变量赋初始值 2. 循环条件 3. 循环体,4. 输出值

打开图霸的计算器,输入(可以复制粘贴):for((set(1,1),set(2,0)),get(1)<=100,(accum(2,get(1)),accum(1)),get(2))

上面的数学格式显示为:for((m[1]←1, m[2]←0), m[1]≤100, (m[2]+←m[1], m[1]+←1), m[2])

确定后可以看到表达式及输出结果。

jhtbhelp

选择表达式,【修改标签】,点选【自定义标签】,如图。按【编辑】按钮,在“数学格式文本编辑”框中可以对刚才的显示文本进行编辑,确定后保存。这只是改式子的名称,与计算值无关。

jhtbhelp

for()函数的参数有四个部分组成:

jhtbhelp

用1号和2号变量表示i和s,set(1,1)表示i=1,set(2,0)表示s=0。两句之间用逗号分隔,每一部分是一个整体,多个语句时外加小括号,即(set(1,1),set(2,0))。注意输入的不能是中文的逗号与括号。

循环条件是i≤100,在图霸中要先取出1号变量值再用逻辑运算:get(1)<=100. 小于或等于用两个符号。不能用中文的“≤”。

循环体也有两句构成,之间用逗号分隔,外加小括号:(accum(2,get(1)),accum(1))。accum()是累加函数。前一个把2号变量的值加上1号变量的值再赋给2号变量,即s←s+i;后一句将1号变量的值加1(加数为1时省略),即i←i+1。(accum(2,get(1))显示为:m[2]+←m[1]

输出变量s的值,用get(2)。 你要输出多个变量值,可以用含参数的语句。例如get(t),拖动滑块t即可显示各个值,迭代时可以看到列表。

循环中还可以再用循环,即循环的嵌套。复杂的表达式在软件“记事本”或“Notepad++.exe”中编辑好,粘贴到输入区。每个循环要确保能正常退出,循环条件不能永远为真,否则进入死循环,可以在循环体中修改循环变量的值。当然,图霸程序为了防止初学者出现错误,加上了循环次数的限制,每个循环不超过100万次。

(19)rand(x):产生[0-x)的随机数。选择一个动态参数(如下图中的t),打开计算器,添加这个函数,当参数变化时(拖动或用按钮按制),它也重新产生一个新的随机值,因为t值被定义为“新建计算”的父母。

几何图霸

(20)time(x): 取当地日期与时间。得到的是一个小数,x=0和5时,显示的小数部分要取四位,选取后,在【编辑-值精度】中修改。用这个函数可以制作走时精准的钟表。为了及时刷新时间,先添加一个参数t及它的动画。选取t后添加计算time(0)等,点击动画按钮,t的值变化,它的后代也将更新,从而重新取出系统的时间。当x为小数时先取整,再按下图求值。若仍无对应的x值,则返回0时的值。例如(对照下表的当前时间),time(2.4)=30,time(10)=16.3035。 time(11)表示把当前时间的分和秒换算成以时为单位,16时30分35秒=16.510时。x=12以分为单位,x=13以秒为单位。

函数定义如下:

例3.6.1:使用内置变量、随机函数模拟“掷骰子”试验。

1. 【新建参数】n0,整数,范围从0到1。选取它,【常用-添加-动画影音】工具,或【编辑-操作按钮-动画】,为它加入动画按钮,参数范围“从0到0”,速度为“快速”,并改名为“初始化”。

2. 选取参数n0,添加【计算】式:set(1,0)+set(2,0)+set(3,0)+set(4,0)+set(5,0)+set(6,0)。

用6个内置变量分别表示掷骰子若干次时各点数出现的次数。例如1号变量存贮的是1点出现的次数。

当点击“初始化”按钮时,n0从0变到0,虽然值没有改变,但添加的计算表达式是n0的后代,这样它要重新执行一次,向6个变量中赋值0,表示开始时骰子各个点数出现的次数均为0。以后每次重新试验时均先点此初始化按钮,就能“清零”了。表达式中的加法只是为了在一个式子中完成各个赋值,并无别的作用,也可用逗号。

3. 新建参数n,整数,范围从0到1000。选取它,添加【动画】按钮,改名为“连续抛掷”,参数范围“从0到1000”,速度为“自定义 1”。你也可改成更大的值,用于表示抛掷的次数(近似数,主要是用于引发后代的计算)。

4. 选取n,添加【计算】:accum(int(rand(6))+1)。

这是核心表达式,务必要理解。其中rand(6)表示产生一个随机数,在区间[0,6)中;int()是取整函数,能得到它的整数部分,即0,1,2,3,4,5;再加1就表示6个正整数1,2,3,4,5,6,表示骰子的6个点,它们是等可能出现的;accum(x)是累加的作用。如果x=1,则第1个变量值加1,而第1个变量是表示骰子点数为1的总数的,开始时已初始化为0。(上图中的=166就表示有166个1点。若是其它值类似。)

5. 选取n,添加【计算】:get(1),get(2),...,get(6)取出各个变量中的值,即各个点数出现的次数。比如2点出现了159次。

6. 选取上步的6个式子,新建【计算】:get(1)+get(2)+get(3)+get(4)+get(5)+get(6),显然是求出各点数的总和,即抛掷总次数,改名为N。(上图中未改名称,为了让大家看清楚,用的是自定义数学格式标签)

7. 计算频率。选取get(1)及N,添加【计算】:get(1)/N,表示1点的频率。

8. 同第7步添加其余各点的频率计算。先点“初始化”,再点击“连续抛掷”按钮。

练习:

用for()和rand()函数模拟快速掷骰子,并统计各点的频率。

 

进入下一课

返回帮助目录