第24节 程序的基本结构

VB程序是由一些过程和函数组成的,程序过程的结构是:
    Private Sub <过程名>([参数])
      <VB语句>
    End Sub
例如:前面我们见到的程序过程都是VB窗体的Activate事件过程即激活事件过程。
    Rem 过程结构
    Private Sub Form_Activate()     '关于窗体的激活事件过程
      r = 50 '圆的半径
      Print "L="; 2 * 3.14 * r      '计算圆的周长
    End Sub              '运行程序后系统自动执行窗体的激活事件过程
  程序过程的基本规则:   

      • 程序一般是按自上而下的顺序执行的;
      • 程序中的语句书写不区分字母的大小写;
      • 一个语句可以写在多行上,续行符号是空格与下划线字符;
      • 一行可以写多个语句,多个语句之间用冒号分隔;
      • Rem和单引号开头的语句是注释语句,机器不执行,注释语句可以放在程序的任何位置。

  在程序设计的过程中要本着结构化的程序设计思想编写程序,结构化程序设计思想的基本原则之一是:编写的程序要由三种基本结构组成,即顺序结构、循环结构和选择结构。
1
. 程序的顺序结构
  顺序结构不仅是程序的基本结构也是程序的一般结构,也就是说用基本结构组成的程序从总体上看都具有顺序结构的特点,对于这点我们会在今后的学习中分析和体会。
  在此之前我们遇到的程序都是具有顺序结构的程序,顺序结构可以用以下框图直观的表示。
顺序结构框图:

  流程图表示的顺序结构 N-S框图表示的顺序结构

流程图表示的顺序结构

N-S框图表示的顺序结构

  以上框图中的ABC分别是具有基本结构的程序段。
  例1:读以下顺序结构程序写出程序的运行结果

1
 Private Sub Form_Activate()
  a = 8: b = 5
  t = a: a = b: b = t
  Print "a="; a
  Print "b="; b
 End Sub
 
运行结果:
 a=5
 b=8

2
 Private Sub Form_Activate()
  a = 8: b = 5
  a = a + b
  b = a - b
  a = a - b
  Print "a="; a "b="; b
 End Sub
 
运行结果:
 a=5     b=8

  上面两个程序在执行时是按照自而下的顺序执行的都是顺序结构的程序,在做这两题时,除了注意程序的结构和语句功能外,还要注意输出格式上的区别。你自己可以给自己出几道只有顺序结构的题目来编写程序。

2
. 程序的循环结构
 具有循环结构的程序框图如下:

 

2:打印输出10000以内的奇数
  Private Sub Form_Activate()
   For a=1 To 10 Step 2
    Print a
   Next a
  End Sub

分析:程序中的循环变量在循环过程中的变化规律,不仅控制了循环的次数,也是奇数的变化过程。即循环变量不仅控制循环的次数,也在循环体中出现。

3:打印输出10“*”
  Private Sub Form_Activate()
   For a=1 To 10 Step 1
    Print “*”
   Next a
  End Sub

分析:
  程序中的循环变量在循环过程中仅用来控制循环的次数,循环变量在循环体中不出现。
  当循环语句中循环的步长值为1时可以不写,即For语句为For a=1 To 10时步长值默认为1

  以上两题都是用具有循环结构的For循环语句控制完成的,For语句由循环初始语句和循环终端语句构成,它们控制循环的过程如下:(如例1)
1)执行循环初始For语句,把循环初值1赋给循环变量a,并分别存储循环终值10、步长值2。用循环变量的当前值与终值比较,若超过循环终值退出循环结构,执行Next后面的语句,若不超过循环终值执行循环体的各语句。
2)执行循环终端Next语句,计算机把循环变量a的当前值加上步长值2,再赋给循环变量a,然后重复上面与循环终值比较的过程。 即用循环变量的当前值与终值比较,若超过循环终值,退出循环结构,执行Next后面的语句,若不超过循环终值执行循环体的各语句。(在循环过程中被重复执行的语句我们称为循环体)
  对该循环的控制过程和语法规定分析如下:

问题:
  若把例1和例2Print语句结尾的分号换成逗号后输出结果会有什么变化?
  若把例1和例2Print语句结尾的分号去掉后输出结果会有什么变化?

4:步长为负数的循环控制
 Private Sub Form_Activate()
  For i=9 TO 2 STEP –2
   Print i,
  Next i
 End Sub
 程序的运行结果:
 9   7   5   3

分析:
  在本题中循环初值大,循环终值小,循环的步长值是负数,当第一次执行Next i语句时,循环变量的当前值加上的步长值是负数,所以得到的新的循环变量的值为7,在程序运行的过程中循环变量的值是朝着负方向变化的,所以对于超过终值 的判断的概念不应理解为大于”,而应理解为界限的超越。

  在执行For语句的循环控制时循环变量与循环终值比较时超过的含义如下图:

 

