循环结构-while循环

for循环遍历指定的可迭代对象,该对象的长度即对象中元素的个数是确定的,所以循环的次数是确定的。还有一种情况,就是一直循环,直到满足指定的条件为止,此时循环次数是不确定的,事先未知。这种循环用while循环来实现。

简单while循环

【Excel VBA】

Excel VBA中While循环结构有两种形式,一种是Do…Loop结构,另一种是While…Wend结构。

Do While…Loop结构的语法格式为:

code.vba
Do While 条件判断
    执行语句
Loop

code.vba
Do
    执行语句
Loop While 条件判断

这两种格式中,第1种先进行条件判断,满足条件时执行语句;第2种是先执行语句再进行条件判断。

While…Wend循环结构与上面第1种Do…Loop结构类似,先进行条件判断,满足条件时执行语句。

【Python】

简单while循环结构首先计算条件表达式,如果结果为真,执行循环体中的语句,否则不执行。

code.python
while 判断条件:
执行语句…

Python中没有Excel VBA中Do…Loop结构的第2种形式。

下面用简单while循环求两个自然数的最大公约数和最小公倍数。求两个自然数最大公约数的算法是:

给定两个自然数m和n, m>n;

m除以n得余数r;

如果r=0,则n是最大公约数,算法结束;否则执行步骤4;

将n值赋给m,r值赋给n,重复执行步骤2。

得到两个自然数的最大公约数后,它们的乘积除以它们的最大公约数就得到它们的最小公倍数。

【Excel VBA】

示例文件的存放路径为Samples\ch05\Excel VBA\While循环.xlsm。

code.vba
Sub Test()
  Dim lngM As Long, lngN As Long
  Dim lngR As Long  '最大公约数
  Dim lngB As Long  '最小公倍数
  Dim lngM0 As Long, lngN0 As Long
  lngM = 100
  lngN = 15  '给定两个自然数m和n,m>n
  lngM0 = 100
  lngN0 = 15
  If lngM < lngN Then
    MsgBox "第一个数必须比第二个数大"
    Exit Sub
  End If
  lngR = lngM Mod lngN  '求模
  Do While(lngR <> 0)  '如果余数不等于0
    lngM = lngN
    lngN = lngR
    lngR = lngM Mod lngN  '求模,余数
  Loop
  lngB = lngM0 * lngN0 / lngN  'lngN为最大公约数,求最小公倍数
  Debug.Print "最大公约数为" & CStr(lngN)
  Debug.Print "最小公倍数为" & CStr(lngB)
End Sub

运行过程,在立即窗口中输出100和15的最大公约数和最小公倍数。

code.vba
最大公约数为5
最小公倍数为300

【Python】

本示例的py文件存放路径为Samples\ch05\Python\sam05-011.py。

code.python
m=100
n=15  #给定两个自然数m和n,m>n
m0=100
n0=15
if m>=n:
    r=m%n  #求模
    while r!=0:  #如果余数不等于0,执行算法第4步
        m=n
        n=r
        r=m%n
    b=m0*n0/n  #n为最大公约数,b为最小公倍数
    print('最大公约数为'+str(n))
    print('最小公倍数为'+str(b))

在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,则IDLE命令行窗口显示下面的结果:

code.python
>>> = RESTART: …\Samples\ ch05\Python\sam05-011.py
最大公约数为5
最小公倍数为300.0

Python中有分支的while循环

Python提供了一种有分支的while循环,该结构中有else关键字,语法格式为:

code.python
while 判断条件:
执行语句…
else:
执行语句…

当判断条件满足时,执行第1个冒号后面的语句块;不满足时执行第2个冒号后的语句块。

下面用有分支的while循环对1至10累加求和。当迭代变量的取值大于10时给出提示。本示例的py文件存放路径为Samples\ch05\Python\sam05-012.py。

code.python
sum=0
n=0
while(n<=10):  #实现累加求和
    sum+=n
    n+=1
else:  #n的值大于10时给出提示
    print("数字超出0-10的范围,计算终止。")
print(sum)

在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,则IDLE命令行窗口显示下面的结果:

code.python
>>> = RESTART: …\Samples\ch01\sam01-12.py
数字超出0-10的范围,计算终止。
55

while循环嵌套

