集算器中,循环代码主要通过for命令来实现。for语句将重复执行以其为主格的代码块,有如下几种格式:
无条件循环,主格的值依次为当前循环计数,通常需要用break命令跳出循环。
无条件循环,或者死循环,是最简单的循环结构,如:
|
A |
B |
C |
1 |
=demo.query("select * from EMPLOYEE") |
[] |
|
2 |
for |
=A1(A2) |
|
3 |
|
if B2.STATE=="Texas" |
|
4 |
|
|
>B1=B1|B2 |
5 |
|
if B1.len()==10 |
|
6 |
|
|
break |
上面的例子中,A2执行无条件循环;在B2中根据A2中的循环次数,每次获得一条员工记录。在后面的代码中,将Texas州的员工信息保存在B1中,当获取到前10名Texas州的员工资料后,在C6中用break语句跳出循环。使用break语句时,也可以用break C命令,跳出以C为主格的循环体。
执行结束后,B1中的结果如下:
需要注意的是,使用无条件循环时,需要确保break语句能够正常执行,否则将使得程序在执行时无法结束。
循环序列A的成员,主格的值依次为当前A的成员。
在集算器中,循环序列中的每个成员,是最为常用的,如:
|
A |
B |
1 |
=demo.query("select * from EMPLOYEE") |
0 |
2 |
=A1.select(STATE=="Texas") |
|
3 |
for A2 |
=age(A3.BIRTHDAY) |
4 |
|
>B1=max(B1,B3) |
例子中,A2中选出了所有在Texas的员工。A3执行循环,循环每一位Texas员工,在循环时,计算出每位员工的年龄,并在B1中存储最大年龄。循环完毕时,就可以在B1中获得所有Texas员工的最大年龄:
对于比较简单的循环语句,有时候,可以用序列的循环函数来实现,如:
|
A |
1 |
=demo.query("select * from EMPLOYEE") |
2 |
=A1.select(STATE=="Texas") |
3 |
=A2.max(age(BIRTHDAY)) |
A3中的结果和上面的例子是相同的:
循环n遍,主格的值依次为当前循环计数。
除了循环一个序列中的所有成员以外,指定次数的循环也很常用。
如,有一张1000mm*800mm,且厚度为0.1mm的纸,如果将它对折10次,那么最终的长宽尺寸和厚度是多少:
|
A |
B |
C |
1 |
1000 |
800 |
0.1 |
2 |
for 10 |
>A1=A1/2 |
>C1=C1*2 |
3 |
|
if B1>A1 |
=B1 |
4 |
|
|
>B1=A1 |
5 |
|
|
>A1=C3 |
上面的例子中,循环对折10次,每次对折后,长度减半,厚度加倍。如果折叠后纸张的宽度超过了长度,那么长宽尺寸交换。执行后,A1、B1和C1中,纸张的长度、宽度和厚度如下:
语句for n也可以看做for to(1,n)的简写。即从1开始,一直循环到n。
从a到b执行循环,每次步进为s,即循环数列to(a,b).step(s)中的各个成员,s缺省时计为1。
有的时候,需要执行的循环不一定从1开始,或者循环时,使用的步进值不是1,那么可以使用for a, b, s执行循环,如:
|
A |
B |
1 |
for 1,100,2 |
>A2=A2+A1 |
2 |
|
|
A2中计算100以内所有奇数的和,结果如下:
如果一个n 位数,它的每个位上的数字的 n 次幂之和等于它本身,那么就称其为水仙花数。下面的例子用来找出所有的3位水仙花数:
|
A |
B |
C |
D |
1 |
[] |
|
|
|
2 |
for 100,999 |
=A2\100 |
=(A2\10)%10 |
=A2%10 |
3 |
|
=power(B2,3) |
=power(C2,3) |
=power(D2,3) |
4 |
|
if B3+C3+D3==A2 |
>A1=A1|A2 |
|
在A2的循环代码中,只循环所有的3位数,程序执行后,可以在A1中看到计算结果:
当x为真时循环,主格的值为x计算值。
通过指定循环条件,可以控制循环何时结束。如for循环小节的问题,也可以使用指定循环条件的for语句来执行:
|
A |
B |
C |
1 |
=demo.query("select * from EMPLOYEE") |
[] |
|
2 |
for B1.len()<10 |
=A1(#A2) |
|
3 |
|
if B2.STATE=="Texas" |
|
4 |
|
|
>B1=B1|B2 |
在for x循环的主格中,格值为每次计算循环条件的结果,为true或者false。这时不能用主格中的值来获得循环次数,因此在B2中获取员工记录时,使用了#C来获得当前的循环次数,#C中,C为循环体的主格。代码执行后,结果与for循环中相同。
在循环体中,可以继续使用循环语句,这就是嵌套循环,也叫多重循环。如:
|
A |
B |
C |
D |
1 |
[] |
|
|
|
2 |
for 2,1000 |
for A1 |
if A2%B2==0 |
next A2 |
3 |
|
>A1=A1|A2 |
|
|
在例子中,A1中存储找到的质数序列;A2循环从2到1000的整数;在B2中循环质数列表,一旦发现当前A2中的数会被某个质数整除,就用next A2命令获取A2中的下个数;如果当前质数列表中所有数都不能整除A2中的数,说明找到了新的质数,将其添加到A1的序列中。其中,D2中的next C命令指定跳过以为主格的循环体剩下的代码,直接进入下轮循环。执行后,A1中,1000以内的质数序列如下:
使用next命令时,也可以不指定主格C,跳过next命令格所在的最内层次的循环。
如下面的百鸡问题:公鸡每只值5钱,母鸡每只值3 钱,而3 只小鸡值1 钱。用100钱买100 只鸡,问:这100 只鸡中,公鸡、母鸡和小鸡各有多少只?解答如下:
|
A |
B |
C |
D |
1 |
[] |
|
|
|
2 |
for 100 |
if 5*A2>100 |
break |
|
3 |
|
for 100-A2 |
=100-A2-B3 |
=5*A2+3*B3+C3/3 |
4 |
|
|
if D3>100 |
next A2 |
5 |
|
|
else if D3<100 |
next |
6 |
|
|
>A1=A1|[[A2,B3,C3]] |
|
在代码中,A2循环公鸡的总数;在B2中判断,如果公鸡的总价已经超过100,说明公鸡的总数已经太多了,此时在C2中用break命令终止循环。B3中继续循环母鸡可能的总数。在D4中,如果发现当前鸡的总价已经超过了100,说明在当前母鸡总数已经太多了,可以用next A2,增加公鸡的总数,重新尝试。在D5中,当前鸡的总价还小于100,可以继续增加母鸡的总数来尝试,这里的next命令会跳过当前最内层的循环代码,即以B3为主格的循环。A1中得到的结果如下: