跳轉到內容

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 語句阻止了子程式的重新執行。

子程式不返回值,而函式返回值。子程式也可以更改引數的值,而函式應該保持不變。

華夏公益教科書