第 6 章 函数和过程

29
东东东东东东东东东 东东东东东东东东东 2008-9-15 2008-9-15 VB.NET 程程程程东1东16 6 东东东东东 东东东东东 东东东东 东东东东 东东东东东东东东东 东东东东东东东东东 东东东东东东东东 东东东东东东东东 东东 东东 东东东东东东 东东东东东东

description

第 6 章 函数和过程. 主要内容 函数和过程基本概念 函数和过程的使用 参数传递 模块与作用域. 函数. VB.NET 系统提供好的各种数学、字符串处理等函数 L = Len(S) 返回字符串 S 的长度. 用户自定义函数. [ Public|Private] Function 函数名 ([ 参数表 ]) [As 类型 ] 语句块 ….. [ 函数名=返回值 ] [Exit Function] 语句块 ….. 函数名=返回值 End Function. 用户自定义函数 (cont.). - PowerPoint PPT Presentation

Transcript of 第 6 章 函数和过程

Page 1: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 1)

第第 66 章章 函数和过程 函数和过程

主要内容主要内容 函数和过程基本概念函数和过程基本概念 函数和过程的使用函数和过程的使用 参数传递参数传递 模块与作用域模块与作用域

Page 2: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 2)

函数函数

VB.NETVB.NET 系统提供好的各种数学、字符串系统提供好的各种数学、字符串处理等函数处理等函数

L = Len(S)L = Len(S) 返回字符串返回字符串 SS 的长度的长度

Page 3: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 3)

用户自定义函数用户自定义函数

[[Public|Private] Function Public|Private] Function 函数名 函数名 ([([ 参数表参数表 ]) [As ]) [As 类类型型 ]]

语句块语句块 …….... [[ 函数名=返回值函数名=返回值 ]] [Exit Function][Exit Function] 语句块语句块 …….... 函数名=返回值函数名=返回值End FunctionEnd Function

Page 4: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 4)

用户自定义函数 用户自定义函数 (cont.)(cont.)

参数表使用 参数表使用 ByValByVal 或 或 ByRef ByRef 定义定义

例如:例如: ByVal m As IntegerByVal m As Integer ByRef n As SingleByRef n As Single ByVal a() as IntegerByVal a() as Integer

Page 5: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 5)

阶乘函数 阶乘函数 (( 例例 6-1)6-1)

Function Factorial(ByVal n As Integer) As LongFunction Factorial(ByVal n As Integer) As Long'' 自定义函数过程自定义函数过程

Dim i As Integer, nn As LongDim i As Integer, nn As Long nn = 1 nn = 1 '' 阶乘初阶乘初

始值 始值 If n < 0 Then 'If n < 0 Then ' 不允许负不允许负

值值 Exit FunctionExit Function End IfEnd If For i = 1 To nFor i = 1 To n nn = nn * i nn = nn * i ' ' 计算阶计算阶

乘乘 Next iNext i Factorial = nnFactorial = nn ' ' 返回值返回值 End FunctionEnd Function

Page 6: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 6)

阶乘函数调用阶乘函数调用

TextBox3.Text = TextBox3.Text = Factorial(n) / (Factorial(m) * Factorial(n - Factorial(n) / (Factorial(m) * Factorial(n -

m))m))

注:这里的注:这里的 n, m, n-mn, m, n-m 为为实在参数实在参数,将真实值传给函数定,将真实值传给函数定义时的义时的形式参数形式参数 nn ,参数传递的方式是,参数传递的方式是传值传值。。

Page 7: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 7)

求最大公约数函数 求最大公约数函数 (( 例例 6-2)6-2)

Function MCD(ByVal a As Integer, ByVal b As Integer) Function MCD(ByVal a As Integer, ByVal b As Integer) As IntegerAs Integer

Dim t As Integer, r As IntegerDim t As Integer, r As Integer If a < b Then If a < b Then ''若若 a<b,a<b, 则将则将 aa 、、 bb 中的值交互,保证中的值交互,保证

a>ba>b t = a : a = b : b = tt = a : a = b : b = t End IfEnd If r = a Mod b r = a Mod b 'r'r为为 aa 、、 bb 相除的余数相除的余数 Do While r <> 0Do While r <> 0 a = b : b = r : r = a Mod ba = b : b = r : r = a Mod b LoopLoop MCD = b 'MCD = b ' 求出的最大公约数,赋值给函数名返求出的最大公约数,赋值给函数名返