下面用嵌套的while循环生成九九乘法表。

【Excel VBA】

示例文件的存放路径为Samples\ch05\Excel VBA\While循环.xlsm。

code.vba
Sub Test2()
  Dim intI As Integer
  Dim intJ As Integer
  intI = 0
  Do While intI < 9
    intJ = 0
    intI = intI + 1
    Do While intJ < intI
      intJ = intJ + 1
      'Trim函数去掉字符串两端的空格
      Debug.Print CStr(intJ) & "*" & CStr(intI); "="; Trim(CStr(intJ * intI)); " ";
    Loop
    Debug.Print  '换行
  Loop
End Sub

运行过程,在立即窗口中输出九九乘法表。

【Python】

本示例的py文件存放路径为Samples\ch05\Python\sam05-013.py。

code.python
i=0
while i<9:  #外层循环
    j=0
    i+=1
    s=""
    while j<i:  #内层循环
        j+=1
        s+=str.format('{0}*{1}={2} ',i,j,i*j)  #每行求和等式
    print(s)

第1行给变量i赋初值0,变量i是外层循环的迭代变量;第2-8行生成九九乘法表,外层循环中,迭代变量i的值每迭代1次加1,直到等于9,每次迭代用内层循环生成乘法表中的1行;第6-8行为内层循环,判断条件为迭代变量j的值小于i,对j累加,生成当前行的乘式;第9行输出乘法表。

在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,则IDLE命令行窗口显示九九乘法表。

while循环示例-求给定数据的最大值和最小值

本例用while循环实现5.2.4小节介绍的求给定数据最大值和最小值的问题。

【Excel VBA】

示例文件的存放路径为Samples\ch05\Excel VBA\求最大值和最小值-While循环.xlsm。

code.vba
Sub MaxMin()
  Dim intI As Integer
  Dim sngMax As Single  '记录最大值
  Dim sngMin As Single  '记录最小值
  Dim sngT As Single
  Dim intN As Integer
  Dim intRows As Integer

  '工作表中第1列数据最大行号
  intRows = ActiveSheet.Range("A1").End(xlDown).Row
  intN = 1 '初始化
  sngMax = ActiveSheet.Cells(1, 1).Value  '用第1个值初始化最大值
  sngMin = ActiveSheet.Cells(1, 1).Value  '用第1个值初始化最小值
  Do While intN < intRows   'intN小于intRows时一直执行
    intN = intN + 1
    sngT = ActiveSheet.Cells(intN, 1).Value  '取第intI个值
    If sngT > sngMax Then sngMax = sngT  '通过比较,计算当前最大值
    If sngT < sngMin Then sngMin = sngT  '通过比较,计算当前最小值
  Loop
  ActiveSheet.Cells(2, 4).Value = sngMax  '输出结果
  ActiveSheet.Cells(3, 4).Value = sngMin
End Sub

执行程序,在工作表中输出给定数据的最大值和最小值,如图5-所示。

【Python】

本示例的数据文件存放路径为Samples\ch05\Python\求最大值和最小值-While循环.xlsx,py文件保存在相同目录下,文件名为sam05-03.py。

code.python
import xlwings as xw  #导入xlwings包
#从constants类中导入Direction
from xlwings.constants import Direction
import os  #导入os包
#获取本py文件的当前路径
root = os.getcwd()
#创建Excel应用,可见,没有工作簿
app=xw.App(visible=True, add_book=False)
#打开数据文件,可写
bk=app.books.open(fullname=root+\
    r'\求最大值和最小值-While循环.xlsx',read_only=False)
sht=bk.sheets(1)  #获取第1个工作表
#工作表中第1列数据最大行号
rows=sht.api.Range('A1').End(Direction.xlDown).Row
max_v=sht.range('A1').value
min_v=sht.range('A1').value
n=1
#遍历数据区域的单元格
while n<9:
    n+=1
    tp=sht.cells(n,1).value  #获取数据
    #如果当前值比最大值大,最大值取当前值
    if tp>max_v:max_v=tp
    #如果当前值比最小值小,最小值取当前值
    if tp<min_v:min_v=tp
#输出结果
sht.cells(2,4).value=max_v
sht.cells(3,4).value=min_v

运行脚本,在工作表中输出给定数据的最大值和最小值,如图5-所示。