宏算算式的条件与分支

2019-04-19 21:28:30 NUMKIT.COM  欢迎转载,转载请注明出处

有些计算过程在不同的情况下需要套用不同的公式,也就是计算过程中包含条件分支。宏算算式可以通过两种方式实现条件分支计算:

  1. 通过条件相关函数实现
  2. 通过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);
}


下一篇: 宏算文本扩展