介绍
个人设计的一个表达式计算器,支持以下功能
- 带关系运算和逻辑运算的数学表达式解析与计算
- 支持常见数学函数
- 表达式带变量运算,变量赋值运算
- 支持简单求导(实现十分简单,所以支持的函数很少,但很多函数可以使用伪求导),定积分求值等运算
- 简单逻辑表达式的解析与计算
- 绘制函数图象
- 打印真值表
- 使用编程方式进行一些复杂运算
系统要求:Windows 10 秋季创意者更新(16299)
制作目的为对已学习知识的实践,以使用的方便灵活为主要目标。
由于制作时间短,本程序仍存在不少Bug,详情请见备注。
目前版本仍为测试版本,稳定性不足,还请注意程序得到的结果是否正确。
如果您想反馈Bug,我是非常欢迎的,邮箱为 stardustdl@163.com
但由于是个人业余开发者,更新周期不定,Bug修复时间不定。
外观
数学表达式
逻辑表达式
函数绘图
编程页面
下载在这里
以下为使用说明。
iExpr 使用说明
- 本说明版本:2017.12.9
- 适用软件版本:iExpr 1.3
- 下载在这里
界面介绍
iExpr 分为四个页面,分别为数学表达式,逻辑表达式,数学表达式图像,编程页面。
表达式页面头部有表达式编辑框(回车解析,Esc取消运算),其下有两栏,
- 第一栏会显示表达式计算结果(如果解析失败也会将提示信息显示在这里)。
- 第二栏会显示表达式解析结果,可以在这里检查系统解析的表达式是否符合预期。
表达式页面主体部分会提供相关扩展功能。
您切换页面时原页面中的信息会被清空,所以请保留好您需要的信息(如输入表达式)。
表达式 基本语法
()
小括号用于区分优先级与包围函数参数
@"abc"
表示其中的内容(abc)为一个整体,常用来表示预定义常量(不同表达式系统中可能有不同的预定义常量表示),有时也用于被运算者独立解析的函数参数或指定变量名。
F(arg1,arg2,...)
函数格式(F
在这里包含自定义的函数以及 Lambda 表达式,关于自定义的函数 具体请见编程部分)。注:函数的运算优先级最高
a b c d
表达式支持变量表示,首字符不为数字或运算符(函数)关键字的一般都会解析为变量,但仍强烈建议使用纯字母或字母+数字的方式表示变量。
(v1,v2,...)=>(expr)
Lambda 表达式,可以理解为自己定义的一个自变量为 的函数
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)
变量自l到r(会自动转换为整数)遍历,带入expr求值(expr中应只含有一个变量),然后累加。
prod(expr,l,r)
变量自l到r遍历(会自动转换为整数),带入expr求值(expr中应只含有一个变量),然后累乘。
微积分部分
diff((vid)=>(expr))
初等函数求导
diffi((vid)=>(expr),x0)
使用差分计算 处切线斜率。默认 step=0.001
integ((x)=>(expr),l,r)
expr
(单变量函数,变量名会自动选择)在 上的定积分模拟:精度默认值为
数论部分
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-…),其中参数必须为集合类型
求值
在代值页面点击刷新会加载当前表达式所有有意义变量(部分变量可能会在计算中被化简掉),设置变量值后点击计算会在计算结果区显示结果。
绘图
对于单变量表达式,在图像页面可以绘制其图像。
可以使用右侧按钮或鼠标滚轮放大缩小。拖动界面可移动绘图区域。
示例
- 1+(2*3-5^2)/4
- sum((x%2==0)*x,1,10)
- diffi(x=>abs(x),2)
绘图例子:
- x^3
- diffi(x=>abs(x),x)
- integ(x=>e(-x2),0,x)
逻辑表达式
运算符(优先级从低到高)
->
推出<->
等价|
或^
异或&
且!
非
常量
true,True
真false,False
假
求值
在代值页面点击刷新会加载当前表达式所有有意义变量(部分变量可能会在计算中被化简掉),设置变量值后点击计算会在计算结果区显示结果。
数学表达式图像部分
界面类似数学表达式部分的图像页面,但这里支持多个函数图像绘制。
解析器将会把每行解析为一个单变量函数,可以接受以下表达式
+ 普通单变量表达式 x^2
+ 单变量 Lambda 表达式 x=>x^2
x=>func(return=x^2)
这里的表达式解析基于下面将要提到的编程表达式,所以您可以使用丰富的编程函数构建复杂的函数。
左栏下方会显示所画的函数与颜色的对于关系,拖动右侧图像区域可以移动,支持滚轮缩放,但这会导致重新绘图,对于复杂函数可能需要等待绘图完成。
编程部分
此部分还不是很成熟,使用时请适当注意
支持数学表达式的代码式运算。点击上方按钮(或F5)即可运行,Esc键取消运行。如果有错误会在下方显示错误信息。
请使用如下语法(其中expr1,expr2,…是语句,注意用逗号分隔):
> 此版本不再需要输入 exec
函数
1 | expr1, |
语句语法
- 赋值
1 | x=1, |
将指定名称变量赋值成右侧表达式的值,这里要求右侧表达式的值必须是能计算出确定值的表达式。
- 独立赋值
1 | x:=1, |
功能和赋值语句相同,但他会在当前环境新建变量,从而隐藏掉父级的同名变量。
- 弱声明
1 | def(id,expr) |
将指定名称的变量赋成右侧的表达式,这里不要求右侧表达式的值必须是常量(即可以是类似x^2
这样的含变量表达式。
- 函数块
1 | func(expr1,expr2,...) |
函数块会自动新定义一个名为 return
的变量(初值为 Null
),函数块的结果为依次执行 expr
后 return
的值。
- 过程块
1 | action(expr1,expr2,...) |
过程块会依次执行 expr
,然后返回空值。
- 运行时函数
1 | id=(v1,v2,...)=>(expr) |
构建一个运行时函数,其参数名为 v1,v2,...
。内部代码为 expr
,结果为计算 expr
后的结果(这里可以用 func
构建 expr
)(这里运行时函数的本质就是一个 Lambda 表达式)
与赋值类似,
def
也有相对应的redef
独立声明
- 调用运行时函数
1 | id(args) |
和调用预定义函数的用法相同。
以下用法已弃用
call(fid,arg1,arg2,…)
程序控制函数
- 循环
1 | for(begin,cond,step,expr) |
- 条件
1 | if(cond,then-expr,else-expr) |
更多函数
array(n,defaultVal)
生成 个元素的元组,初始值为 defaultVal
(可省略,默认为空值)
range(l,r)
生成 的整数序列
random(l,r)
生成 范围内的随机整数
sort(list,cmpFunc)
升序排序,cmp
转换函数(Lambda 表达式)
select(list,transFunc)
where(list,condFunc)
zip(list,zipFunc)
这几个函数和函数式编程中常用的三个同名函数意义相同,具体使用请参见 更多算法和例子
例子
更多算法和例子请见 这里
- 基本计算
1 | exec( |
其结果为
1 | 6 |
- 简单算法
快速幂计算模意义下的幂(模数较大且幂次较高时会有较大精度误差)
1 | exec( |
备注
仍为测试版本,正在收集各式各样的Bug,已知Bug如下
- 绘图部分不稳定,尤其是复杂函数绘制和极大极小缩放场景
- 变量识别有漏洞
部分Bug将在下一版本中修复。
编程部分将有较大改动,将支持自定义函数: