5.2.2子计算语句

上面的例子中,在计算一批AQI数据对应的空气质量等级时,使用了子程序。子程序的功能是计算每一个AQI数据对应的空气质量等级。A2中的表达式也可以不用子程序,直接写在一个表达式中:=B1.(if(~>300:"Hazardous",~>200:"Very Unhealthy",~>150:"Unhealthy",~>100:"Unhealthy for Sensitive Groups",~>50:"Moderate","Good")),这样的表达式显得繁冗而不易理解。除了使用子程序,在集算器中还可以使用子计算语句来处理这样的计算:

 

A

B

C

1

Air Quality Index

[59,164,50,104,93]

 

2

==B1.(??)

=if(

~>300:"Hazardous",

3

 

 

~>200:"Very Unhealthy",

4

 

 

~>150:"Unhealthy",

5

 

 

~>100:"Unhealthy for Sensitive Groups",

6

 

 

~>50:"Moderate",

7

 

 

"Good")

A2中的计算结果和前一个例子是相同的。我们可以发现,子计算语句与子程序的写法有些类似。子计算语句的主格需要用双等号"=="开头,在以它为主格的代码块中,可以使用长语句,而不必再加双等号或双大于号。子计算语句主格中使用双问号"??"运算符,代码块中,最后执行的一个计算格的值将自动返回,而不需使用return语句。另外需要注意的是,子程序可以在网格中的任何地方调用,而子计算语句只在主格中调用。

 

上面的子计算语句中只有一个使用if()函数的长语句,在子计算语句的代码块中,也可以使用多条语句,如:

 

A

B

C

1

Air Quality Index

[59,164,50,104,93]

 

2

==B1.(??)

if ~>300

="Hazardous"

3

 

else if ~>200

="Very Unhealthy"

4

 

else if ~>150

="Unhealthy"

5

 

else if ~>100

="Unhealthy for Sensitive Groups"

6

 

else if ~>50

="Moderate"

7

 

else

="Good"

此时,子计算语句的代码块中不再只有1个计算格,在每次计算时,将返回最后执行的计算格的值。如对于93,在代码块中最后执行的计算格是C6中的="Moderate",将返回结果Moderate。注意C列中需要写表达式而不能用常数单元格。A2中的结果与前面是相同的:

子计算语句可以看为一种特殊的长语句,整个子计算语句的目的就是完成主格中表达式的计算。

 

使用子计算语句,可以完成一些比较复杂的计算。如,根据州数据表STATES和大城市数据表CITIES,找出哪些州中人口最多的2个城市的人口总数超过2,000,000。解答如下:

 

A

B

C

1

=demo.query("select STATEID,ABBR, NAME from STATES order by STATEID")

 

 

2

==A1.select(??)

=demo.query("select * from CITIES where STATEID=?",STATEID)

 

3

 

if B2.len()<1

=false

4

 

else if B2.len()==1

=B2(1).POPULATION>2000000

5

 

else

=B2.sort(-POPULATION)

6

 

 

=C5(1).POPULATION+

C5(2).POPULATION>2000000

先在A1中选出所有州数据。接下来,在A2中使用子计算语句,根据代码块中的结果来判断每个州是否满足条件。其中,B2中查询出这个州的大城市,并根据结果进一步判断。如果未找到大城市数据,则在C3中用=false返回,说明不满足要求。如果仅有1个大城市的数据,那么在C4中检查这个城市是否已经满足人口超过2,000,000。如果查询到2个或更多城市的数据,则在C5中根据人口降序排序,并在C6中判断是否满足要求。通过使用子计算语句,复杂查询的结构更为清晰。计算后,A2中的结果如下: