版权所有。所有权利保留。
欢迎转载,转载时请注明出处:
http://blog.csdn.net/xiaofei_it/article/details/18676049
本软件特色
·可编程,程序员可以在本软件中写程序。
·支持复数和复函数,所有函数均可以在复数模式下计算。
·支持多进制实数,通常计算器只支持多进制整数,本软件还支持多进制小数。
·高精度,支持任意小数转为分数。
·有任意多的存储器可供存储数据。
更多特色请看
http://blog.csdn.net/xiaofei_it/article/details/18675175
1、基本功能
打开计算器,用户看到的界面称作计算界面。
计算界面第一行的方框是输入框,第二行的方框是输出框,第三行的方框是模式框,最底下的方框是提示框。
请按在纸上的相同格式输入结果,输入的数值表达式将显示在输入框中。
之后按=,便开始进行计算。计算完成后结果将显示在输出框中。
如果想终止运算,按终止。
模式框显示当前模式,通过设置可以改变模式。
点击“设置”可以改变实数复数模式、角度弧度模式、显示方式。关于显示方式请参见下文的“结果显示”。
提示框显示提示信息。
在数值表达式中,运算符优先级和日常的没区别。
另外乘号写作“*”,除号写作“/”,圆周率写作“pi”。
2、数值表达式
数值表达式出现在很多地方,输入框中的表达式就应该是一个合法的数值表达式。在自定义函数中,数值表达式尤为重要。数值表达式和日常计算的表达式几乎一样,优先级也几乎一样:乘方最高,乘除其次,加减最低。
另外,a^b表示a的b次方。注意乘方号的结合性,2^3^4是2^(3*4),而不是(2^3)^4。
在使用自然对数的底e时要注意,科学计数法里已经使用了e作为指数标志,所以诸如e^x应该使用exp(x)。
不论调用内置函数还是自定义函数,必须加上括号,比如sin 8应该写作sin(8)。
pi返回圆周率。ans返回上次的计算结果,复数模式下,ans只保留结果的实数部分。
一个合法表达式的例子是3*7^4*ans+pi+load(x)。
2.1 合法的数
·实数输入
实数可以有正负号,也可以加上指数,指数不能超过1000,不能小于-1000。一个实数不管有没有指数部分,都不能有空格。如果要进行多进制输入,则应加上前缀。多进制输入时,可以输入小数,但不能输入类似科学计数法的指数。前缀以数字0开头,后接一个字母(b或B表示二进制,小写字母o或大写字母O表示八进制,d或D表示十进制,h或H表示十六进制)。十六进制大于9的部分由大小写字母abcdef或ABCDEF构成。
以下是几个例子:
89.756e+900
-89.68E89
32999.7864e-87
0Hadf78.8907
0b110.00011
·复数输入
复数的实数部分和实数输入相同,虚数部分在虚数后加上i即可。比如3-7i、-8+9i,如果想单独输入虚数单位i(比如2+i),那么应该输入1i(2+i应该输入2+1i),因为计算器不把i看成数字,而把它看成一个标识符。
3、结果显示
4、保存结果
计算结束后,可以保存结果。点击“保存结果”,选择要存入的存储器即可。也可以新建存储器进行保存。第一次使用时,还没有存储器,必须新建存储器进行保存。
存储器ans保存上次的计算结果,不应人为把结果存入ans中。
5、存储器
存储器存储一些数值供用户以后使用。用户点击计算界面的“存储器”后,可以新建存储器并且存储一些数值,也可以更改现有的存储器中的数值。在自定义函数中,用户可以使用store语句把相应的值存入存储器。
在表达式中,用户可以使用load(存储器名)使用存储器中的数值。比如load(sum)+5。另外load(ans)和ans是同一个意思。
存储器名应是一个合法的标识符。
注意:在复数模式下,存储器只存储数值的实数部分。
所有数值用十进制表示时,均有50位精度,在显示时显示30位。用户可以在ans存储器中查看所有的50位。
6、标识符
合法的标识符是一个字母开头,后跟字母或数字的字符串,中间不能有符号,也不能有空格。如About、sumOf2Num均为合法的标识符。存储器名、函数名、自定义函数中的变量名都应是合法的标识符。
用户自定义的标识符不应是内置函数名、load、ans、pi以及保留字。
保留字有:function、var、if、else、for、to、step、while、break、continue、store、return等。
7、内置函数
表达式中可以调用内置函数,但是千万记住加上括号。如sin(8)、cos(8-7*9)。
点击“函数”,再点击需要调用的函数,相应的函数就出现在计算界面输入框的光标处,但后面的括号要自己补齐。某些函数有多个参数,多个参数中用逗号隔开。如root(34,5)。
输入内置函数时,计算界面的提示框会显示提示信息。
每个内置函数都可以在实数和复数两种模式下运行。在复数模式下,函数返回的值和实数模式不同,这一点要注意。比如sqrt(-1)结果是1i,而实数模式下会报错。
通常复函数都是多值的,结果的表达式中会有k,k取不同值时就得到多个结果。本软件取k为0。(软件内置文档在此处有误,以本文为主。)
复数模式下的函数是供高等院校师生和专业人员使用,普通用户几乎不需要在复数模式下使用内置函数。所以普通用户请尽量使用实数模式下的函数。
8、自定义函数
调用自定义函数时,点击“自定义函数”,再选择自定义函数,按“插入”,便会插入计算界面表达式的光标处,同时提示框内会显示您编写自定义函数时输入的描述信息。
要编写自定义函数,点击计算界面中的“自定义函数”,再点击“新建”,输入函数名和函数描述(调用自定义函数时,计算界面中的提示框中会显示函数描述,所以建议您认真填写),然后就进入函数编辑页面。
编辑函数时,函数头的函数名(具体见下文)应该与之前输入的函数名保持一致。
编辑框中只能输入一个函数(局部函数是不被支持的),如果要创建其他函数,请另外新建函数。
如果编辑框中输入了多个函数,本软件只处理第一个函数,第一个函数后的所有内容将被忽略。
计算器只存入localFun,而忽略后面的函数。
本软件不支持局部函数,此例中,用户只能把localFun作为一个新函数进行定义。
编辑函数后,点击检查,会显示编译信息。有错误时,提示信息会显示在下方,同时光标会显示在出错处的附近。
当确认没有错误后,便可以使用此函数了。
本计算器不支持函数重载,所以当您已经编写了函数max(a,b)后,就不能再编写max(a,b,c)了。
9、编写函数代码
一个函数由函数头、变量定义、函数体三部分组成,其中变量定义部分可以省略。函数支持递归调用,并且可以在计算过程中把数据存储在存储器中,也可以从存储器中读取数据。
写代码时,一切符号请使用英文标点,注释中的除外;一切字母和数字请使用英文字母和半角数字,注释中的除外。
考虑到某些手机输入法可能使用不方便,编辑代码时,编辑器中给出了许多标点和语句的快捷输入键。
您可以使用空格和tab制表符进行缩进。
一个典型的函数如下:
在使用计算器时,可以像使用内置函数那样使用自定义函数。
您打开fib函数,按“插入”,便可以把该函数插入输入框的光标位置(和内置函数操作一样)。
在计算界面输入fib(6)+fib(3)+1,按等号,便得到17。
但如果计算fib(0)将死循环,请终止。
9.1 类型
当实数模式时,所有数据、变量、函数返回值都是实数类型;当复数模式时,所有数据、变量、函数返回值都是复数类型。所以编程时无需定义类型,由具体执行环境决定。如果函数只能在复数模式中运行,那么在实数模式中运行会报错。比如:
function foo() { return 1i; }
另外许多计算器内置函数在复数和实数两种模式中计算结果不同,因此如果自定义函数中调用了内置函数,结果会不同。
function foo(x) { return sqrt(x); }
如果实数模式调用foo(-8),将会报错,但复数模式可以运行。
因此,在使用内置函数时,请特别注意当前的模式。
您编写函数时应该尽可能考虑兼容性,即让您的函数在实数复数模式下都能正确运行。
9.2 函数头
格式:funtion 函数名(参数列表)参数列表不需要类型,只需要给出变量名。如果没有参数,则空着;如果多余一个参数,参数中用逗号隔开。
这些参数是按值传入的,所以即使在函数体中,参数值发生了变化,原来的那些变量的值不会改变。
因为函数返回的只能是值,所以不需要定义返回值类型。在复数模式下,返回复数;在实数模式下返回实数。
例子:
function foo1()
function foo2(a)
function foo3(val,data,i,j)
9.3 变量定义
格式:var 变量列表;一切在函数中用到的临时变量都应该在此处定义,如果没有临时变量,则不用定义。
这里定义的变量是局部变量,只能在当前这个函数中使用。
定义以分号结尾。变量之间用逗号隔开。
var a,b;
或者
var Example1;
以下例子是错误的:
function foo(a) var b,c; var d; { ... }
不应出现两次var,应该改为
function foo(a) var b,c,d; { ... }
9.4 函数体
函数体由“{”开头,“}”结尾。由一条以上的语句构成。和绝大多数编程语言一样,基本语句以分号结尾。基本语句包括赋值语句、存储语句、返回语句、break语句、continue语句。
·赋值语句
格式:变量名=数值表达式;数值表达式在之前已经讲解过了。
写赋值语句时,别忘了最后的那个分号。
·存储语句
格式:store(数值表达式, 存储器名);如果存储器列表中没有相应的存储器,那么该存储器会被新建;如果有相应的存储器,那么该存储器的值会被覆盖。
另外,为了兼容,如果存储一个复数,则只有实数部分会被存储。这点请特别注意。
例子:
a=3.8; store(a,mem1); store(a+1,mem2); store(5*7,mem3);
运行结束后,在存储器列表中,mem1保存值3.8,mem2保存值4.8,mem3保存值35。
·返回语句
格式:return 数值表达式;程序到此即返回,下面部分不再执行。
·if语句
格式1:if (条件表达式) 语句格式2:if (条件表达式) 语句 else 语句
条件语句可以嵌套。
·条件表达式
条件表达式类似大多数编程语言。大小比较符不能连用,即1<2<3这种表达式是错误的。
优先级也类似大多数编程语言。以下是所有操作符的优先级:
最上面的具有最高优先级,最下面的具有最低优先级,处于同一行的操作符的优先级相同。
逻辑非(!)
乘方号(^)
乘除号(*、/)
加减号(+、-)
大小比较符(>、>=、<、<=、==、!=)
逻辑与(&&)
逻辑或(||)
注意:为了兼容,在复数模式下,>、>=、<、<=四个符号只比较复数的实数部分,=和!=是比较实数和虚数部分两个部分。
例子(没有实际意义)
if (!(year==2001&&year==2002)) year=year+1; else if (year/4000==0) { year=year+2; ok=0; }
·while语句
格式:while(条件表达式) 语句和绝大多数编程语言一样,此处不再讲解。
·for语句
格式:for 变量名=起始数值表达式 to 终止数值表达式 step 间隔数值表达式 语句(没有“do”,软件内置文档在此处有误,以本文为准。)
执行过程如下:
(1)计算起始数值表达式,赋给变量。
(2)计算终止数值表达式,如果变量小于等于终止数值表达式的值,跳至3;否则跳至5。
(3)执行循环体。
(4)计算间隔数值表达式,此值加上变量赋给变量本身,跳至2。
(5)执行for语句以后的语句。
注意:每次终止数值表达式和间隔数值表达式都会被重新计算,所以如果数值表达式中有变量,请尽量不要在循环体内部改变该变量的值(除非有特殊需求)。
例子:
sum=0; for i=a to b step 1 sum=sum+i;
·break和continue
while语句和for语句内部可以使用break和continue,也可以使用return。当然break和coontinue后面有一个分号。10、其他
10.1 循环体
多个语句组成循环体时,应用“{”“}”括起来。10.2 变量初始化
一切变量应该先初始化,否则值不能确定。10.3 递归调用
在函数中可以使用内置函数,也可以使用函数自身或其他自定义函数。不需要函数声明,只要运行的时候,所有被使用的函数均有明确定义即可。如果您新建一个函数,取名fib,然后把函数体设为:
您就可以使用fib进行计算了。这里有自身递归调用。
下面例子是两个函数互相递归调用。
您新建一个函数,取名foo,然后把函数体设为
然后再新建一个函数bar
这样您就可以使用foo和bar了。
注意:编辑函数的那个编辑框中只能编辑一个函数,绝对不能在一个编辑框中输入两个函数,也不能建立局部函数。
10.4 函数注释
“/*”和“*/”中间可以加入注释。例如:
/*This is an example.*/
多行注释推荐使用Java风格,即
/** * This is an example. * This is just an example. */
不支持“//”的注释。
11、如何编写好的函数
·要把函数描述写好。·为了兼容,注释尽量用英文。
·考虑输入的各种情况。如果您编写的一个函数在某些不符合要求的输入下不应继续运行,那么可以对符合要求的输入返回相应的值,对不符合要求的输入不返回值。这样,如果输入不符合要求,在函数运行结束时,由于没有返回值,计算器会报错,计算便终止了。具体请参见下文的例子。
12、有用的例子
·函数名:rand2
·描述:rand2(a,b)返回一个均匀分布于[a,b)的随机数。如果a和b中的任一个有虚数部分或a大于等于b,函数将报错。
·代码:
function rand2(a,b) { if (a==conj(a) && b==conj(b) && a<b) return rand(b-a)+a; }
·函数名:gaussian
·描述:gaussian(mu,sigma)返回一个均值为mu,标准差为sigma的高斯分布(正态分布)的随机数。如果sigma<=0,函数将报错。
·代码:
function gaussian(mu,sigma) var u1,u2,temp; { if (mu==conj(mu) && sigma==conj(sigma) && sigma>0) { /** * Since rand(1) returns a uniformly distributed random number between 0.0 (inclusive) and * 1.0 (exclusive), 1-rand(1) returns one between 0.0 (exclusive) and 1.0 (inclusive). */ u1=1-rand(1); u2=1-rand(1); /*Use Box-Muller transform to generate a standard Gaussian distributed random number.*/ temp=sqrt(-2*ln(u1))*cos(2*pi*u2); return mu+temp*sigma; } }