Board logo

标题: [其他] 最强大的批处理计算器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