一个子例程是一个较大的程序中实现特定功能的一小段代码,子例程可以在程序的任意位置被调用。子例程由一个以Sub 关键字开头的名字标识并以EndSub 关键字结束。例如,下面的代码段表示了一个叫做PrintTime(打印时间)的子例程,它可以把当前时间显示到TextWindow(文本窗口)中。
Sub PrintTime
TextWindow.WriteLine(Clock.Time)
EndSub
下面的程序包含了该子例程并从多个地方调用它。
PrintTime()
TextWindow.Write("Enter your name: ")
name = TextWindow.Read()
TextWindow.Write(name + ", the time now is: ")
PrintTime()
Sub PrintTime
TextWindow.WriteLine(Clock.Time)
EndSub
图 44 – 调用一个简单子例程
您可以通过调用SubroutineName() 来执行子例程。通常地,符号“()” 对于告诉计算机您打算执行一个子例程是必需的。
如我们在上边看到的,子例程帮助我们减少了大量编程时输入的代码。一旦子例程PrintTime 写好了,您就可以从程序的任意地方调用它来显示当前时间。
此外,子例程帮助我们将复杂问题简化为较简单的片段。比方说您有一个复合公式要求解,您可以编写几个子例程先求解该复合公式的较小的部分。然后您可以把结果合并起来求解原始的复合公式。
子例程还能帮助提高程序的可读性。换句话说,如果您的程序中公用部分都是名称清楚的子例程,您的程序就会变得容易读和理解。如果您想理解其他人写的程序或者您希望您的程序能被其他人理解,子例程尤为重要。有时,子例程对于您理解您自己的程序也会有帮助,比方您一周前写的程序。
您可以在子例程内访问和使用程序中的任何变量。作为例子,下面的程序接受两个数并打印出较大的那个数。请注意变量 max(最大)同时在子例程内部和外部被使用。
TextWindow.Write("Enter first number: ")
num1 = TextWindow.ReadNumber()
TextWindow.Write("Enter second number: ")
num2 = TextWindow.ReadNumber() FindMax()
TextWindow.WriteLine("Maximum number is: " + max)
Sub FindMax
If (num1 > num2) Then
max = num1
Else
max = num2
EndIf
EndSub
程序输出如下所示。
图 45 – 使用子例程得到较大数
让我们看另一个例子以说明子例程的用法。这次我们使用一个图形程序计算以变量 x 和 y 存储的点。然后调用一个子例程DrawCircleUsingCenter 来绘制以 x 和 y 为圆心的圆。
GraphicsWindow.BackgroundColor = "Black"
GraphicsWindow.PenColor = "LightBlue"
GraphicsWindow.Width = 480
For i = 0 To 6.4 Step 0.17
x = Math.Sin(i) * 100 + 200
y = Math.Cos(i) * 100 + 200
DrawCircleUsingCenter()
EndFor
Sub DrawCircleUsingCenter
startX = x - 40
startY = y - 40
GraphicsWindow.DrawEllipse(startX, startY, 120, 120)
EndSub
图 46 – 图形子例程示例
有时子例程可在循环内被调用,那段时间内子例程执行同一组语句但处理一个或多个变量的不同值。例如,您有个判断一个数是否为质数的子例程PrimeCheck(质数检测)。您可以写一个程序让用户输入一个数然后您的程序通过子例程判断这个数是否为质数。参见下面的程序。
TextWindow.Write("Enter a number: ")
i = TextWindow.ReadNumber()
isPrime = "True"
PrimeCheck()
If (isPrime = "True") Then
TextWindow.WriteLine(i + " is a prime number")
Else
TextWindow.WriteLine(i + " is not a prime number")
EndIf
Sub PrimeCheck
For j = 2 To Math.SquareRoot(i)
If (Math.Remainder(i, j) = 0) Then
isPrime = "False"
Goto EndLoop
EndIf
Endfor
EndLoop:
EndSub
PrimeCheck子例程得到 i 的值并试图用较小的数来除它。如果有一个数能整除i ,说明i 不是质数。这时子例程将isPrime 的值设为“False”(假)并退出。如果这个数不能被更小的数整除那么它的isPrime 值仍保持为“True”(真)。
图 47 – 质数检测
现在您有一个可以作质数检测的子例程了,您也许想用它列出比如 100 之内的所有质数。我们可以很容易地修改程序从一个循环中调用PrimeCheck 来实现。每次循环运行时都会给子例程一个不同的数。让我们通过下面的例子来解释。
For i = 3 To 100
isPrime = "True"
PrimeCheck()
If (isPrime = "True") Then
TextWindow.WriteLine(i)
EndIf
EndFor
Sub PrimeCheck
For j = 2 To Math.SquareRoot(i)
If (Math.Remainder(i, j) = 0) Then
isPrime = "False"
Goto EndLoop
EndIf
Endfor
EndLoop:
EndSub
上面的程序中,i 的值在每次循环时都被更新。在循环内部,有一个到子例程PrimeCheck 的调用。子例程PrimeCheck 取得 i 的值并计算 i 是否为质数。结果保存在变量isPrime 中并可在子例程外部被循环所访问。如果i 是质数则它的值会被打印出来。由于循环从 3 开始直到 100,我们就得到了 3 到 100 间的所有质数的列表。下面是程序运行结果。
图 48 – 质数
结构化程序设计是采用顺序结构、选择结构(IF语句)、循环结构(FOR,WHILE语句)、子程序等来进行程序设计的一种编程典范。
事件就像被触发的信号,例如,为了应对类似移动或点击鼠标的用户操作。某种程度上说,事件同操作是相对的。对于操作,您作为一个程序员调用操作让计算机做一些事情;然后对于事件,计算机通知您一些有意思的事情发生了。
Small Basic 语言中也引入了 Turtle (龟标)对象,编程人员可以通过Small Basic 自带的很多命令调用这个对象。
在这一章节中,我们将运用前面学到的知识来做一些有趣的事。
Small Basic 还有一组强大的图形功能。
如果我们的程序能够对用户的姓名说“你好”而不只是单纯的“世界你好”,那样不是更好吗?
一个程序是一组计算机指令。这些指令准确地告诉计算机做什么,并且计算机总是遵循这些指令。就像人们一样,计算机只能遵循用它们能明白的语言指定的指令。这些语言被称为编程语言。有非常多的语言计算机能明白,Small Basic 是其中之一。
微软 Small Basic 将“乐趣”重新投入到计算机编程中。有一个友好的开发环境,很容易掌握,它使儿童和成人都容易进入编程的世界。