跳轉到內容

程式設計基礎:函式和過程

來自華夏公益教科書

試卷 1 - ⇑ 程式設計基礎 ⇑

← 隨機數生成 子程式(函式和過程) 全域性變數和區域性變數 →


為了避免一遍又一遍地重寫大量的程式碼,您可以使用子程式,子程式有兩種型別:過程和函式。例如,在程式中,如果您想了解今天的日期,而不是每次想要計算日期時都編寫一個單獨的子程式,您可能可以使用 date()。這是一個函式,當您呼叫它時,它會返回一個值。它是由其他人編寫的,您可以根據需要重複使用它。在行業中編寫的任何程式都會使用子程式來呼叫諸如:console.writeline(), printScore(), deleteRecord() 之類的東西。過程和函式允許您

  • 重用程式碼
  • 構建您的程式設計結構
  • 輕鬆地將其他人的程式碼整合進來

區分過程和函式的一個簡單方法是看它們的名稱

  • 函式很有趣:如果您呼叫它們,它們會返回一個值
  • 過程不好玩:如果您呼叫它們,它們不會返回任何值。(這些在 Visual Basic 中被稱為 sub

函式和過程之間的區別比這更復雜,但上述內容可以作為一個經驗法則

宣告是在您宣告過程/函式的名稱以及您想要執行的程式碼的地方。即使您聲明瞭一個過程/函式,也不意味著程式碼會執行,您需要一個 _呼叫_ 來真正執行程式碼。

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)

輸出將是

   程式碼輸出

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)

輸出將是

   程式碼輸出

Mounir 17 歲


'declaration
function squareNumber(number1 as integer) as integer 'one parameter
	return (number1 * number1)
End Function
'...
'call
console.writeline(squareNumber(4))

請注意,由於這是一個函式,我們必須將呼叫包含在一個方程式中。它返回一個值,它不能獨立存在。輸出將是

   程式碼輸出

16


練習:函式和過程

函式和過程有什麼區別?

答案

函式返回的值,過程可能返回也可能不返回值。


為什麼要在程式碼中使用子程式(函式和過程)?

答案

  • 它們幫助您構建程式碼結構
  • 它們允許您只建立一個通用例程,然後根據需要重複使用
  • 它們允許您與其他程式共享程式碼
  • 它們允許您獨立於其他程式碼測試子程式


編寫一個函式宣告,其識別符號為 Avg,該函式將接受 3 個數字(num1、num2、num3)並返回平均值

答案

Function Avg(num1, num2, num3)
  return (num1 + num2 + num3) / 3
End Function


對於上面的函式,編寫包含函式呼叫以計算使用者輸入的三個數字的平均值的程式碼

   程式碼輸出

num1 = 4
num2 = 7
num3 = 10
平均值 = 7

答案

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

對於上面的過程,列出

  • 識別符號
  • 引數,它們是什麼資料型別?
  • 建立一個過程呼叫以列印 5 次名稱 "Kane"。

答案

  • 識別符號 = nameTimes
  • 引數 = name(字串)和 num(整數)
  • nameTimes("Kane", 5)

您傳遞給過程或函式的引數被稱為引用。這意味著您指向它,您將直接更改它的值,並且在過程或函式中對它進行的任何更改都會更改原始值。

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

輸出將是

   程式碼輸出

123
124
124


您傳遞給過程或函式的引數會被複制。這意味著您取的是傳遞到過程或函式呼叫中的原始值的副本。在過程或函式中對它進行的任何更改都不會更改原始值。

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 子程式內有效。輸出將是

   程式碼輸出

123
124
123


練習: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` 時,上面的程式碼的輸出是什麼?

答案

   程式碼輸出

7


當 `ByXXX = ByRef` 時,上面的程式碼的輸出是什麼?

答案

   程式碼輸出

15


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

上面的程式碼的輸出是什麼?

答案

   程式碼輸出

hello - goodbye
hello - hello


按值傳遞的引數和按引用傳遞的引數有什麼區別?

答案

按值傳遞的引數會複製傳遞到子程式中的引數的值。對該值進行的任何更改都不會影響原始值。

按引用傳遞的引數會傳遞到變數的連結。對子程式中的引數進行的任何更改都會更改原始變數。

華夏公益教科書