尽管我从不相信速成,但也知道有些事情必须速战速决。事实上,我一直在忽略一些(其实非常重要的)细节,带着读者向前向前向前……这并不是想要囫囵吞枣,而是为了尽快有个“概览”,而后再重新来过。反刍,也是学习的诀窍之一。
计算机的另外一个长项是“不厌其烦”,无论你让它做什么,只要?你要求的是它确实能做的(比如它不大可能每天定时煎两个荷包蛋给你);
?你说得足够清楚(程序正确无误);
那么它就会百分百照做,并且绝不怕重复——你让它做多少遍它就做多少遍。
我们小时候都计算过1+2+3…+10等于55;并且那时候我们还学过所谓的“优化算法”,
1+10=11
2+9=11
3+8=11
4+7=11
5+6=11
所以,只需要算5×11等于多少就可以了。
有了编程能力之后,你可以无需任何“优化算法”[1],迅速得知1+2+3…+n等于多少,无论n是多少……
现在,请分别建立以下三个文件,输入相应的代码,分别执行,查看结果。Testing6.au3
$r=0
For$i=1To256
$r=$r+$i
Next
ConsoleWrite($r)
Testing7.au3
$r=0
$i=1
While$i<=256
$r=$r+$i
$i=$i+1
WEnd
ConsoleWrite($r)
Testing8.au3
$r=0
$i=1
Do
$r=$r+$i
$i=$i+1
Until$i>256
ConsoleWrite($r)
这三个程序的输出结果都是一样的,它们都在计算从1加到256的结果是多少:32896(=1+2+3…+256)。
先让我们看看Testing6.au3的代码。
- 第1行,变量$r被设置了一个“初始值”,0。
- 第2行至第4行,For…Next,是一个循环结构。在循环的过程中,变量$i的值从1开始依次递增,变为2、3、4…直至256为止。此后才会接着执行第5行代码。
- 第3行代码处于循环结构之中,
- 第一次执行的时候,$r = $r + 1(这次$i的值是1);所以,$r =0 + 1,即,在这行代码执行过后,变量$r的值变成了1;
- 第二次执行的时候,$r = $r + 2(这次$i的值是2);所以,$r =1 + 2,即,在这行代码执行过后,变量$r的值变成了3;
- 第二次执行的时候,$r = $r + 3(这次$i的值是3);所以,$r =3 + 3,即,在这行代码执行过后,变量$r的值变成了6;
- 以此类推……
- 直至$i的值递增为256之时,之前的$r的值再次被加上256之后,循环至此结束
- 执行Next语句之后的代码,即第5行代码——输出结果,32896。
而Testing7.au3和Testing8.au3,只不过是用了另外两个循环结构而已:While…WEnd和Do… Until。这两个循环结构的语法更加接近自然语言,基本上就是“Plain English”,很容易看懂。
请认真思考为什么Testing7.au3中的表达式($i <= 256)用的是“<=”,而Testing8.au3中的表达式($i > 256)用的是“>”?
作业:
- 仔细阅读AutoIt帮助文件中Keyword/Statement Reference中的关于For…Next、While…WEnd、以及Do…Until的内容,把其中的每一个例子都尝试着运行一遍。在运行之前,请用脑演练一遍代码,看看执行结果是否与想象得相同……
- 写一个程序,计算“从1乘到某个特定的数字”的结果。
- 把上面的程序总共写成三个版本,分别用For…Next、While…WEnd、以及Do…Until的循环结构,完成同样的功能。
Footnotes:
1.这个例子中所需要的计算太简单,所以,“算法”上的优化没有太大作用。而在大型的
软件工程中,算法优化非常重要,效果也异常惊人。不过,大多数普通用户的“任务”,往往用“笨方法”更划算……
