VB编程基础教程14–控制结构 | 异次元软件世界

来源:百度文库 编辑:神马文学网 时间:2024/04/29 05:38:41

VB编程基础教程14–控制结构

[ 程序乐园 ]

控制结构概述
有了控制结构就可控制程序执行的流程。如果未复选控制流语句,程序便从左至右、自顶向下地贯穿这些语句。有些简单程序可以只用单向流程来编写,有些流程可以依靠运算符的优先级来控制,但任何编程语言的效力和用途皆由其通过结构和循环改变语句顺序的能力而得。



判定结构
visual basic 过程能够测试条件式,然后根据测试结果执行不同的操作。visual basic 支持的判定结构有:
if…then

if…then…else

selectcase
if…then
用 if…then 结构有条件地执行一个或多个语句。单行语法和多行块语法都可以使用:
ifcondition then statement
if condition then
statements
end if
condition通常是比较式,但它可以是任何计算数值的表达式。visual basic 将这个值解释为 true 或 false:一个为零的数值为false,而任何非零数值都被看作 true。若 condition 为 true,则 visual basic 执行 then关键字后面的所有 statements。可以使用单行或多行语法有条件地执行一个语句(下面两个例子等价):
if anydate if anydate < now then
   anydate = now
endif
注意:if…then 的单行格式不用 end if 语句。如果 condition 为 true时要执行多行代码,则必须使用多行块 if…then…end if 语法。
if anydate < now then
  anydate = now
   timer1.enabled = false         ‘定时器控制失效。
end if
if…then…else
用if…then…else 块定义几个语句块,执行其中一个语句:
if condition1 then
[statementblock-1]
[elseifcondition2 then
[statementblock-2]] …
[else
[statementblock-n]]
endif
visual basic 首先测试 condition1。如果它为 false,visual basic就测试condition2,依次类推,直到找到一个为 true 的条件。当它找到一个为 true 的条件时,visualbasic就会执行相应的语句块,然后执行 end if 后面的代码。作为一个选择,可以包含 else 语句块,如果条件都不是 true,则visual basic 执行 else 语句块。
if…then…elseif 只是 if…then…else的一个特例。注意,可以使用任意数量的 elseif 子句,或者一个也不用。可以有一个 else 子句,而不管有没有 elseif 子句。
例如,应用程序可以根据菜单控件数组中哪个控件被单击而采取相应的动作:
private sub mnucut_click (index asinteger)
   if index = 0 then            ’“剪切”命令。
      copyactivecontrol        ‘调用通用过程。
      clearactivecontrol
   elseif index = 1then      ’“复制”命令。
      copyactivecontrol
   elseif index = 2then      ‘“清除”命令。
      clearactivecontrol
  else                        ’“粘贴”命令。
      pasteactivecontrol
  end if
end sub
注意,总是可以添加更多的 elseif 块到 if…then 结构中去。但是,当每个 elseif都将相同的表达式比作不同的数值时,这个结构编写起来很乏味。在这种情况下可以使用 select case 判定结构。
详细信息请参阅语言参考中的“if…then…else 语句”。
select case
visual basic 提供 selectcase 结构替代 if…then…else,从而可在多个语句块中有选择地执行其中一个。select case 语句的能力与if…then…else 语句类似,但对多重选择的情况,select case 语句使代码更加易读。
select case在结构的上方处理一个测试表达式并只计算一次。然后,visual basic 将表达式的值与结构中的每个 case的值进行比较。如果相等,就执行与该 case 相关联的语句块。
select case testexpression
[caseexpressionlist1
[statementblock-1]]
[case expressionlist2
[statementblock-2]]
.
.
.
[caseelse
[statementblock-n]]
end select
每一个 expressionlist是一个或几个值的列表。如果在一个列表中有多个值,就用逗号把值隔开。每一个 statementblock 中含有零个或多个语句。如果不止一个case与测试表达式相匹配,则只对第一个匹配的 case 执行与之相关联的语句块。如果在表达式列表中没有一个值与测试表达式相匹配,则visual basic 执行 case else 子句(此项是可选的)中的语句。
例如,假定在 if…then…else的例子中要向“编辑”菜单添加命令。为此可以另加一个 elseif 子句,或用 select case 来写函数:
private submnucut_click (index as integer)
   select case index
      case0                  ‘“剪切”命令。
      copyactivecontrol         ’调用通用过程。
        clearactivecontrol
      case 1                  ‘“复制”命令。
        copyactivecontrol
      case 2                  ’“清除”命令。
        clearactivecontrol
      case 3                  ‘“粘贴”命令。
        pasteactivecontrol
      case else
        frmfind.show            ’显示找到的对话框。
   end select
end sub
注意select case 结构每次都要在开始处计算表达式的值。而 if…then…else 结构为每个 elseif 语句计算不同的表达式。只有在if 语句和每一个 elseif 语句计算相同表达式时,才能用 select case 结构替换 if…then…else 结构。



循环结构
循环结构允许重复执行一行或数行代码。visual basic 支持的循环结构有:
do…loop

for…next

foreach…next
do…loop
用 do 循环重复执行一语句块,且重复次数不定。do…loop语句有几种演变形式,但每种都计算数值条件以决定是否继续执行。如同 if…then condition 必须是一个数值或者值为 true(非零)或false(零)的表达式。
在下面的 do…loop 循环中,只要 condition 为 true 就执行 statements。
dowhile condition
statements
loop
当 visual basic 执行这个 do循环时会首先测试 condition。如果 condition 为 false(零),则跳过所有语句。如果 condition 为true(非零),则 visual basic 执行语句,然后退回到 do while 语句再测试条件。
因此,只要 condition 为true 或非零,循环可以随意执行多少次。如果 condition 一开始便为false,则不会执行语句。例如,以下过程将计算某一目标字符串在另一字符串中出现的次数,只要发现目标串就执行循环:
functioncountstrings (longstring, target)
   dim position, count
  position = 1
   do while instr (position, longstring, target)
      position= instr(position, longstring, target)_
       + 1
      count =count + 1
   loop
   countstrings = count
end function
如果目标字符串未出现在另一个字符串中,则 instr 返回 0,而且不再执行循环。
do…loop语句的另一种演变形式是先执行语句,然后在每次执行后测试 condition。这种形式保证 statements 至少执行一次:
do
statements
loopwhile condition
其它两种演变形式类似于前两个,所不同的是,只要 condition 为 false 而不是true,它们就执行循环。
循环零次或多次 至少循环一次
do until condition
statements
loopdo
statements
loop until condition

.
for…next
在不知道循环内需要执行多少次语句时,宜用 do 循环。但是,在知道要执行多少次时,则最好使用 for…next 循环。与 do 循环不同, for循环使用一个叫做计数器的变量,每重复一次循环之后,计数器变量的值就会增加或者减少。for 循环的语法如下:
for counter =start to end [step increment]
statements
next [counter]
参数counter、start、end 和 increment 都是数值型的。
注意   increment 参数可正可负。如果increment 为正,则 start 必须小于等于 end,否则不能执行循环内的语句。如果 increment 为负,则 start必须大于等于 end,这样才能执行循环体。如果没有设置 step,则 increment 缺省值为 1。
在执行 for循环时,visual basic
设置 counter 等于 start。

测试 counter 是否大于end。若是的话,则 visual basic 退出循环。
(若 increment 为负,则 visual basic 测试counter 是否小于 end。)
执行语句。

counter 增加一,或者增加 increment(如果已指定的话)。

重复步骤 2 到步骤 4。
以下代码打印出所有有效的屏幕字体名:
private sub form_click ()
  dim i as integer
   for i = 0 to screen.fontcount
      printscreen.fonts (i)
   next
end sub
在 vcr 示例应用程序中,highlightbutton过程使用 for…next 循环,一步步经过 vcr 窗体的控件集合,并显示适当的 shape 控件:
subhighlightbutton (mycontrol as variant)
   dim i as integer
   for i= 0 to frmvcr.controls.count – 1
      if typeof frmvcr.controls (i)is shape then
         if frmvcr.controls (i).name = mycontrol then
            frmvcr.controls(i).visible = true
         else
            frmvcr.controls(i).visible = false
         end if
      end if
   next
endsub
for each…next
for each…next 循环与 for…next循环类似,但它对数组或对象集合中的每一个元素重复一组语句,而不是重复语句一定的次数。如果不知道一个集合有多少元素, for each…next循环非常有用。
for each…next 循环的语法如下:
for each element in group
statements
nextelementt
例如,下面的子过程打开 biblio.mdb,把每一个表的名字加到列表框中。
sub listtabledefs()
   dim objdb as database
      dim mytabledef as tabledef
setobjdb = opendatabase(“c:\vb\biblio.mdb”, _
   true, false)
   foreach mytabledef in objdb.tabledefs ()
      list1.additemmytabledef.name
   next  mytabledef
end sub
请记住使用 for each…next时的几点限制:
对集合,element 只能是 variant 变量,或一般的 object 变量,或“对象浏览器”中列出的对象。

对数组,element 只能是 variant 变量。

for each…next 不能与用户自定义类型的数组一起使用,因为variant 不可能包含用户自定义类型。




