290 likes | 508 Views
第 6 章 函数和过程. 主要内容 函数和过程基本概念 函数和过程的使用 参数传递 模块与作用域. 函数. VB.NET 系统提供好的各种数学、字符串处理等函数 L = Len(S) 返回字符串 S 的长度. 用户自定义函数. [ Public|Private] Function 函数名 ([ 参数表 ]) [As 类型 ] 语句块 ….. [ 函数名=返回值 ] [Exit Function] 语句块 ….. 函数名=返回值 End Function. 用户自定义函数 (cont.).
E N D
第6章 函数和过程 • 主要内容 • 函数和过程基本概念 • 函数和过程的使用 • 参数传递 • 模块与作用域 东华大学计算机学院 2008-9-15
函数 • VB.NET系统提供好的各种数学、字符串处理等函数 • L = Len(S) • 返回字符串S的长度 东华大学计算机学院 2008-9-15
用户自定义函数 [Public|Private] Function 函数名 ([参数表]) [As 类型] 语句块 ….. [函数名=返回值] [Exit Function] 语句块 ….. 函数名=返回值 End Function 东华大学计算机学院 2008-9-15
用户自定义函数 (cont.) • 参数表使用 ByVal或 ByRef 定义 • 例如: • ByVal m As Integer • ByRef n As Single • ByVal a() as Integer 东华大学计算机学院 2008-9-15
阶乘函数 (例6-1) • Function Factorial(ByVal n As Integer) As Long '自定义函数过程 • Dim i As Integer, nn As Long • nn = 1 '阶乘初始值 • If n < 0 Then '不允许负值 • Exit Function • End If • For i = 1 To n • nn = nn * i '计算阶乘 • Next i • Factorial = nn '返回值 • End Function 东华大学计算机学院 2008-9-15
阶乘函数调用 • TextBox3.Text = • Factorial(n) / (Factorial(m) * Factorial(n - m)) • 注:这里的n, m, n-m为实在参数,将真实值传给函数定义时的形式参数n,参数传递的方式是传值。 东华大学计算机学院 2008-9-15
求最大公约数函数 (例6-2) • Function MCD(ByVal a As Integer, ByVal b As Integer) As Integer • Dim t As Integer, r As Integer • If a < b Then '若a<b,则将a、b中的值交互,保证a>b • t = a : a = b : b = t • End If • r = a Mod b 'r为a、b相除的余数 • Do While r <> 0 • a = b : b = r : r = a Mod b • Loop • MCD = b '求出的最大公约数,赋值给函数名返回 • End Function 东华大学计算机学院 2008-9-15
求最大公约数程序流程 东华大学计算机学院 2008-9-15
子过程 • 在VB.NET中,过程与函数很类似,主要的区别是过程只完成特定的功能,并不返回值 • 事件过程用于事件的响应,由系统自动生成;通用过程由用户自定义 东华大学计算机学院 2008-9-15
用户自定义过程 [Public|Private] Sub 过程名 ([参数表]) 局部变量和常量说明 语句块 ….. [Exit Sub] 语句块 ….. End Sub 东华大学计算机学院 2008-9-15
子过程调用 • Call 过程名([实在参数表]),或 • 过程名([实在参数表]) 东华大学计算机学院 2008-9-15
阶乘子过程 (例6-3) • Sub Factorial(ByVal n As Integer, ByRef nn As Long) ‘自定义子过程 • Dim i As Integer • nn = 1 '阶乘初始值 • If n < 0 Then '不允许负值 • Exit Function • End If • For i = 1 To n • nn = nn * i '计算阶乘 • Next i • End Function 东华大学计算机学院 2008-9-15
阶乘子过程调用 • Dim c As Long, m As Integer • m=6 • Call Factorial(m,c) • 注:这里形参nn的传递方式是ByRef,因此可以把计算后的结果值带到主程序中 东华大学计算机学院 2008-9-15
统计单词平均长度 (例6-4) • Sub long_string (ByVal s As String, ByRef m As Integer) • Dim k, i As Integer, t As String • k = Len(s) '求字符串的总长度 • For i = 1 To k • t = Mid(s, i, 1) '取字符串中第i个字符 • If t <> " " Then • m = m + 1 • End If • Next • End Sub 东华大学计算机学院 2008-9-15
统计单词平均长度 (cont.) • Sub num_word(ByVal s As String, ByRef n As Integer) • Dim i As Integer • s = Trim(s) '去除字符串s两端的空格 • i = InStr(s, " ") 'i返回字符串s中第一次出现空格的位置 • Do While i > 0 '当字符串中还有空格 • n = n + 1 '单词个数增加1 • s = Mid(s, i + 1) '取空格后面的子字符串作为新的字符串 • s = LTrim(s) '去除这个新字符串中左边的空格 • i = InStr(s, " ") • Loop • n = n + 1 '加上最后一个单词 • End Sub 东华大学计算机学院 2008-9-15
统计单词平均长度-主程序 • Private Sub Button1_Click(......) Handles Button1.Click • Dim l As Integer, n As Integer, s As String, evg As Single • s = TextBox1.Text • Call long_string(s, l) ‘调用子程序long_string求字符串中字符个数 • Call num_word(s, n) ‘调用子程序num_word求字符串中单词的个数 • evg = l/ n '求单词的平均长度 • TextBox2.Text = evg '将平均长度值显示在TextBox2中 • End Sub 东华大学计算机学院 2008-9-15
形参和实参 • 形参是在函数或过程中定义的参数 • 实参是在主程序中定义的常量、变量、表达式或数组等 • 实参和形参必须在顺序和类型上完全匹配 东华大学计算机学院 2008-9-15
参数传递 东华大学计算机学院 2008-9-15
参数传递 (cont.) 例: 两个变量的交换 Sub Swap1(ByVal x%, ByVal y%) t% = x: x = y: y = t End 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="; b End Sub Sub Swap2(x%, y%) t% = x: x = y: y = t End Sub 东华大学计算机学院 2008-9-15
例6-5 • Function pd(ByVal x As Integer, ByRef y As Integer) As Integer • Dim m As Integer, n As Integer • m = x + y • x = x + 1 • y = y + 1 • n = x - y • TextBox1.Text = TextBox1.Text & "m=" & m & " x=" & x & " y=" & y & " n=" & n • TextBox1.Text = TextBox1.Text & vbCrLf • pd = n • End Function 东华大学计算机学院 2008-9-15
例6-5 (cont.) • Private Sub Button1_Click(......) Handles Button1.Click • Dim a As Integer, b As Integer, c As Integer, d As Integer • TextBox1.Text = "" • a = 2 ; b = 3; c = 0 • d = pd(a, b) • TextBox1.Text = TextBox1.Text & "a=" & a & " b=" & b & vbCrLf • d = pd(a, b) • TextBox1.Text = TextBox1.Text & "a=" & a & " b=" & b & vbCrLf • d = pd(a + b, c) • TextBox1.Text = TextBox1.Text & "a=" & a & " b=" & b & vbCrLf • End Sub 东华大学计算机学院 2008-9-15
数组参数的传递 (例6-5) • Sub Sort(ByRef a() As Integer) • Dim i, j, iMin, t As Integer • For i = 0 To UBound(a) • iMin = i '暂时假设待排序数中a(i)最小 • For j = i + 1 To UBound(a) • If a(iMin) > a(j) Then '待排序数和暂时最小数比较 • iMin = j '确定新的最小数下标 • End If • Next j • t = a(i) '将a(i)和待排序数中最小数交换 • a(i) = a(iMin) • a(iMin) = t • Next i • End Sub 东华大学计算机学院 2008-9-15
数组参数的传递 (cont.) • Private Sub Button1_Click(……) Handles Button1.Click • Dim i As Integer • Dim a() As Integer = {4, 8, 2, 6, 5, 7} '待排序数 • For i = 0 To UBound(a) • TextBox1.Text = TextBox1.Text & a(i) & Space(1) '显示待排序数 • Next i • Call Sort(a) • For i = 0 To UBound(a) • TextBox2.Text = TextBox2.Text & a(i) & Space(1) '显示排好序的数 • Next i • End Sub 东华大学计算机学院 2008-9-15
标准模块 • 标准模块主要用于定义整个项目所需要的公共变量、常量、函数和子过程等 • 定义格式 • Module 模块名 • … • End Module 东华大学计算机学院 2008-9-15
标准模块应用 • Module Module1 • Function MCD(ByVal a As Integer, ByVal b As Integer) As Integer • Dim t As Integer, r As Integer • If a < b Then '若a<b,则将a,b中的值交互,保证a>b • t = a : a = b : b = t • End If • r = a Mod b 'r为a、b相除的余数 • Do While r <> 0 • a = b : b = r : r = a Mod b • Loop • MCD = b '最大公约数 • End Function • End Module 东华大学计算机学院 2008-9-15
变量的作用域 东华大学计算机学院 2008-9-15
变量的作用域 (cont.) 东华大学计算机学院 2008-9-15
过程的作用域 • 模块级过程 (Private) • 全局过程 (Public) 东华大学计算机学院 2008-9-15
结束 谢谢听讲! 东华大学计算机学院 2008-9-15