表达式计算器-iExpr
版本更新内容
最新版介绍在这里
介绍
个人设计的一个表达式计算器,支持以下功能
- 带关系运算和逻辑运算的数学表达式解析与计算
- 支持常见数学函数
- 表达式带变量运算,变量赋值运算
- 支持简单求导(实现十分简单,所以支持的函数很少,但很多函数可以使用伪求导),定积分求值等运算
- 简单逻辑表达式的解析与计算
- 绘制函数图象
- 打印真值表
- 使用编程方式进行一些复杂运算
系统要求:Windows 10 秋季创意者更新(16299)
制作目的为对已学习知识的实践,以使用的方便灵活为主要目标。
由于制作时间短,本程序仍存在不少Bug,详情请见备注。
目前版本仍为测试版本,稳定性不足,还请注意程序得到的结果是否正确。
如果您想反馈Bug,我是非常欢迎的,邮箱为 stardustdl@outlook.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)
\sum_l^r{expr}
变量自l到r(会自动转换为整数)遍历,带入expr求值(expr中应只含有一个变量),然后累加。
prod(expr,l,r)
\prod_l^r{expr}
变量自l到r遍历(会自动转换为整数),带入expr求值(expr中应只含有一个变量),然后累乘。
微积分部分
diff((vid)=>(expr))
\frac{\mathrm{d}\,expr}{\mathrm{d}\,vid}
初等函数求导
diffi((vid)=>(expr),x0)
\frac{f(x_0+step)-f(x_0)}{step}
使用差分计算 x0x_0 处切线斜率。默认 step=0.001
integ((x)=>(expr),l,r)
\int_l^r{expr}\,\mathrm{d}\,x
expr
(单变量函数,变量名会自动选择)在 [l,r][l,r] 上的定积分模拟:精度默认值为 10−610^{-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,...)
\bigcup v_i
并集,其中参数必须为集合类型
cap(v1,v2,...)
\bigcap v_i
交集,其中参数必须为集合类型
dif(v1,v2,...)
v_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^(-x^2),0,x)
逻辑表达式
运算符(优先级从低到高)
->
推出<->
等价|
或^
异或&
且!
非
常量
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)
生成 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)
这几个函数和函数式编程中常用的三个同名函数意义相同,具体使用请参见 更多算法和例子
例子
更多算法和例子请见 这里
- 基本计算
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将在下一版本中修复。
编程部分将有较大改动,将支持自定义函数:
表达式计算器-iExpr相关推荐
- 字符串得结果!Java数组模拟栈以实现中缀表达式综合计算器,字符串表达式计算器
文章目录 数组模拟栈类 中缀表达式计算器类(测试类) 数组模拟栈类 主要实现栈的一些基本功能,以及在该场景下的功能. //先创建一个栈 class AStack {private int maxSiz ...
- 表达式计算器类的设计4(面向对象的表达式计算器7)
计算器的github下载地址:https://github.com/ljian1992/calculator 概述 把符号表和变量表中的内容保存到一个文件中,通过IO文件流,来把符号表和变量表存储到文 ...
- 安卓案例:表达式计算器
安卓案例:表达式计算器 一.运行效果 如果没有输入表达式或输入表达式有误,会弹出警告对话框:
- 基于C#语言的可编程表达式计算器设计
1. 说明: 先看看我们的成果: 网上的表达式计算器有很多,但这次我们来点,不同的,有两点: 1)用户可以编程以扩充计算器的函数 即右下角那个"添加函数按钮&quo ...
- 表达式计算器 java代码_Java实现简单的表达式计算器功能示例
本文实例讲述了Java实现简单的表达式计算器功能.分享给大家供大家参考,具体如下: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例 ...
- Qt实战项目:高精度表达式计算器Qt
高精度表达式计算器Qt 表达式计算器是一个由C++ with QT编写的应用程序.这个计算器旨在通过引入表达式计算的概念解决Windows默认计算器显示不直观的问题,提供了普通型计算器.科学型计算器的 ...
- WPF实现一个简单的多运算符表达式计算器
标题:WPF实现一个简单的多运算符表达式计算器 1.先看下效果图 首先外围给了一个grid 把他分成了两行 第一行用来显示文本框给了一个低于第二行的高度 第二行用来存按钮 窗体的大小自己去调就好了 我 ...
- 线性栈实现中缀表达式计算器
前缀表达式转后缀表达式,及后缀表达式计算器 线性栈实现中缀表达式计算器 空格插入和弹栈计算 总体源代码 线性栈实现中缀表达式计算器 方法代码: 以(10+20/2*3)/2+8为例(计算结果为28): ...
- Iphone表达式计算器
下面是用OC写的一个表达式计算器:(思路跟Android表达式计算器差不多.) 1.中缀表达式转后缀表达式 //convert infix Expression into Posfix Express ...
- 牛客 五子棋 逆波兰表达式计算器
五子棋题目 牛客上一个比较有意思的思路,只需要判断四个方向 代码 import java.util.*; public class Main{public static boolean is(char ...
最新文章
- 使用SSH连接CentOS步骤
- xcode中用pods管理第三方库转
- Resources.getResourceAsStream用法
- oracle配置ipv6_pl/sql developer通过IPV6连接oracle-阿里云开发者社区
- 服务器项目怎么连接数据库,服务器项目连接数据库配置
- docker-compose教程(安装,使用, 快速入门)
- Springboot的web开发-静态资源
- 莫比乌斯反演习题总结
- Ubuntu 16.04 安裝chrome
- 征信报告 加密文档_Secret Folder for Mac(文件加密隐藏软件)
- 将文件上载到服务器是包含本地路径,2020年初级会计师考试照片审核通过但是上传不了是怎么回事?...
- MFC控件 --- 旋转控件
- 高考全国卷导数题分类
- HashMap 与 TreeMap
- 期权希腊字母更多的含义和解释
- 着色器Encoding floats to RGBA
- Leetcode 414
- C++OpenCV去除发票中红色的印章部分实战
- 彻底解决快播不可点播方法
- 高通android逆向分析,浅谈Android高通(Qualcomm)和联发科(MTK)平台
热门文章
- 机器学习虾扯淡之线性回归No.39
- 英语语法(简单句型篇)
- python安装结巴_python jieba(结巴)小模块精讲
- ARPG游戏开发知识整理。
- 论文阅读:Which Has Better Visual Quality: The Clear BlueSky or a Blurry Animal?
- contiki 学习资料
- 大数据常见面试题总结,有问必答
- 电子邮件客户端java实现_java电子邮件客户端软件
- 微商必看:快速加微信好友的技巧
- 北师大网络教育计算机基础考试题,北京师范大学网络教育中国书法简史入学考试模拟题(单选)...