- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Visio-公式配置--二叉树
: Author:Wilson e-Mail:wilsonwong@126.com QQ:106365089 QQ
自动义公式方案简介:本方案主要利用二叉树设计自定义公式运算,其运算可为常用的数学公式、逻辑运
算和自定义函数,每一个公式的定义同时可以作为其他自定义公式的引用,本方案可用在KPI考核、工程
计算等方面,可以一个相对独立辅助工具实现,并可为其他系统提供编程接口。
问题需求:
客户通过工具构造任意复杂的计算公式,计算公式中的变量取自预先定义的公式表。公式表通过唯一性ID检索到所对应的
公式表达式。表达式可以为常量,或者另一个公式,或者函数调用格式。
公式计算如果成功,则返回计算的数值结果(如果结果为布尔型,可取以下值:true,false,0,非0数字),如果计算出错
则返回“err:错误描述”。
计算公式包含条件判断式类型:如 IF(条件,真值表达式,假值表达式).
解决方案:
二叉树和公式的对应关系如图所示,通过遍历二叉树可得到公式的表达式或计算公式的值。
二叉树是改造过的,除了左右两个结点外,还有一个结点用于IF表达式时的条件指针,条件指针指向另一个公式表达式。
二叉树结点分为两大类,一类是运算符,另一类为表达式。运算符分为两类,一类是算术运算符 (+,-,*,/,,=,,=, ,!=),运
算操作数为左右两个结点的值;另一类是IF符号,IF结点通过条件指针(Condition)所指向表达式计算返回的值判断是否为真,如
果为真结点值取左结点,否则取右结点。如果结点不是IF结点,条件指针(Condition)忽略。
结点的值计算:
1、结点为叶子结点,如果结点为可直接计算的表达式(如常量、外部非内嵌公式函数调用{如果函数体内含有公式,
则先计算公式值,然后代入在计算函数值})则直接计算结点值,如果结点为公式ID,则从公式表读取公式表达式并计算该公式值作
为本结点的值。
2、结点为非叶子结点情况,结点的值由左结点的值和右结点的值通过本结点的运算符运算所得。如果本结点运算符为
数学运算符(+,-,*,/等),结点值为数字类型值;如果本结点运算符为逻辑运算符(,=,,=, ,!=,and or),则返回值为真假
值(true,false);如果结点为IF表达式,则根据Condition指针所指向表达式的值(真假),判断取本结点的左值还是右值,如果
为真取左值,为假取右值。
结点图形显示坐标设定算法思想(所有坐标均指图形模块的中心坐标):
1、定5个参数:根结点坐标(xRoot,yRoot),结点宽度高度(nNodeWidth,nNodeHeight)
最大深度叶子结点之间的距离(nLeafHSpace)
行距系数(fCoefficient)
相邻两层结点的基准行距(nLineVSpace),每行行距不等,最大深度行距最小,最小深度行距最
大,根结点深度为1,计算方法(行距=基准行距 * Pow(行距系数,(二叉树最大深度-当前结点深度))。
2、计算3个值:二叉树最大深度(nMaxDepth),当前结点深度(nCurDepth),完全二叉树结构以当前结点为中轴偏左
叶子结点个数(nLeftLeafs)
3、二叉树绘图区域左上角坐标计算:
完全二叉树叶子结点个数:nLeafs = Pow(2,nMaxDepth-1)
x0 = xRoot - ((nNodeWidth+nLeafHSpace) * nLeafs + nLeafHSpace)/2
y0 = yRoot - nLineVSpace ;
3、计算结点坐标:
二叉树绘图区域左上角坐标计算:
q = 1.3 ; //等比系数
x =
原创力文档


文档评论(0)