回回 End FunctionEnd Function

Page 8: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 8)

求最大公约数程序流程求最大公约数程序流程

Private Sub Button1_Click(...) Handles Button1.Click

Dim m, n, k As Integer

m = Val(TextBox1.Text)

n = Val(TextBox2.Text)

k = MCD(m, n)

TextBox3.Text = k End Sub

Function MCD(ByVal a As Integer, ByVal b As Integer) As Integer

Dim t As Integer, r As Integer

If a < b Then

t = a : a = b : b = t

End If

r = a Mod b

Do While r <> 0

a = b : b = r : r = a Mod b

Loop

MCD = b

End Function

Page 9: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 9)

子过程子过程

在在 VB.NETVB.NET 中,过程与函数很类似,主要中,过程与函数很类似,主要的区别是过程只完成特定的功能,并不返的区别是过程只完成特定的功能,并不返回值回值

事件过程事件过程用于事件的响应,由系统自动生用于事件的响应,由系统自动生成;成;通用过程通用过程由用户自定义由用户自定义

Page 10: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 10)

用户自定义过程用户自定义过程

[[Public|Private] Sub Public|Private] Sub 过程名 过程名 ([([ 参数表参数表 ])])

局部变量和常量说明局部变量和常量说明 语句块语句块 ……....

[Exit Sub][Exit Sub]

语句块语句块 ……....

End SubEnd Sub

Page 11: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 11)

子过程调用子过程调用

Call Call 过程名(过程名( [[ 实在参数表实在参数表 ]] ),或),或

过程名(过程名( [[ 实在参数表实在参数表 ]] ))

Page 12: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 12)

阶乘子过程 阶乘子过程 (( 例例 6-3)6-3)

Sub Factorial(ByVal n As Integer, ByRef nn As Long)Sub Factorial(ByVal n As Integer, ByRef nn As Long)‘‘自定义子过程自定义子过程

Dim i As IntegerDim i As Integer nn = 1 nn = 1 '' 阶乘阶乘

初始值 初始值 If n < 0 Then 'If n < 0 Then ' 不允许不允许

负值负值 Exit FunctionExit Function End IfEnd If For i = 1 To nFor i = 1 To n nn = nn * i nn = nn * i ' ' 计算计算

阶乘阶乘 Next iNext i End FunctionEnd Function

Page 13: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 13)

阶乘子过程调用阶乘子过程调用

Dim c As Long, m As IntegerDim c As Long, m As Integer m=6m=6 Call Factorial(m,c)Call Factorial(m,c)

注:这里形参注:这里形参 nnnn 的传递方式是的传递方式是 ByRefByRef ,因此可,因此可以把计算后的结果值带到主程序中以把计算后的结果值带到主程序中

Page 14: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 14)

统计单词平均长度 统计单词平均长度 (( 例例 6-4)6-4)

Sub long_string (ByVal s As String, ByRef m As Sub long_string (ByVal s As String, ByRef m As Integer)Integer)

Dim k, i As Integer, t As StringDim k, i As Integer, t As String k = Len(s) k = Len(s) '' 求字符串的总长度求字符串的总长度 For i = 1 To kFor i = 1 To k t = Mid(s, i, 1) 't = Mid(s, i, 1) ' 取字符串中第取字符串中第 ii 个字符个字符 If t <> " " ThenIf t <> " " Then m = m + 1m = m + 1 End IfEnd If NextNext End SubEnd Sub

Page 15: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 15)

统计单词平均长度 统计单词平均长度 (cont.)(cont.)

Sub num_word(ByVal s As String, ByRef n As Integer)Sub num_word(ByVal s As String, ByRef n As Integer) Dim i As IntegerDim i As Integer s = Trim(s) 's = Trim(s) ' 去除字符串去除字符串 ss 两端的空格两端的空格 i = InStr(s, " ") 'ii = InStr(s, " ") 'i 返回字符串返回字符串 ss 中第一次出现空格的位置中第一次出现空格的位置 Do While i > 0 Do While i > 0 '' 当字符串中还有空格当字符串中还有空格 n = n + 1 n = n + 1 '' 单词个数增加单词个数增加 11 s = Mid(s, i + 1) 's = Mid(s, i + 1) ' 取空格后面的子字符串作为新的字符取空格后面的子字符串作为新的字符