使用控制结构
嵌套控制结构
可以把控制结构放入另一个控制结构之内(例如在 for…next 循环中的 if…then 块)。一个控制结构内部包含另一个控制结构叫做 nest(嵌套)。
在visual basic中,控制结构的嵌套层数没有限制。按一般习惯,为了使判定结构和循环结构更具可读性,总是用缩排方式书写判定结构或循环的正文部分。
例如,下面的过程要把打印机和屏幕共有的字体名全部打印出来:
private sub form_click ()
   dim sfont,pfont
   for each sfont in screen.fonts ()
      for each pfont inprinter.fonts ()
         if sfont = pfont then
            printsfont
         end if
      next pfont
   next sfont
endsub
注意,第一个 next 关闭了内层的 for 循环,而最后一个 for 关闭了外层的 for 循环。同样,在嵌套的 if语句中,end if 语句自动与最靠近的前一个 if 语句配对。嵌套的 do…loop 结构的工作方式也是一样的,最内圈的 loop语句与最内圈的 do 语句匹配。
退出控制结构
用 exit 语句可以直接退出 for 循环、do 循环、子过程或函数过程。exit语句的语法很简单:exit for 在 for 循环中出现的次数没有限制,exit do 在 do 循环中出现的次数也没有限制。
forcounter = start to end [step increment]
[statementblock]
[exitfor]
[statementblock]
next [counter[, counter] [,...]]
do[{while | until} condition]
[statementblock]
[exit do]
[statementblock]
loop
exitdo 语句可以在 do 循环语法的所有版本中使用。
exit for 和 exit do非常有用,因为它有时适于立即退出循环,而且不再执行循环中的任何进一步迭代或者语句。例如,在前面的打印屏幕和打印机共有字体的例子中,程序不断将打印机字体和给定的屏幕字体作比较,甚至在已经找到了一个相符的打字机字体后还在继续寻找。对这个函数有一个效率更高的改进版,在此,只要找到相匹配的字体后就立即退出循环:
private sub form_click ()
   dim sfont, pfont
   foreach sfont in screen.fonts ()
      for each pfont in printer.fonts()
         if sfont = pfont then
            print sfont
            exitfor            ‘退出内圈循环。
         end if
      next pfont
  next sfont
end sub
正如此例所表明的, exit 语句几乎总是出现在 if 语句或 select case语句内部,而 if 语句或 select case 语句在循环内嵌套。
用 exit语句中断循环时,计数器变量的值会因退出循环的方式而不同:
在完成循环时,计数器的值等于上限值加上步进值。

在提前退出循环时,计数器变量保持其值,并遵从有关取值范围的一般规则。

在集合之外叠代时,如果计数器变量为 object 类型,则其值为nothing;如果计数器变量为 variant 类型,则其值为 empty。
退出子过程或函数过程
也可从控制结构内部退出过程。exit sub 和 exit function 的语法,和上一节“退出控制结构”中的 exit for 和 exit do 相似。exitsub 可以出现在子过程主体内的任何地方,出现的次数随需要而定。
当过程已完成每个任务并可直接返回时,exit sub 和 exitfunction 是非常有用的。例如,如果想改动前面的例子,使得对查找到的打印机和屏幕的共有字体,只打印其中的第一个,则可用 exit sub :
privatesub form_click ()
   dim sfont, pfont
   for each sfont inscreen.fonts ()
      for each pfont in printer.fonts ()
        if sfont = pfont then
            print sfont
            exitsub            ’退出过程。
         end if
      next pfont
   nextsfont
end sub

VB编程基础教程14–控制结构 | 异次元软件世界 VB编程基础教程1–编码基础 | 异次元软件世界 VB编程基础教程5–静态变量 | 异次元软件世界 VB编程基础教程6–常数 | 异次元软件世界 VB编程基础教程9–数组 | 异次元软件世界 VB编程基础教程10–动态数组 | 异次元软件世界 VB编程基础教程11–过程 | 异次元软件世界 VB编程基础教程12–使用过程 | 异次元软件世界 VB编程基础教程15–使用对象 | 异次元软件世界 VB编程基础教程17–创建对象 | 异次元软件世界 VB编程基础教程21–优化 | 异次元软件世界 VB编程基础教程2–变量 | 异次元软件世界 VB编程基础教程9–数组 | 异次元软件世界999 VB编程基础教程9–数组 | 异次元软件世界 VB编程基础教程17–创建对象 | 异次元软件世界 VB编程基础教程3–理解变量的范围 | 异次元软件世界 VB编程基础教程4–高级变量主题 | 异次元软件世界 VB编程基础教程8–高级变量主题 | 异次元软件世界 VB编程基础教程13–向过程传递参数 | 异次元软件世界 VB编程基础教程16–对象之间的关系 | 异次元软件世界 VB编程基础教程18–在应用程序中使用DLL过程 | 异次元软件世界 VB编程基础教程19–界面设计的基础 | 异次元软件世界 VB编程基础教程20–坐标系统概述 | 异次元软件世界 VB编程基础教程8–高级变量主题 | 异次元软件世界