宏算算式的条件与分支

2017-09-29 12:18:15 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 不成立)。

下面这个“工资、薪金个人所得税计算器”需要根据收入的范围分段计算税金,是使用If-Else结构进行条件分支计算的实例。

这个宏算界面的算式如下:

option{title:"工资、薪金个人所得税计算器";
comment:"2011年9月1日开始实施新的个人所得税计税方法。新计税方法规定工资、薪金所得,采用7级超额累进税率(3%-45%),按月对应纳税所得额计算征税,同时起征点调整为3500元。";
footnote:"注:2011年9月1日起,个人所得税的起征点调整为3500元。";}
input{s:"税前金额","元";b:"起征点","元";}
output{x:hide;t:"应缴税","元";l:"税后金额","元";}
validate{alert:[s<0,"税前金额不能小于0"];}
default{s:0;b:3500;}
x=s-b;
if(x<=0){
	t=0;
}else if(x<=1500){
	t=x*0.03;
}else if(x<=4500){
	t=x*0.1-105;
}else if(x<=9000){
	t=x*0.2-555;
}else if(x<=35000){
	t=x*0.25-1005;
}else if(x<=55000){
	t=x*0.30-2755;
}else if(x<=80000){
	t=x*0.35-5505;
}else{
	t=x*0.45-13505;
}
l=s-t;
t=round(t*100)/100;
l=round(l*100)/100;


下一篇: 宏算文本扩展