找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 32517|回复: 10

[其他] 最强大的批处理计算器bmathematics

[复制链接]
发表于 2017-4-28 10:49:06 | 显示全部楼层 |阅读模式
摁,首先请管理员帮我转移到 原创代码那一块。
这是我很久以前写的代码了,所以来分享一下。
批处理,从程序语言的设计上来说是很坑爹的,所以显出这个程序写出来的不易了。

首发于贴吧 http://tieba.baidu.com/p/4636526267?pn=1

首先是简单的四则运算和括号嵌套,这个不必说了吧



注意的是由于内置parser的缺陷(其实是我当时太naive),负数请写成(0-x)

函数运算


negative函数:取反
sum函数:求和
max,min:取最大最小值
mod:取余
cube:3次方
square:平方和

变量定义和自定义函数(最多可支持二元函数的自定义):由于内置parser的缺陷,请使用 英文小写字母进行定义



bmathematics还支持pattern matching,递归函数定义和memorization optmization。
1.如何在bmathematics中定义fibnacci数列
fibnacci数列的递推式 fib(x)=fib(x-1)+fib(x-2)
fib(1)=1
fib(2)=1

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)

4.
bmathematics案例学习--求最大公约数(**)
我们现在想要在bmathematics中求两个数的最大公约数,而bmathematics中却没提供相关的函数怎么办?
自己定义呗
辗转相除法:
**(x,0)=x
**(x,y)=**(y,mod(x,y))
就这么简单


由于内置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?里面有没有储存结果,如果有,直接取值,如果没有,计算后记忆。

评分

参与人数 1技术 +1 收起 理由
happy886rr + 1 递归下降用的秒

查看全部评分

发表于 2017-4-28 10:54:31 | 显示全部楼层
强烈建议大家用 PowerShell 作计算
发表于 2017-4-28 16:55:18 | 显示全部楼层
本帖最后由 happy886rr 于 2017-4-28 16:56 编辑

回复 1# TSCAN
楼主算法高超。我之前试着用C语言完成的计算器http://www.bathome.net/thread-42830-1-1.html,也只支持单双目运算,楼主的居然支持自定义函数。
不过楼主的计算器没法做数学运算,就支持加减乘除啊,连小数也没。
发表于 2017-4-28 21:04:26 | 显示全部楼层
回复 2# ShowCode


    XP没有PS
个人建议用VBS

评分

参与人数 1技术 +1 收起 理由
happy886rr + 1 666,VB这方面太强了。

查看全部评分

发表于 2017-4-30 07:48:28 | 显示全部楼层
本帖最后由 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
 楼主| 发表于 2017-4-30 19:44:34 | 显示全部楼层
回复 5# 3518228042

如果你有这样的需求的话,我可以帮你写程序,加我qq1227847322
 楼主| 发表于 2017-4-30 19:48:48 | 显示全部楼层
回复 3# happy886rr
不只加减乘除哦,只是由于没有使用第三方,所以无法提供一些复杂的函数
关于小数,只要对tokenizer进行一些加强,有兴趣你可以试试看
发表于 2017-5-1 20:24:34 | 显示全部楼层
回复 4# 老刘1号


    个人希望贡献自己的一份力量促使XP尽快退出历史舞台
发表于 2017-5-1 20:59:55 | 显示全部楼层
回复 8# ShowCode


    嘿嘿,还有很多人用XP呢
XP自带外部少,又没有PS,写起东西来碍手碍脚
发表于 2017-5-1 21:03:40 | 显示全部楼层
回复 9# 老刘1号


    98和2000退出的时候也是有一批守旧的人,迟早会被历史的车轮碾碎。
发表于 2017-5-1 21:56:58 | 显示全部楼层
回复 10# ShowCode


    唉,怎么说呢
算我一个
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 00:33 , Processed in 0.017808 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表