For…Next循环简称为For循环。它是一种指定循环次数(循环次数是可以计算出的)的循环结构。在这种结构中,使用一个称为循环变量的特殊变量作为计数器,首先指定它的初始数值,然后每重复执行一次循环,循环变量就会自动增大或减小一个指定的数值(称为步长值),直到循环变量大于或小于终止值,则循环结束。
For…Next语句的语法格式:
说明:
1)关键字For和Next必须成对出现,For是循环语句的开始,Next是循环语句的结束,必须出现在For语句的后面。在关键字For和Next之间的语句块称为循环体,它们将被重复执行,执行的次数由初值、终值和步长值决定。
2)初值、终值和步长值都是数值表达式。步长值可以为正数,也可以为负数。如果步长值为1,则可以省略不写,即系统默认步长值为1。
3)Next语句中的[循环变量]可以省略。
4)<循环变量>为必要参数,其值的变化决定循环体执行的次数。在循环体内,一般不对循环变量再次赋值。循环变量从初值开始,逐次按照步长值增大或减小而改变,直到循环变量大于或小于终止值,则循环结束,循环体的这种结束方式,称为“正常退出”。
例如:
上述For语句的初值为1,终值为5,步长值为1。循环体执行5遍,输出每次的i值。当循环体执行完毕后i的值为6,由于i值大于“终值”结束的,这是正常退出。运行结果如图4-30所示。
5)循环体中的Exit For语句为可选语句,根据需要而定。当程序执行到该语句时,循环体终止执行,直接跳出循环结构,转到Next后面的语句执行。循环体的这种结束方式,称为“非正常退出”或者“中间退出”。
例如:
在这个循环体中有条判断语句,如果i值为4,则执行Exit For语句,所以当i值为4时,执行判断语句,条件满足,执行Exit For语句,退出循环体。尽管下面还有Print语句,并且i值也小于终止值,但是循环体终止了,这时循环体并没有被执行可以执行的最大遍数,这是非正常退出。运行结果如图4-31所示。
图4-31 非正常退出示例
图4-30 正常退出示例
注意此时的i值,循环体终止了,i值为4,小于终止值。可以利用这种方法来判断循环体是通过哪种方式退出的。
For语句的执行过程可以描述为:
1)若初值、终值和步长值为表达式,则求出它们的值,并保存起来。
2)将初值赋给循环变量,这个操作只执行一次。
3)判断循环变量值是否大于终值(初值小于终值,且步长值为正时)或小于终值(初值大于终值,且步长值为负时),如果小于或等于终值(初值小于终值,且步长值为正时)或者大于等于终值(初值大于终值,且步长值为负时),则进入循环体执行,否则跳到Next之后的语句执行。
4)执行完一遍循环体后,执行Next语句,把循环变量的当前值加上步长值后再赋给循环变量。
5)转到第3)步。
【例4-19】用For语句实现计算s:s=1+2+3+4+…+100。
按“三步法”原则分析如下。
做什么
在这个例子中,不需要用户输入任何信息。任务已经很清楚,就是计算从1加到100的累加和,所以窗体上不需要文本框等有关输入的控件。只需要一个“计算”按钮即可。
怎么做
有一个概念必须建立起来,不能在程序中直接书写s=1+2+3+4+…+100,这是不可以的,因为程序设计语言中没有“…”运算符。要解决这个问题,该怎么办呢?先看下面这个实际问题:
有个苹果园,现在让你从苹果园中运苹果出来,但是有以下规则:
1)每次运送的苹果个数必须与当前次数相等。
2)把每次运送的苹果都放入同一个容器中。
要完成这项任务,需要两个容器,一个用来装每次运送的苹果,命名为i,另一个用来装每次运送完毕后苹果的总量,命名为s。
那么,容器i的变化规律是1,2,3,…,100,既代表次数,也代表每次运送的苹果数量。初值为1,第一次运送;当把i中的苹果放入s后,i的值增1变为2,代表是第2次运送,其余类推。i的有效取值范围为1~100,当i大于100时结束。
s中每次的增量就是i中的数量,所以每次都是前s中的数量加上当前i中的数量,用表达式表示就是s+i。当放入完毕后,s中的数量就变成了前i次的和了。
这个应用很好地体现了循环累加的概念,i就是循环控制变量,s就是累加和,s中最后就是1~100的累加和。
步骤描述如下。
1)设置容器i的初值为1。
2)比较i与100的大小,如果i值小于或等于100,则执行第3)步,否则执行第5)步。
3)把i值和s值相加,然后把相加的结果存入s值。
4)i值增1,返回第2)步。
5)循环结束,输出s值。
实现
步骤描述第1)~4)步能够很好地在For语句中体现出来,如图4-32所示。
图4-32 计算1~100的和
完整代码如下。
循环体s=s+i的功能是把s值和i值相加,然后把结果存入s值。下面分析它的原理。
第一次循环s默认为0,i的初值为1,s+i的结果为1,然后系统执行赋值功能,把1赋值给s,所以左面的s为1,这一点容易理解。但是右边的s为多少呢?还是0吗?其实右边的s也同时变为1。这个表达式并不是等式,而是一个赋值语句,赋值语句的功能是把右边的计算结果传递给左边的变量,左右两边的s为同一个s。在运行时,先计算赋值运算符“=”右边表达式的值,不管表达式中用到了什么变量,它都会取变量里面的值进行计算。当计算完毕后,因为是赋值语句,计算机要把这个结果保存到左边变量中,它不管左边变量是什么名字,都会把结果赋值给该变量。即使左边也是s,计算机会用新的结果替换s中原来的值,s中原来的值就丢失了,左边s值发生了变化,相应地,右边s值也会发生相同的变化,它们本来就是同一个变量。
只有采取上述公式循环才能继续。如果右边的s还是保持为0,那么当第2次循环时,i值变为2,进入循环体,再次执行s=s+i时,右边的s如果还是0,就变成0+2了,这显然是错误的。
【例4-20】输入两个整数,用For语句计算这两个整数以及它们之间所有奇数的和。
按“三步法”原则分析如下。
做什么(www.xing528.com)
1)用户需要输入两个整数,所以窗体上需要两个文本框。
2)“计算”按钮、添加文本框的标签。
怎么做
步骤描述如下。
1)获取用户输入的数据,分别放入变量M、N中。初始化累加器变量sum为0。
2)设置变量i的初值为M。
3)如果i值小于或等于N,则向下执行,否则执行第6)步。
4)如果i为奇数,则计算sum+i,然后把结果还保存到sum中,继续向下执行。
5)变量i值增1,返回第3)步。
6)循环体结束,输出sum值。
实现
1)读取数据:
2)步骤描述第2)~5)用For语句实现如下:
3)输出:
完整代码如下:
下面采用另外一种算法,也就是判断M的奇偶性,如果M为奇数,则令i初始值为M开始累加,然后步长为2,下一个数也为奇数;如果M为偶数,则令i初始值为M+1,然后步长为2,下一个数也为奇数,这样就不用在循环体进行判断了。
步骤描述如下。
1)获取用户输入的数据,分别放入变量M、N中。初始化累加器变量sum为0。
2)判断M,如果M为偶数,则M增1。
3)初始化i为M。
4)如果i值小于或等于N,则向下执行,否则执行第7)步。
5)计算sum+i,把结果还保存到sum中,然后继续向下执行。
6)变量i值增2,返回第4)步。
7)循环体结束,输出sum值。
完整代码如下:
读者们也可以分析一下,在输出语句中为什么改写成了Text1.Text&","&N&"之间的奇数和为:"&sum。
【例4-21】输入两个整数,用For语句计算这两个整数以及它们之间能够被3或5整除的所有整数的和。
按“三步法”原则分析如下。
做什么
1)用户需要输入两个整数,所以窗体上需要两个文本框。
2)计算按钮。
3)用于说明文本框的标签。
怎么做
步骤描述如下:
1)获取用户输入的数据,分别放入变量M、N中。初始化累加器变量sum为0。
2)设置变量i的初值为M,执行第3)步。
3)如果i值小于或等于N,则执行第4)步,否则执行第6)步。
4)如果i能够被3或5整除,则计算sum+i,把结果还存入sum,继续向下执行。
5)变量i值增1,返回第3)步。
6)循环体结束,输出sum值。
实现
1)读取数据:
2)步骤描述第2)~5)步用For语句实现如下。
3)输出:
完整代码如下。
读者们可以分析一下,这个题能否像例4-20那样先判断出M的各种情况,然后采用不同的步长呢?
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。