深化fx5800p编程:FOR循环

01

问题分析

我们说过,在编写一段程序前,首先要进行问题分析,问题分析不仅仅考虑数学上逻辑分析,还要考虑编程环境。在fx5800p中,有26个字母变量和N个可扩展变量以Z[1]、Z[2]、Z[3]...Z[n]形式出现。面积计算有N个点作为已知数据,如果每个点用一个变量保存,显然字母变量是不适宜的,那么扩展变量呢?

对于点数不是太多的情况下,使用扩展变量是可行的,也是最方便的,可计算器的存贮量始终是有限的(而且不多,可以查查说明书),扩展变量也有用完的时候,假设有很多点足以消耗完存贮,是不是计算器就无法完成了呢?答案是否定的,我们就以两种方式来实现这个程序。

为了练习for循环,我们使用一个字母变量,这个变量存储点的个数,比如N。程序开始前,首先确定点的个数。

‘P-nums=’:?N

02

使用扩展变量

扩展变量位置索引

如果我们将所有点的xy按顺序赋值给扩展变量,位置索引如上图。比如第四个点,x位置应该在4*2-1=7即z[7],同理,y存储在Z[8]。从第一个位置开始依次输入每个点坐标,FOR循环使用如下:

FOR 1i TO N×2-1STEP 2

‘P.x’:?z[i]

‘P.y’:?z[i+1]

NEXT

这样就完成了各个点坐标的输入。

下面设计计算部分。

由于要累积求和,我们使用一个字母变量,这个变量不断累积求和,比如s.

计算第一个点:

z[2]×(z[N×2-1]-z[3])s

从第二个点开始计算到倒数第二个点:

FOR 3i TO (p-1)×2-1STEP 2

s+z[i+1]×(z[i-2]-z[i+2])s

NEXT

计算最后一个点:

s+z[N×2]×(z[p×2-3]-z[1])s

“AREA=”:Abs(s÷2)

这样11句就完成了面积计算的功能,看起来并不是太复杂。较为复杂的是根据存储特征推算索引计算式。

03

任意点数计算

在上面我们提到扩展变量是有限的,也就是能计算的点数始终是有限的,原因在于我们存储了所有点的数据后再实施计算,这样的计算也并非没有好处,比如我们可以再运行一次程序就可以复核输入的数据是否有误,缺点就在于点数受限。

算法示意图

要实现任意点数计算就不能过多占用变量,可以边输入边计算,就能实现任意点的计算。

s

‘Pn.x’:?p

‘Pn.y’:?q(首先输入最后一个点)

将pq记录到z[1]、z[2]中,由于pq要向前推移,避免再次输入尾点

pz[1]:qz[2]:

‘P1.x’:?a

‘P1.y’:?b(输入第一个点,后面便于依次输入)

将ab记录到z[3]、z[4]中,由于ab同样要向前推移,避免再次输入

az[3]:bz[4]:

FOR 1i TO P-2 STEP 1(不断输入下一个点,直到输入倒数第二个点完成)

‘Next.x’:?x

‘Next.y’:?y

s+b×(p-x)s

ap:bq

xa:yb

NEXT

由于输入第二个点时实际仅计算了第一个点,依次类推,输入倒数第二个点,实际计算到倒数第三个点。退出循环后,需要增加计算倒数第二个点和倒数第一个点。

s+b×(p-z[1])s

s+z[2]×(a-z[3])s

“AREA=”:Abs(s÷2)

将前两个点不断的推移,达到连续计算的目的。

这样也完成了面积计算的功能,程序语句数量增加了一些,优点是不受计算器存储量的限制,缺点是无法返回复核,要复核只有再输入一遍数据(各变量数据被不断地替换覆盖掉了)。

这个算法是不是有些笨?有没有更好的办法?

04

小结

FOR循环按指定步长进行循环,当初始值经过累增(减)超过指定值即退出。用起来还是比较简单。程序设计有很多小的技巧,有的技巧让程序变得简明易读,有些技巧虽然简化了代码却降低了程序的易读性,使得后期修改变得困难重重,设计时应首先考虑易读性,而不是一味地去追求技巧。

不要小看一个小小的程序,一是彻底了解了计算原理,二是当程序累积多了的时候就如同知识积累一样,有可能会在工作中为解决某个单一问题或某个综合问题提供解决方案。

上面的程序没有在fx5800P上测试过,如果您发现有问题,欢迎留言指出。

05

VB.net原代码

(这段vb.net代码经过测试)

请关注工程测量之家公众号,在以后的文章里我们会介绍更多的工程测量技术应用,让我们一道走在熟手的成长征途中。

如果你认为这篇文章对你有帮助,就请在下方点个赞。

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180108G00FKA00?refer=cp_1026

同媒体快讯

扫码关注云+社区