宏算算式的条件与分支
2019-04-19 21:28:30 NUMKIT.COM 欢迎转载,转载请注明出处有些计算过程在不同的情况下需要套用不同的公式,也就是计算过程中包含条件分支。宏算算式可以通过两种方式实现条件分支计算:
- 通过条件相关函数实现
- 通过If-Else结构实现
第一种方式简单易学;第二种方式逻辑更清晰,但是语法比较复杂,更适合开发者使用。
通过条件相关函数实现
这种方式要使用到一个重要的函数:
when(c,a,b)
用途:当c为非零值时返回a;否则返回b
函数接受3个参数,参数与参数间用英文逗号(,)分隔:
- 参数c:条件参数
- 参数a:第一个候选数值
- 参数b:第二个候选数值
例如when(1,2,3)
、when(-1,2,3)
、when(99,2,3)
都会返回2;而when(0,2,3)
则返回3。
假设一个简单的应用场景:当c等于100时计算x+y,否则计算x-y的值。使用函数设计条件分支,就可以这样写:
when(c-100,x-y,x+y)
如果是多层条件分支呢?很简单,很多when嵌套起来就可以了。例如:
when(c,when(c1,a1,b1),when(c2,a2,b2))
嵌套的层数并没有限制,可以一直嵌套下去。
那要是根据数值的大小范围来作为条件呢?那就要再借助于以下几个函数了:
函数booleanAnd(a,b)
当a与b均为非零值时返回1;否则返回0
参数a:第一个数值
参数b:第二个数值
函数booleanOr(a,b)
当a为非零值或b为非零值时返回1;否则返回0
参数a:第一个数值
参数b:第二个数值
函数booleanXor(a,b)
当a与b一个为0而另一个为非零值时返回1;否则返回0
参数a:第一个数值
参数b:第二个数值
函数booleanNot(a)
当a为零时返回1;否则返回0
参数a:一个数值
函数equal(a,b)
当a与b相等时返回1;否则返回0
参数a:一个数值
参数b:另一个数值
函数notEqual(a,b)
当a不等于b时返回1;否则返回0
参数a:一个数值
参数b:另一个数值
函数less(a,b)
当a小于b时返回1;否则返回0
参数a:一个数值
参数b:另一个数值
函数lessOrEqual(a,b)
当a小于或等于b时返回1;否则返回0
参数a:一个数值
参数b:另一个数值
函数greater(a,b)
当a大于b时返回1;否则返回0
参数a:一个数值
参数b:另一个数值
函数greaterOrEqual(a,b)
当a大于或等于b时返回1;否则返回0
参数a:一个数值
参数b:另一个数值
例如:当x<y时计算y-x的值,否则计算x-y的值。由when和less两个函数配合实现,就是:
when(less(x,y),y-x,x-y)
通过If-Else结构实现
在描述复杂的计算逻辑时,只使用条件相关函数可能会使算式变得冗长而且难读。
If-Else结构是经典的条件分支结构,如果您曾经接触过任何计算机编程语言都不会对它陌生。宏算算式的If-Else结构借鉴了C语言的设计。其基本结构为:
if(<条件式>) { <满足条件式时的算式组> } else { <不满足条件式时的算式组> }
这种结构允许<满足条件式时的算式组>及<不满足条件式时的算式组>中有多个算式语句。 另外,如果在条件式不满足时无需任何计算步骤的话,else及之后的部分可以省略。
If-Else结构可以进行嵌套,例如:
if(<条件式1>) { <满足条件式1时的算式组> } else if(<条件式2>) { <满足条件式2时的算式组> } else if(<条件式3>) { <满足条件式3时的算式组> } else { <所有条件式都不满足时的算式组> }
If-Else结构中的<条件式>可以是一个简单的不等式,例如:x<y
(x小于y)、x>=y
(x大于或等于y)、x==y
(x等于y)、x!=y
(x不等于y)。
其中需要注意的是,判断两值是否相等所使用的符号是“两个连续的等号”,如使用a==b
判断a、b的值是否相等。(单个的等号只用在赋值,如使用c=a+b
将a与b相加后的结果保存到变量c中。)
另外,判断两值是否不相等所使用的符号是“叹号后接等号”,如使用a!=b
判断a、b的值是否不相等。
逻辑运算符用于连接不等式或条件式以组成新的条件式。逻辑运算符包括not、and、or和xor,列表如下:
逻辑运算符 | 优先级 | 含义 |
---|---|---|
not | 最高 | 逻辑否,作用于右侧的条件式,当且仅当右侧式子为假时为真 |
and | 较高 | 逻辑与,连接两个条件式,当且仅当两侧式子都为真时才为真 |
or | 较低 | 逻辑或,连接两个条件式,当两侧任意一个式子为真时为真,否则为假 |
xor | 最低 | 逻辑异或,连接两个条件式,当且仅当两侧的式子一个为真一个为假时为真 |
使用逻辑运算符连接不等式的例子如:x<y and a<b
(x小于y而且a小于b)、x<y or a<b
(x小于y或者a小于b)。
嵌套使用逻辑运算符的例子如:not (x<y and a<b)
(x小于y而且a小于b 不成立)。
下面这个“解一元二次方程”需要依据d的值执行不同的计算,是使用If-Else结构进行条件分支计算的实例。
这个宏算界面的算式如下:
option{ title:"解一元二次方程"; comment:"本计算器用于求解一元二次方程\nax^2+bx+c=0"; footnote:"注:本计算器只计算实数根."; summaryUnique:true;summaryPosition:top} input{a:"二次项系数a";b:"一次项系数b";c:"常数项c"} default{a:1;b:0;c:0} validate{alert:[a==0,"二次项系数a不能为0"];} summary{text:[d>0,"方程有两个根"][d==0,"方程有一个根"][d<0,"方程无解"]} output{x:"唯一根";x1:"较小的根";x2:"较大的根";d:hide;} d=b^2-4*a*c; if(d>0){ x1=(-b-sqrt(d))/(2*a); x2=(-b+sqrt(d))/(2*a); }else if(d==0){ x=(-b)/(2*a); }