表达式计算器-iExpr

版本更新内容

介绍

个人设计的一个表达式计算器,支持以下功能

  • 带关系运算和逻辑运算的数学表达式解析与计算
  • 支持常见数学函数
  • 表达式带变量运算,变量赋值运算
  • 支持简单求导(实现十分简单,所以支持的函数很少,但很多函数可以使用伪求导),定积分求值等运算
  • 简单逻辑表达式的解析与计算
  • 绘制函数图象
  • 打印真值表
  • 使用编程方式进行一些复杂运算

系统要求: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 表达式,可以理解为自己定义的一个自变量为 v1,v2,v3,v1,v2,v3,\dots 的函数

  • 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)

lrexpr\sum_l^r{expr}

变量自l到r(会自动转换为整数)遍历,带入expr求值(expr中应只含有一个变量),然后累加。

  • prod(expr,l,r)

lrexpr\prod_l^r{expr}

变量自l到r遍历(会自动转换为整数),带入expr求值(expr中应只含有一个变量),然后累乘。

微积分部分

  • diff((vid)=>(expr))

dexprdvid\frac{\mathrm{d}\,expr}{\mathrm{d}\,vid}

初等函数求导

  • diffi((vid)=>(expr),x0)

f(x0+step)f(x0)step\frac{f(x_0+step)-f(x_0)}{step}

使用差分计算 x0x_0 处切线斜率。默认 step=0.001

  • integ((x)=>(expr),l,r)

lrexprdx\int_l^r{expr}\,\mathrm{d}\,x

expr(单变量函数,变量名会自动选择)在 [l,r][l,r] 上的定积分模拟:精度默认值为 10610^{-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,...)

vi\bigcup v_i

并集,其中参数必须为集合类型

  • cap(v1,v2,...)

vi\bigcap v_i

交集,其中参数必须为集合类型

  • dif(v1,v2,...)

v1v2v3v_1 \setminus v2 \setminus v3 \setminus \dots

差集(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
2
3
expr1,
expr2,
...

语句语法

  • 赋值
1
2
x=1,
v=[1,2,3]

将指定名称变量赋值成右侧表达式的值,这里要求右侧表达式的值必须是能计算出确定值的表达式。

  • 独立赋值
1
2
x:=1,
v:=[1,2,3]

功能和赋值语句相同,但他会在当前环境新建变量,从而隐藏掉父级的同名变量。

  • 弱声明
1
def(id,expr)

将指定名称的变量赋成右侧的表达式,这里要求右侧表达式的值必须是常量(即可以是类似x^2这样的含变量表达式。

  • 函数块
1
func(expr1,expr2,...)

函数块会自动新定义一个名为 return 的变量(初值为 Null ),函数块的结果为依次执行 exprreturn 的值。

  • 过程块
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
2
3
4
for(begin,cond,step,expr)
while(cond,expr)
do(expr,cond)
foreach(list,varName,expr)
  • 条件
1
if(cond,then-expr,else-expr)

更多函数

  • array(n,defaultVal)

生成 nn 个元素的元组,初始值为 defaultVal (可省略,默认为空值)

  • range(l,r)

生成 [l,r][l,r] 的整数序列

  • random(l,r)

生成 [l,r)[l,r) 范围内的随机整数

  • sort(list,cmpFunc)

升序排序,cmp 转换函数(Lambda 表达式)

  • select(list,transFunc)
  • where(list,condFunc)
  • zip(list,zipFunc)

这几个函数和函数式编程中常用的三个同名函数意义相同,具体使用请参见 更多算法和例子

例子

更多算法和例子请见 这里

  • 基本计算
1
2
3
4
5
6
7
exec(
list=[1,2,3],
def(f,x^2),
s=total(list),
s,
diff(f,@"x")
)

其结果为

1
2
6
(2*(x^1))*1
  • 简单算法

快速幂计算模意义下的幂(模数较大且幂次较高时会有较大精度误差)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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将在下一版本中修复。

编程部分将有较大改动,将支持自定义函数:

预览图

0%