标题:
[其他]
最强大的批处理计算器bmathematics
[打印本页]
作者:
TSCAN
时间:
2017-4-28 10:49
标题:
最强大的批处理计算器bmathematics
摁,首先请管理员帮我转移到 原创代码那一块。
这是我很久以前写的代码了,所以来分享一下。
批处理,从程序语言的设计上来说是很坑爹的,所以显出这个程序写出来的不易了。
首发于贴吧
http://tieba.baidu.com/p/4636526267?pn=1
首先是简单的四则运算和括号嵌套,这个不必说了吧
[attach]10587[/attach]
注意的是由于内置parser的缺陷(其实是我当时太naive),负数请写成(0-x)
函数运算
[attach]10588[/attach]
negative函数:取反
sum函数:求和
max,min:取最大最小值
mod:取余
cube:3次方
square:平方和
变量定义和自定义函数(最多可支持二元函数的自定义):由于内置parser的缺陷,请使用 英文小写字母进行定义
[attach]10589[/attach]
bmathematics还支持pattern matching,递归函数定义和memorization optmization。
1.如何在bmathematics中定义fibnacci数列
fibnacci数列的递推式 fib(x)=fib(x-1)+fib(x-2)
fib(1)=1
fib(2)=1
[attach]10590[/attach]
memorization optimization是指记忆优化,当程序已经计算了f(n)的值后,会自动将结果存储起来,下一次就不需要重复计算。
2.在bmathematics定义等比/等差数列
a(1)=1
a(x)=a(x-1)*2
a(1)=1
a(x)=a(x-1)+2
还可以定义阶乘函数:
factor(0)=1
factor(1)=1
factor(x)=factor(x-1)*x
一股浓浓的fp的味道
3.
bmathematics案例学习--定义乘方函数
有人可能要说了,bmathematics中没有提供计算n次方的方法,在批处理中可以用^来计算x的y次方。
为什么没有提供?因为你自己就可以定义
power(x,y) --x的y次方
power(x,0)=1 ;x的0次方等于1
power(x,1)=x ;x的1次方等于x
power(x,y)=x*power(x,y-1)
[attach]10592[/attach]
4.
bmathematics案例学习--求最大公约数(**)
我们现在想要在bmathematics中求两个数的最大公约数,而bmathematics中却没提供相关的函数怎么办?
自己定义呗
辗转相除法:
**(x,0)=x
**(x,y)=**(y,mod(x,y))
就这么简单
[attach]10591[/attach]
由于内置parser的缺陷,对负数进行pattern matching可能引起潜在的错误比如f(-1)=1
最后
仅仅简单的计算器其实是一个很复杂的产物,包含了很多特性。
本来我是想写个parser combinator来解析expression的,但是发现速度堪忧,于是改成手写parser。
递归函数和pattern matching是我觉得很cool而加进去的。
批处理在设计上有很多问题,所以我转战racket(一种强大的lisp方言)了,欢迎大家 关注我的知乎:
https://www.zhihu.com/people/syntacticlosure/activities
提供一些原理上的解析:
对于一个表达式 23+56*90 首先进行tokenize
分解为 token_1=23
token_1_type=number
token_2=+
token_2_type=operator
.....
然后对tokens进行parse,手写递归下降parser
在parse的同时生成结果,对于函数,查看mem_f_arg?里面有没有储存结果,如果有,直接取值,如果没有,计算后记忆。
[attach]10593[/attach]
作者:
ShowCode
时间:
2017-4-28 10:54
强烈建议大家用 PowerShell 作计算
作者:
happy886rr
时间:
2017-4-28 16:55
本帖最后由 happy886rr 于 2017-4-28 16:56 编辑
回复
1#
TSCAN
楼主算法高超。我之前试着用C语言完成的计算器
http://www.bathome.net/thread-42830-1-1.html
,也只支持单双目运算,楼主的居然支持自定义函数。
不过楼主的计算器没法做数学运算,就支持加减乘除啊,连小数也没。
作者:
老刘1号
时间:
2017-4-28 21:04
回复
2#
ShowCode
XP没有PS
个人建议
用VBS
作者:
3518228042
时间:
2017-4-30 07:48
本帖最后由 3518228042 于 2017-4-30 08:00 编辑
这样计算与解题能不能实现,文件夹内有几个txt,a.txt,b.txt,c.txt其中c为中文内容忽略。
当选择计算时,根据是否有“=”号进行计算结果
a.txt内容
2×3
2×(3+4)÷5=6
2×((3+4)÷5)=
这个能不能修正结果?碰到5减7没有=号不计算输出为:计算a.txt
2×3
2×(3+4)÷5=2.8
2×((3+4)÷5)=2.8
b.txt内容,只有一条,当选择为解题时
(2+3)×4÷5-6
输出为:解题b.txt,一步步输出,并且可以把小数点后面结果限制在16位如果乘法,上限不限制
(2+3)×4÷5-6
=5×4÷5-6
=20÷5-6
=4-6
=-4
然后a.txt有一个2×3,提取后输出为解题a.txt
2×3
=6
作者:
TSCAN
时间:
2017-4-30 19:44
回复
5#
3518228042
如果你有这样的需求的话,我可以帮你写程序,加我qq1227847322
作者:
TSCAN
时间:
2017-4-30 19:48
回复
3#
happy886rr
不只加减乘除哦,只是由于没有使用第三方,所以无法提供一些复杂的函数
关于小数,只要对tokenizer进行一些加强,有兴趣你可以试试看
作者:
ShowCode
时间:
2017-5-1 20:24
回复
4#
老刘1号
个人希望贡献自己的一份力量促使XP尽快退出历史舞台
作者:
老刘1号
时间:
2017-5-1 20:59
回复
8#
ShowCode
嘿嘿,还有很多人用XP呢
XP自带外部少,又没有PS,写起东西来碍手碍脚
作者:
ShowCode
时间:
2017-5-1 21:03
回复
9#
老刘1号
98和2000退出的时候也是有一批守旧的人,迟早会被历史的车轮碾碎。
作者:
老刘1号
时间:
2017-5-1 21:56
回复
10#
ShowCode
唉,怎么说呢
算我一个
吧
欢迎光临 批处理之家 (http://bathome.net./)
Powered by Discuz! 7.2