5:累加和累乘的运算
 Private Sub Form_Activate()
  s = 1: f = 0
  For k = 1 To -8 Step -3
   s = s * k
   f = f + k
   Print k
  Next k
  Print "s="; s , "f="; f
  Print k
 End Sub
 程序的运行结果:
 1
 -2
 -5
 -8
 s=-80    f=-14
 -11

分析:
  本题实现的是在循环过程中循环变量值的累乘和累加。在程序中用变量s存放循环过程中循环变量累乘的结果,用变量f存放循环过程中循环变量累加的结果。
  在循环控制语句的前面,为累乘循环变量s赋初值1,为累加循环变量f赋初值0。 在循环体中用赋值语句s=s*k实现累乘,用赋值语句f=f+k实现累加。如果将“=”看作等号这些式子是不成立的,但是在这里“=”是赋值号,语句是赋值语句,在程序执行到这些语句时会先计算 “=”右边表达式的值,然后将计算的结果赋予“=”左边的变量。语句的执行过程所产生的两个动作是先计算后赋值,所以f=f+k这样的语句,变量f中存放的值在计算表达式时与赋值后一般是不同的,正是这种特点很好的实现了累乘和累加的计算。

 

6.退出循环后循环变量的值
 Private Sub Form_Activate()
  For a=1 To 6 Step 2
   Print a
  Next a
  Print “a=”a
 End Sub
 程序的运行结果:
 1
 3
 5
 a=7

分析:
  本题在循环过程中输出了6以内的奇数,退出循环后,再次输出循环变量的值,如果对循环控制过程理解错误,你可能认为退出循环后输出的是a=5,而当程序退出循环后,循环变量的值应该是超过循环终值的,所以对于本例最后输出的是a=7
  如果在程序退出循环后,还要利用循环变量的值时,要注意循环变量的当前值。

练习:读程序写出程序的运行结果

1.
 Private Sub Form_Activate()
  s=0
  For a=1 To 5
   s=s+(a+3)
  Next a
  Print “s=”s ,“s/a=”s/a
 End Sub

2.
 Private Sub Form_Activate()
  x=3.1415926
  For n=1 To 7
   pi=Fix(x*10^n+0.5)/10^n
   Print “pi=”pi
  Next n
 End Sub

3.
 Private Sub Form_Activate()
  For n=4 To 7
   m=n+2
   Print n*10+m
  Next n
 End Sub

4
 Private Sub Form_Activate()
  For x=54 To 59 Step 2
   m=Fix(x/10)
   n=x-m*10
   Print m n
  Next x
 End Sub

3. 程序的分支结构
  按照某一条件的成立与否来决定程序的执行内容,是处理问题中经常要遇到的程序步骤,BASIC语言中控制这种功能的结构称为分支结构(或称选择结构),分支结构是程序设计的三种基本结构之一。
  具有选择结构的程序框图如下:


7:求分段函数的值
   

 Private Sub Form_Activate()
  x = InputBox("输入x的值", "数据输入框"5)
  
If x >= 5 Then
   y = 2 * x + 5
  Else
   y = 5 * x - 3
  End If

  Print y
 End Sub

  关于程序中的键盘输入语句: x = InputBox("输入x的值", "数据输入框")
键盘输入语句是在程序运行中给变量提供数据的语句,当程序执行到该语句时会出现以下对话框:

  在对话框输入数据处输入数据后按确定按钮,输入的数据会被存入“=”左边的变量中。程序执行完该语句后悔按顺序执行下面的语句:
  关于程序中的条件语句:
  块结构条件语句的一般格式为:
    
If <条件式> Then
      <语句组A>
    Else
      <语句组B>
    End If

  • 条件语句功能:
    <条件式>成立时执行Then后面的<语句组A>,然后执行下一句;
    否则执行Else后面的<语句组B>,然后执行下一句。
    以上程序的框图如下:

  •  

 Rem 块结构条件语句的程序:
 Private Sub Form_Activate()
  x = InputBox("输入x的值", "数据输入框")
  
If x >= 5 Then
    y = 2 * x + 5
  Else
    y = 5 * x–3
  End If

  Print y
 End Sub

  • 语句的语法规则是系统规定的,在使用语句时要按规则规定的语句格式书写。
    8:求分段函数的值
       

 Rem 没有Else的块结构条件语句:
 Private Sub Form_Activate()
  x = InputBox("输入x的值", "数据输入框")
  
If x < 0 Then
    x = - x
  End If
  y = x
  Print y
 End Sub

  块结构:
         .
         .
     If <条件式> Then
       <语句组A>
     End If
     <语句组B>
         .
         .
  请比较行结构和块结构条件语句书写格式的区别。
  没有Else的分支结构框图:

  

以上我们用单一结构的简单例子说明了程序的三种基本结构,即顺序结构、循环结构和分支结构。后面我们还会对由基本结构组合而成的程序进行结构分析。以便理解结构化的程序设计思想。