跳转到内容

BASIC 编程/子程序和函数

来自维基教科书,开放的书籍,为开放的世界

函数和子程序是可以重复使用的代码行。函数和子程序的目的是通过调用它们来节省时间和空间。两者之间几乎没有区别,除了函数返回一个值,而子程序只是重复代码行(函数不总是被重复使用)。

举个函数的例子,比如你正在做一个计算销售税的程序。该函数将要求输入一个小计,然后将该数字乘以 1.07(如果销售税是 7%,1 代表你需要在小计上加上销售税来得到总计,而不是单独计算销售税)。该函数将使用新得到的总计并将其返回给程序。

子程序将是重复使用的代码,就像游戏中的商店一样。每次用户进入商店时,程序都会返回到商店子程序,如果用户购买了商品,它将调用一个“购买商品”函数。

参数在函数和子程序中使用。它们传递数据以供函数/参数使用。对于我们两个例子来说

Function Parameters) The Subtotal passed to the function is a parameter.
Subroutine Parameters) The player's amount of gold could be sent to the subroutine so the shop
knows how much money the player can spend.

有两种不同的方法可以发送参数:按值或按引用。按值意味着函数不能真正改变函数之外的数据,但可以使用其数据来操作要返回的其他数据。按值就像复制一份纸,然后编辑副本一样。按引用将实际参数(参数)发送到函数/子程序,就像编辑原始纸张一样。按值被写成ByVal,按引用被写成ByRef

忽略行号,它们用于解释代码。
示例 1 (FreeBASIC)

1. Declare Function salesTax(ByVal subTotal As Double) As Double
2. Dim SubTotal2 As Double
3. Dim Total2 As Double
4. SubTotal2 = 10.00
5. Total2 = salesTax(SubTotal2)
6. Print "Subtotal:" ; SubTotal2
7. Print "Total:" ; Total2
8. Sleep
9. End
10.
11. Function salesTax(ByVal subTotal As Double) As Double
12.   Dim Total As Double
13.   Total = subTotal*1.07
14.   return Total
15. End Function



1. 这一行是函数的原型。函数必须在使用之前声明为原型,并且必须在end(程序的末尾)语句之后定义。Function 意味着以下内容与函数相关。salesTax 是函数的标识符或名称,括号中是参数(如果你有多个参数,用逗号分隔它们)。括号后面是函数返回的数据类型。Double 是一种数据类型,表示带小数的数字 (00.00)。
2. 创建 SubTotal2 变量(参数不能与现有标识符相同)。
3. 创建 Total2 变量。
4. 将 SubTotal2 的值定义为 10.00(更改此值以获得新的输出)。
5. 通过将 SubTotal2 作为参数传递给 salesTax 函数来定义 Total2(Total2 的值将是函数返回的值)。
6. 显示小计。
7. 显示总计。
8. 等待用户按下回车键(这样你就可以在它在一秒钟内闪烁消失之前读取输出)。
9. 结束程序(从某种意义上说。你不能在 End 点之后与用户交互)。
10. 空行,更容易阅读代码。
11. 这是你定义函数的地方,前面你声明了函数。
12. 创建变量 Total(这个变量只能在函数中使用,因为它是在函数中定义的。这被称为变量范围)。
13. 你不需要声明 subTotal,因为它被定义为一个参数,这个数学计算了带销售税的总计并将它赋给变量 Total。
14. 这就是第 5 行接收的东西,函数输出变量 Total。
15. 结束函数定义。

GOSUB ... RETURN Statement

目的

分支到子程序并从子程序返回。语法

GOSUB line number
.
.
.
RETURN [line number]

注释

行号是子程序的第一行行号。

子程序可以在程序中被调用任意次数,并且子程序可以在另一个子程序内部被调用。这种子程序的嵌套仅受可用内存的限制。

子程序中的 RETURN 语句导致 GW-BASIC 返回到最近的 GOSUB 语句后面的语句。子程序可以包含多个 RETURN 语句,如果逻辑需要在子程序的不同位置进行 RETURN。

子程序可以出现在程序的任何地方,但必须与主程序区分开来。

为了防止意外进入,在子程序之前使用 STOP、END 或 GOTO 语句来引导程序控制绕过子程序。示例

10 GOSUB 40
20 PRINT "BACK FROM SUBROUTINE"
30 END
40 PRINT "SUBROUTINE";
50 PRINT " IN";
60 PRINT " PROGRESS"
70 RETURN
RUN
SUBROUTINE IN PROGRESS
BACK FROM SUBROUTINE

第 30 行的 END 语句阻止了子程序的重新执行。

子程序不返回值,而函数返回值。子程序也可以更改参数的值,而函数应该保持不变。

华夏公益教科书