一个实用的公式计算器

来源:互联网 发布:福特级航母知乎 编辑:程序博客网 时间:2024/04/29 08:42

      说明:已经把下载文件转移到http://www.shaohui.org/exprcalc.html了. 

  两年以前在学校的时候,做了一个表达式求解的程序,是用C写的DOS环境下运行的程序,而现在用DOS的人在这个世界上已经差不多绝迹了。所以,实际上这个程序已经失去 了它的意义.最近,由于需要做一个计算器,而我发现以前的程序功能已经足够强大了,我把以前的代码做了一个小小的改动,用BCB做了一个图形界面,于是现在你所看到的公式计算器就诞生了。

      由于各种实际的原因,我不便于公布该程序现在的源代码.如果确实需要,请参考http://blog.csdn.net/shaohui/archive/2004/11/05/168323.aspx, 核心的代码我没有作一行改动,只是做了个图形界面,增加使用变量的功能.

      该软件为绿色软件,不需要安装,也不会修改你的注册表。

      你可以到以下地址下载该软件

http://www.freewebs.com/zhengsh/download/ExprCalc.rar
http://geostar.3322.org/soroc/downloads/ExprCalc.rar   

公式计算器使用说明

 

1         该程序能够识别大多数数学运算符号 

+ 加

- 减

* 乘

/ 除

^ 乘方开方

% 取余  

注意:绝对值符号||不能够使用,有专门的函数fabs或者abs求绝对值

    不能够用点号代替乘号例如1*2不能够写成1.2

 

2. 该程序能够识别大多数数学函数(29个)  

 

函数名称

内部表示

说明

arcsin

A

反正弦

arccos

B

反余弦

arctan

C

反正切

arcctg

D

反余切

arcsec

E

反正割

arccsc

F

反余割

arctg

C

反余切

asin

A

arcsin

acos

B

arccos

atan

C

反正切

actg

D

反余切

asec

E

反正割

acsc

F

反余割

fabs

G

绝对值

exp

H

指数函数

cos

I

余弦

ctg

J

余弦

tan

K

正切

sec

L

正割

csc

M

余割

cth

N

双曲正割

sin

O

正弦

abs

G

绝对值

tg

K

正切

ln

P

自然对数

sh

Q

双曲正弦

th

R

双曲余弦

ch

S

双曲余割

log

T

对数

 

3   可以识别常数e和圆周率pi  

   不区分大小写,也就是说你写成pi,PI,pI,Pi都是等效果的

 

4 .可以识别省略的乘号 

乘号在大多数情况下都可以省略.

 列如3*(3+4) 可以这样输入 33+4  

3*sin(pi/4) 可以这样输入 3sin(pi/4);  

(3+4)*(3+4) 可以这样输入(3+4)(3+4)  

 

5.函数的输入可以数学上一样省略括号(以任意数为底数的对数函数除外)  

列如sin(pi) 可以这样输入 sinpi  

 

6.小于1的小数可以省略小数点前的0  

列如0.123 可以这样输入 .123  

0.2 * 0.3 可以这样输入 .2*.3

7.对数函数的输入格式log(底数,真数),ln真数

   如:log(e,3.3)

    lne

8.可以识别正负号(不是加减)  

 如:-3+4  

   +4+(-4+4)  

 

9.能够识别几乎所有的合法的运算符号的函数的组合  

如:sin cos tan sin(pi/4)  

log(e,cos(pi/4))  

log(lne^2,log(10,log(e,e^100)))

10.支持用户自定义变量(新功能)

注意

    为了便于和函数相互区别,用户自己定义的变量都要求以下划线‘_开头。

    变量只能够包含下划线和字母,不能够有数字和其它字符.

    变量的长度至少是2,以免变量名称重复。

    变量名称不能够相互包含:例如你已经定义了一个叫_varible的变量,你就不能够再定义一个变量叫_var

 

使用举例

求方程ax2+bx+c=0的解

利用公式

X1=(-b+(b^2-4ac)^(1/2))/(2a)

首先定义变量

_a,_b,_c(因为变量必须以_开头)

然后可以这样

(-_b+(_b^2-4_a_c)^(1/2))/(2_a)

 

OK! 功能很强大,也很简单吧。


11.括号

括号包括大中小3种,它们的功能一样,可以混用,根据个人不同的习惯自己选用,但是在使用的时候请注意要配对使用。

