版本更新内容
个人设计的一个表达式计算器,支持以下功能
系统要求:Windows 10 秋季创意者更新(16299)
制作目的为对已学习知识的实践,以使用的方便灵活为主要目标。
由于制作时间短,本程序仍存在不少Bug,详情请见备注。
目前版本仍为测试版本,稳定性不足,还请注意程序得到的结果是否正确。
如果您想反馈Bug,我是非常欢迎的,邮箱为 [email protected]
但由于是个人业余开发者,更新周期不定,Bug修复时间不定。
以下为使用说明。
iExpr 分为四个页面,分别为数学表达式,逻辑表达式,数学表达式图像,编程页面。
表达式页面头部有表达式编辑框(回车解析,Esc取消运算),其下有两栏,
表达式页面主体部分会提供相关扩展功能。
您切换页面时原页面中的信息会被清空,所以请保留好您需要的信息(如输入表达式)。
()
小括号用于区分优先级与包围函数参数
@"abc"
表示其中的内容(abc)为一个整体,常用来表示预定义常量(不同表达式系统中可能有不同的预定义常量表示),有时也用于被运算者独立解析的函数参数或指定变量名。
F(arg1,arg2,...)
函数格式(F
在这里包含自定义的函数以及 Lambda 表达式,关于自定义的函数 具体请见编程部分)。注:函数的运算优先级最高
a b c d
表达式支持变量表示,首字符不为数字或运算符(函数)关键字的一般都会解析为变量,但仍强烈建议使用纯字母或字母+数字的方式表示变量。
(v1,v2,...)=>(expr)
Lambda 表达式,可以理解为自己定义的一个自变量为 v1,v2,v3,… 的函数
x.func(args)
调用函数,对于部分支持前置参数的函数,可以这样调用,其等价于 func(x,args)
[1,2,a^2,5]
列表,用 []
包围表示这是一个列表,其中元素以 ,
分隔
{1,2,a^2,5}
无序不重集合,用 {}
包围表示这是一个集合,其中元素以 ,
分隔
(1,2,a^2,5)
定长元组,用 ()
包围表示这是一个元组,其中元素以 ,
分隔
为各表达式系统的基础
=>
Lambda 表达式定义.
层级调用list(l1,l2,...)
生成列表,参数中的单层集合会被展开。
tuple(l1,l2,...)
生成元组,参数中的单层集合会被展开。
set(l1,l2,...)
生成集合,参数中的单层集合会被展开。
len(l1,l2,...)
统计元素数目,参数中的单层集合会被展开。
val(l,index)
获取列表 l
中的第 index
项(从0开始计数)
val(l,index,newval)
将列表 l
中的第 index
项(从0开始计数)设为 newval
以下变量除特殊标明外都默认为实数类型。
+
加-
减,包含取负,注意这里优先级较低,使用x^-1时请写成x^(-1)*
乘/
除%
取模^
指数sin(x)
正弦函数cos(x)
余弦函数tan(x)
正切函数arcsin(x)
反正弦函数arccos(x)
反余弦函数arctan(x)
反正切函数log(base,val)
对数ln(val)
自然对数abs(x)
绝对值round(x)
舍入到最精确的整数ceil(x)
大于等于x的最小整数floor(x)
小于等于x的最小整数exp(x)
e的幂次sign(x)
x的符号e
自然对数的底数pi
圆周率这里主要扩展了关系运算和简单逻辑运算,它们的结果为0或1。
|
或&
且==
相等!=
不等>
大于<
小于>=
大于等于<=
小于等于eval(expr,v1,v2,...)
将expr中的变量按给出的值依次赋值(字典序),然后求值
sum(expr,l,r)
prod(expr,l,r)
diff((vid)=>(expr))
初等函数求导
diffi((vid)=>(expr),x0)
使用差分计算 x0 处切线斜率。默认 step=0.001
integ((x)=>(expr),l,r)
expr
(单变量函数,变量名会自动选择)在 [l,r] 上的定积分模拟:精度默认值为 10−6
gcd(int x,int y)
最大公因数
lcm(int x,int y)
最小公倍数
min(v1,v2,...)
最小值,其中参数可以为集合类型,嵌套集合类型会被展开
max(v1,v2,...)
最大值,其中参数可以为集合类型,嵌套集合类型会被展开
total(v1,v2,...)
总和,其中参数可以为集合类型,嵌套集合类型会被展开
mean(v1,v2,...)
平均值,其中参数可以为集合类型,嵌套集合类型会被展开
cup(v1,v2,...)
并集,其中参数必须为集合类型
cap(v1,v2,...)
交集,其中参数必须为集合类型
dif(v1,v2,...)
差集(v1-v2-v3-…),其中参数必须为集合类型
在代值页面点击刷新会加载当前表达式所有有意义变量(部分变量可能会在计算中被化简掉),设置变量值后点击计算会在计算结果区显示结果。
对于单变量表达式,在图像页面可以绘制其图像。
可以使用右侧按钮或鼠标滚轮放大缩小。拖动界面可移动绘图区域。
绘图例子:
->
推出<->
等价|
或^
异或&
且!
非true,True
真false,False
假在代值页面点击刷新会加载当前表达式所有有意义变量(部分变量可能会在计算中被化简掉),设置变量值后点击计算会在计算结果区显示结果。
界面类似数学表达式部分的图像页面,但这里支持多个函数图像绘制。
解析器将会把每行解析为一个单变量函数,可以接受以下表达式
+ 普通单变量表达式 x^2
+ 单变量 Lambda 表达式 x=>x^2
x=>func(return=x^2)
这里的表达式解析基于下面将要提到的编程表达式,所以您可以使用丰富的编程函数构建复杂的函数。
左栏下方会显示所画的函数与颜色的对于关系,拖动右侧图像区域可以移动,支持滚轮缩放,但这会导致重新绘图,对于复杂函数可能需要等待绘图完成。
此部分还不是很成熟,使用时请适当注意
支持数学表达式的代码式运算。点击上方按钮(或F5)即可运行,Esc键取消运行。如果有错误会在下方显示错误信息。
请使用如下语法(其中expr1,expr2,…是语句,注意用逗号分隔):
此版本不再需要输入
exec
函数
expr1,
expr2,
...
x=1,
v=[1,2,3]
将指定名称变量赋值成右侧表达式的值,这里要求右侧表达式的值必须是能计算出确定值的表达式。
x:=1,
v:=[1,2,3]
功能和赋值语句相同,但他会在当前环境新建变量,从而隐藏掉父级的同名变量。
def(id,expr)
将指定名称的变量赋成右侧的表达式,这里不要求右侧表达式的值必须是常量(即可以是类似x^2
这样的含变量表达式。
func(expr1,expr2,...)
函数块会自动新定义一个名为 return
的变量(初值为 Null
),函数块的结果为依次执行 expr
后 return
的值。
action(expr1,expr2,...)
过程块会依次执行 expr
,然后返回空值。
id=(v1,v2,...)=>(expr)
构建一个运行时函数,其参数名为 v1,v2,...
。内部代码为 expr
,结果为计算 expr
后的结果(这里可以用 func
构建 expr
)(这里运行时函数的本质就是一个 Lambda 表达式)
与赋值类似,
def
也有相对应的redef
独立声明
id(args)
和调用预定义函数的用法相同。
以下用法已弃用
call(fid,arg1,arg2,…)
for(begin,cond,step,expr)
while(cond,expr)
do(expr,cond)
foreach(list,varName,expr)
if(cond,then-expr,else-expr)
array(n,defaultVal)
生成 n 个元素的元组,初始值为 defaultVal
(可省略,默认为空值)
range(l,r)
生成 [l,r] 的整数序列
random(l,r)
生成 [l,r) 范围内的随机整数
sort(list,cmpFunc)
升序排序,cmp
转换函数(Lambda 表达式)
select(list,transFunc)
where(list,condFunc)
zip(list,zipFunc)
这几个函数和函数式编程中常用的三个同名函数意义相同,具体使用请参见 更多算法和例子
更多算法和例子请见 这里
exec(
list=[1,2,3],
def(f,x^2),
s=total(list),
s,
diff(f,@"x")
)
其结果为
6
(2*(x^1))*1
快速幂计算模意义下的幂(模数较大且幂次较高时会有较大精度误差)
exec(
mod=13331,
def(qpow,(a,n),
func(
return=1,
while(n>=1,
[
if(n%2==1,return=return*a%mod),
a=a*a%mod,
n=floor(n/2)
])
)
),
call(qpow,2,15)
)
仍为测试版本,正在收集各式各样的Bug,已知Bug如下
- 绘图部分不稳定,尤其是复杂函数绘制和极大极小缩放场景
- 变量识别有漏洞
部分Bug将在下一版本中修复。
编程部分将有较大改动,将支持自定义函数: