跳转到内容

编程基础:函数和过程

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

试卷 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


按值传递的参数和按引用传递的参数有什么区别?

答案

按值传递的参数会复制传递到子程序中的参数的值。对该值进行的任何更改都不会影响原始值。

按引用传递的参数会传递到变量的链接。对子程序中的参数进行的任何更改都会更改原始变量。

华夏公益教科书