括号内部必须要有表达式,像下面这样的式子是不对的

(1+2)*((+3+4)()(6))

    括号可以多重嵌套,例如下面的式子是合法的

(1+2)((((((((((((1))))))))))))

    在以下情况你需要使用括号

a.改变运算顺序

b.使用函数时候

c.当你不确定各种运算符号的优先级的时候,可以使用括号改变优先级

例如2*30%4,当你不确定计算机是先计算那一个的时候,可以加上括号

(2*30)%4,或者是这样2*(30%4)

    在以下情况你可以省略括号

a.函数的表达式很简单

如ln(1)可以写成ln1, sin(pi)可以写成sinpi

 

PS:当发布完了这个程序了以后我才发现有些不妥当,因此再补充一些,这些都不是什么新的东西,都可以在以前的程序的说明中能够找到,但是这里再次说明一下我觉得还是有必要的。
按照重要与否的顺序来,有的部分可能你不是很感兴趣。
 
该软件现在存在的问题
 
1.对于错误的表达式的处理还需要更一步改进
对于表达式的语法识别上还没有发现什么问题,但是在处理具体表达式的内容的时候,程序还不够健全。没有对所有的错误都做处理。这并不难,但是麻烦了点。
例如:
arcsin100
没有任何语法错误,但是对于函数arcsin的自变量的值应该在[-1,1].这样的情况我并没有全部都去仔细的去判断。这不是太大的问题,知道有这个问题就可以了。
 
    2.提示信息有时候还不够准确
如果你输入 *9   (这当然是不合法的输入)
系统虽然能够检查出语法错误,但是提示信息不正确.
提示信息: 左括号后(不能有运算符号
显然你没有输入左括号,出现该提示的原因是:为了能够正确处理诸如+3+4,-3*5的表达式,程序对于你输入的表达式都默认地加上了左括号.
  
3.个别表达式不能够正确识别
尽管已经做了很多的努力,但是还是不能识别形如下列的表达式
sin-3
系统认为这是错误输入,可以改成sin(-3)输入
 
4.数的表示范围固定
由于计算的时候是采用系统的double类型,所以范围就固定了,8个字节。这也就决定了这个计算器对于计算超大和超小的数的时候,计算精度不能够自己指定。这个问题是比较致命的,要解决这个问题,必须自己定义一种新的数据类型来表示任意精度的数。不过满足我们常用的计算还是绰绰有余的。
 
 
关于变量定义
1.  变量定义中可以是表达式
用户定义的变量中可以是任何合法的表达式
比如说,我可以定义一个变量 _var = log(lne^2,log(10,log(e,e^100)))
这依然是合法的
2.不可以用一个变量去定义另外一个变量
尽管要做到一点并不难,但是如果用户用变量相互定义,或者定义的变量形成一个环的话不容易处理,所以干脆就不提供这个功能。
例如:用户如果这样定义变量是比较麻烦的事情
_a = 2*_b
_b = 2*_c
_c = _a
这其实就相当于一个变量都没有定义,有点像操作系统里面的进程死锁了哈。
 
 
工作原理
 
其实表达式的计算就是堆栈操作,很简单的,到数据结构的教材上都可以找到现成的答案,有兴趣回去慢慢研究吧。
 
表达式的语法检查
 
依据:
根据表达式中任意两个字符的位置关系来判断表达式的合法性,也就是说根据他们那些能够出现在一起,那些不能出现在一起。
如(* 的组合永远都不可能出现在一个合法的表达是中,但 *( 可以
为了判定表达式的合法性,我们把表达式的字母表中的字母分了以下几个类别
1.  数字(包括小数点)
2.  ( 左括号
3.  )右括号
4.  运算符号(包括对数,)
5.  函数
下面给出了它们合法性的判定表
程序中的SyntasCheck就是按照这个表而写的
 
T代表合法, F代表不合法

 
数字
运算符号)
(左括号
右括号
函数
 
数字
T
T
T
T
T
运算符号)
T
F
T
F
T
(左括号
T
F
T
F
T
)右括号
T
T
T
T
T
函数
 
T
F
T
F
T

 
当一个数中有多个小数点的时候(如3.3.4.4),上表不能识别出,因此另外写了一个函数pointCheck();
 
 
 
原创粉丝点击