串串 s = LTrim(s) 's = LTrim(s) ' 去除这个新字符串中左边的空格去除这个新字符串中左边的空格 i = InStr(s, " ")i = InStr(s, " ") LoopLoop n = n + 1 n = n + 1 '' 加上最后一个单词加上最后一个单词 End SubEnd Sub

Page 16: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 16)

统计单词平均长度统计单词平均长度 -- 主程序主程序

Private Sub Button1_Click(......) Handles Button1.ClickPrivate Sub Button1_Click(......) Handles Button1.Click Dim l As Integer, n As Integer, s As String, evg As Dim l As Integer, n As Integer, s As String, evg As

SingleSingle s = TextBox1.Texts = TextBox1.Text Call long_string(s, l) ‘Call long_string(s, l) ‘ 调用子程序调用子程序 long_stringlong_string 求字符串中字求字符串中字

符个数符个数

Call num_word(s, n) ‘Call num_word(s, n) ‘ 调用子程序调用子程序 num_wordnum_word 求字符串中单词的个求字符串中单词的个数数

evg = l/ n evg = l/ n '' 求单词的平均长度求单词的平均长度 TextBox2.Text = evg 'TextBox2.Text = evg ' 将平均长度值显示在将平均长度值显示在 TextBox2TextBox2 中中 End SubEnd Sub

Page 17: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 17)

形参和实参形参和实参

形参是在函数或过程中定义的参数形参是在函数或过程中定义的参数

实参是在主程序中定义的常量、变量、表实参是在主程序中定义的常量、变量、表达式或数组等达式或数组等

实参和形参实参和形参必须必须在顺序和类型上完全匹配在顺序和类型上完全匹配

Page 18: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 18)

参数传递参数传递

a 的地址 10

10 10aa

x x

形参

实参

ByVal传值 传地址

Page 19: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 19)

参数传递 参数传递 (cont.)(cont.)

例: 两个变量的交换Sub Swap1(ByVal x%, ByVal y%) t% = x: x = y: y = tEnd Sub

Private Sub Command1_Click() a% = 10: b% = 20: Swap1 a, b ' 传值 Print "A1="; a, "B1="; b a% = 10: b% = 20: Swap2 a, b ' 传地址 Print "A2="; a, "B2="; bEnd Sub

Sub Swap2(x%, y%) t% = x: x = y: y = tEnd Sub

Page 20: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 20)

例例 6-56-5

Function pd(ByVal x As Integer, ByRef y As Integer) As Function pd(ByVal x As Integer, ByRef y As Integer) As IntegerInteger

Dim m As Integer, n As IntegerDim m As Integer, n As Integer m = x + ym = x + y x = x + 1x = x + 1 y = y + 1y = y + 1 n = x - yn = x - y TextBox1.Text = TextBox1.Text & "m=" & m & " TextBox1.Text = TextBox1.Text & "m=" & m & "

x=" & x & " y=" & y & " n=" & nx=" & x & " y=" & y & " n=" & n TextBox1.Text = TextBox1.Text & vbCrLfTextBox1.Text = TextBox1.Text & vbCrLf pd = npd = n End FunctionEnd Function

Page 21: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 21)

例例 6-5 (cont.)6-5 (cont.)

Private Sub Button1_Click(......) Handles Button1.ClickPrivate Sub Button1_Click(......) Handles Button1.Click Dim a As Integer, b As Integer, c As Integer, d As IntegerDim a As Integer, b As Integer, c As Integer, d As Integer TextBox1.Text = ""TextBox1.Text = "" a = 2 ; b = 3; c = 0a = 2 ; b = 3; c = 0 d = pd(a, b)d = pd(a, b) TextBox1.Text = TextBox1.Text & "a=" & a & " b=" & b TextBox1.Text = TextBox1.Text & "a=" & a & " b=" & b

& vbCrLf& vbCrLf d = pd(a, b)d = pd(a, b) TextBox1.Text = TextBox1.Text & "a=" & a & " b=" & b TextBox1.Text = TextBox1.Text & "a=" & a & " b=" & b

& vbCrLf& vbCrLf d = pd(a + b, c)d = pd(a + b, c) TextBox1.Text = TextBox1.Text & "a=" & a & " b=" & b TextBox1.Text = TextBox1.Text & "a=" & a & " b=" & b

& vbCrLf& vbCrLf End SubEnd Sub

Page 22: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 22)

