程式設計基礎:函式和過程
為了避免一遍又一遍地重寫大量的程式碼,您可以使用子程式,子程式有兩種型別:過程和函式。例如,在程式中,如果您想了解今天的日期,而不是每次想要計算日期時都編寫一個單獨的子程式,您可能可以使用 date()。這是一個函式,當您呼叫它時,它會返回一個值。它是由其他人編寫的,您可以根據需要重複使用它。在行業中編寫的任何程式都會使用子程式來呼叫諸如:console.writeline(), printScore(), deleteRecord() 之類的東西。過程和函式允許您
- 重用程式碼
- 構建您的程式設計結構
- 輕鬆地將其他人的程式碼整合進來
區分過程和函式的一個簡單方法是看它們的名稱
- 函式很有趣:如果您呼叫它們,它們會返回一個值
- 過程不好玩:如果您呼叫它們,它們不會返回任何值。(這些在 Visual Basic 中被稱為
sub)
函式和過程之間的區別比這更復雜,但上述內容可以作為一個經驗法則
| 在 VB.NET 中,您使用 `Sub` 命令來宣告過程,因此在您看到下面的 `Sub` 時,請將其讀作 `Procedure` |
宣告是在您宣告過程/函式的名稱以及您想要執行的程式碼的地方。即使您聲明瞭一個過程/函式,也不意味著程式碼會執行,您需要一個 _呼叫_ 來真正執行程式碼。
Sub printNumber()
console.writeline(number1)
End Sub
函式略有不同,因為它們返回的值必須在它們的宣告中包含一個返回函式。並且您必須指定要返回的值的資料型別,在下面的示例中,該資料型別是透過:`..) as Integer` 指定的整數
Function printNumber() as Integer
return number1
End Function
呼叫允許您執行在過程/函式中宣告的程式碼。透過將呼叫作為程式碼的一部分,您可以構建各種程式設計結構。請記住,函式很有趣,因此您應該對返回的值做一些事情。
printNumber() ' a procedure call
console.writeline(printNumber()) ' a function call
dim x = MaximumSpeed() ' another function call
引數允許您將值傳遞給您宣告的過程和函式,您可以傳遞各種資料作為引數,並且可以傳遞任意多個引數。
|
擴充套件:引數與實參 引數通常被稱為實參。從技術上講,它們非常相似,但並不相同。當您描述一個過程或函式,並識別它可以接受的資料時,每個資料都是一個引數。當您稍後在程式中使用過程或函式,併為它提供實際的資料(或多個數據)時,這些資料被稱為實參。在實踐中,這兩個術語經常互換使用(例如,參見 StackOverflow:引數和實參的區別?) |
'declaration
Sub printNumber(number1 as integer) 'one parameter
console.writeline(number1)
End Sub
'...
'call
printNumber(4)
輸出將是
'declaration
Sub printNameAge(name as string, age as integer) 'two parameters
console.writeline(name & " is " & age & " years old")
End Sub
'...
'call
printNameAge("Mounir", 17)
輸出將是
'declaration
function squareNumber(number1 as integer) as integer 'one parameter
return (number1 * number1)
End Function
'...
'call
console.writeline(squareNumber(4))
請注意,由於這是一個函式,我們必須將呼叫包含在一個方程式中。它返回一個值,它不能獨立存在。輸出將是
|
練習:函式和過程 函式和過程有什麼區別? 答案 函式返回的值,過程可能返回也可能不返回值。
為什麼要在程式碼中使用子程式(函式和過程)? 答案
編寫一個函式宣告,其識別符號為 Avg,該函式將接受 3 個數字(num1、num2、num3)並返回平均值 答案 Function Avg(num1, num2, num3)
return (num1 + num2 + num3) / 3
End Function
答案 dim a, b, c as integer
console.write("input num1 = ")
a = console.readline()
console.write("input num2 = ")
b = console.readline()
console.write("input num3 = ")
c = console.readline()
console.write("Average = " & Avg(a,b,c))
Sub nameTimes(name, num)
for x = 1 to num
console.writeline(name)
next
End Sub
對於上面的過程,列出
答案
|
您傳遞給過程或函式的引數被稱為引用。這意味著您指向它,您將直接更改它的值,並且在過程或函式中對它進行的任何更改都會更改原始值。
Dim number1 as integer = 123
Sub Main()
console.writeline(number1)
IncPrintNumber(number1)
console.writeline(number1)
End Sub
Sub IncPrintNumber(ByRef num as integer)
num = num + 1
console.writeline(num)
End Sub
輸出將是
您傳遞給過程或函式的引數會被複制。這意味著您取的是傳遞到過程或函式呼叫中的原始值的副本。在過程或函式中對它進行的任何更改都不會更改原始值。
Dim number1 as integer = 123
Sub Main()
console.writeline(number1)
IncPrintNumber(number1)
console.writeline(number1)
End Sub
Sub IncPrintNumber(ByVal num as integer)
num = num + 1
console.writeline(num)
End Sub
這會儲存 number1 值的區域性變數,將其儲存在 num 中,它僅在 IncPrintNumber 子程式內有效。輸出將是
|
練習:ByRef 和 ByVal Sub Main()
dim a as integer = 7
dim b as integer = 8
Add(a,b)
console.writeline(a)
End Sub
Sub Add(ByXXX num1 as integer, ByXXX num2 as integer)
num1 = num1 + num2
End Sub
當 `ByXXX = ByVal` 時,上面的程式碼的輸出是什麼?
當 `ByXXX = ByRef` 時,上面的程式碼的輸出是什麼?
Sub Swap(ByRef p as string, ByVal q as string)
dim temp as string
temp = p
p = q
q = temp
console.writeline(p & " - " & q)
End Sub
Sub Main()
dim s1 as string = "hello"
dim s2 as string = "goodbye"
Swap(s2, s1)
console.writeline(s2 & " - " & s1)
End Sub
上面的程式碼的輸出是什麼?
按值傳遞的引數和按引用傳遞的引數有什麼區別? 答案 按值傳遞的引數會複製傳遞到子程式中的引數的值。對該值進行的任何更改都不會影響原始值。 按引用傳遞的引數會傳遞到變數的連結。對子程式中的引數進行的任何更改都會更改原始變數。 |