数组参数的传递 数组参数的传递 (( 例例 6-5)6-5)

Sub Sort(ByRef a() As Integer)Sub Sort(ByRef a() As Integer) Dim i, j, iMin, t As IntegerDim i, j, iMin, t As Integer For i = 0 To UBound(a)For i = 0 To UBound(a) iMin = i 'iMin = i ' 暂时假设待排序数中暂时假设待排序数中 a(i)a(i) 最小最小 For j = i + 1 To UBound(a)For j = i + 1 To UBound(a) If a(iMin) > a(j) Then 'If a(iMin) > a(j) Then ' 待排序数和暂时最小数比较待排序数和暂时最小数比较 iMin = j 'iMin = j ' 确定新的最小数下标 确定新的最小数下标 End IfEnd If Next jNext j t = a(i) 't = a(i) '将将 a(i)a(i) 和待排序数中最小数交换和待排序数中最小数交换 a(i) = a(iMin)a(i) = a(iMin) a(iMin) = ta(iMin) = t Next iNext i End SubEnd Sub

Page 23: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 23)

数组参数的传递 数组参数的传递 (cont.)(cont.)

Private Sub Button1_Click(……) Handles Button1.ClickPrivate Sub Button1_Click(……) Handles Button1.Click Dim i As IntegerDim i As Integer Dim a() As Integer = {4, 8, 2, 6, 5, 7} Dim a() As Integer = {4, 8, 2, 6, 5, 7}

'' 待排序数待排序数 For i = 0 To UBound(a)For i = 0 To UBound(a) TextBox1.Text = TextBox1.Text & a(i) & Space(1) TextBox1.Text = TextBox1.Text & a(i) & Space(1)

'' 显示待排序数显示待排序数 Next iNext i Call Sort(a)Call Sort(a) For i = 0 To UBound(a)For i = 0 To UBound(a) TextBox2.Text = TextBox2.Text & a(i) & TextBox2.Text = TextBox2.Text & a(i) &

Space(1) 'Space(1) ' 显示排好序的数显示排好序的数 Next iNext i End SubEnd Sub

Page 24: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 24)

标准模块标准模块

标准模块主要用于定义整个项目所需要的标准模块主要用于定义整个项目所需要的公共变量、常量、函数和子过程等公共变量、常量、函数和子过程等

定义格式定义格式 Module Module 模块名模块名 … … End ModuleEnd Module

Page 25: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 25)

标准模块应用标准模块应用

Module Module1Module Module1 Function MCD(ByVal a As Integer, ByVal b As Integer) Function MCD(ByVal a As Integer, ByVal b As Integer)

As IntegerAs Integer Dim t As Integer, r As IntegerDim t As Integer, r As Integer If a < b Then 'If a < b Then ' 若若 a<b,a<b, 则将则将 a,ba,b 中的值交互,中的值交互,

保证保证 a>ba>b t = a : a = b : b = tt = a : a = b : b = t End IfEnd If r = a Mod b 'rr = a Mod b 'r 为为 aa 、、 bb 相除的余数相除的余数 Do While r <> 0Do While r <> 0 a = b : b = r : r = a Mod ba = b : b = r : r = a Mod b LoopLoop MCD = b 'MCD = b ' 最大公约数最大公约数 End FunctionEnd Function End ModuleEnd Module

Page 26: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 26)

变量的作用域变量的作用域

Public Class Form1 Public msg As String = "数组元素累加" '全局变量 Dim a() As Integer = {1, 5, 8, 3, 9, 6} '模块级变量 Private Sub Form1_Load(……) Handles MyBase.Load Dim msg As String = "数组a元素的累加和=" '局部变量 MsgBox(msg & Sum(a), , Me.msg) End End SubEnd Class

Page 27: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 27)

变量的作用域 变量的作用域 (cont.)(cont.)

Module Module1 Public Function Sum(ByVal b() As Integer) As Integer Dim i As Integer '局部变量 For i = 0 To UBound(b) Dim t As Integer '语句块级变量 t = b(i) Sum = Sum + t Next End FunctionEnd Module

Page 28: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 28)

过程的作用域过程的作用域

模块级过程 模块级过程 (Private)(Private)

全局过程 全局过程 (Public)(Public)

Page 29: 第 6 章   函数和过程

东华大学计算机学院 东华大学计算机学院 2008-9-152008-9-15

《 VB.NET 程序设计》第 1课( 29)

结束结束