将程序分割成较小的逻辑部件就可以简化程序设计任务,称这些部件_第1页
将程序分割成较小的逻辑部件就可以简化程序设计任务,称这些部件_第2页
将程序分割成较小的逻辑部件就可以简化程序设计任务,称这些部件_第3页
将程序分割成较小的逻辑部件就可以简化程序设计任务,称这些部件_第4页
将程序分割成较小的逻辑部件就可以简化程序设计任务,称这些部件_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、自定义Sub子过程和Functin函数过程有以下两种方法。1.1.利用利用“添加过程添加过程”对话框定义对话框定义图6-1 “添加过程”对话框2.2.直接在代码窗口定义直接在代码窗口定义在窗体或标准模块的代码窗口之外,输入Sub子过程名或Function函数过程即可。l 子过程子过程的语法格式为:Private | Public Static SubSub () Exit Sub End SubEnd Subl 函数过程函数过程的语法格式为:Public|PrivateStaticFunctionFunction()As 函数过程名 = Exit Function =End FunctionE

2、nd Function1 1使用使用CallCall语句调用语句调用FunctionFunction过程过程 同同SubSub过程一样,同样可以使用过程一样,同样可以使用CallCall语句调用语句调用FunctionFunction过程,这时的过程,这时的FunctionFunction过程返回值的过程过程返回值的过程实质上相当于实质上相当于SubSub过程,调用后,将返回所有在参过程,调用后,将返回所有在参数列表中列出的参数的值。数列表中列出的参数的值。 使用函数名过程调用使用函数名过程调用FunctionFunction过程过程 与与SubSub过程不同,不能单独将过程不同,不能单独将F

3、unctionFunction过程作为过程作为一个语句使用。一个语句使用。6.2.2 6.2.2 函数过程的调用函数过程的调用例6-1:将求三角形的面积的代码存放在过程triarea(a,b,c)中,边长从三个文本框中输入,如果符合构成三角形的条件,则调用该过程,否则调用suberr过程。程序如下:Private Sub triarea(area As Double, x As Double, y As Double, z As Double) Dim s As Double s = (x +y + z) / 2 area = Sqr(s - x) * (s - y) * (s - z) *

4、s)End SubPrivate Sub suberr(intyrn As Integer) intyrn = MsgBox(请检查您的数据, vbYesNo + vbInformation, 数据错误)End Sub将例将例6-1中两个中两个Sub过程改为过程改为Function过程。过程。6.3.1 形参与实参的传送方式1. 1. 按位置传送按位置传送按位置传送就是实参的次序与形参的次序应匹配,位按位置传送就是实参的次序与形参的次序应匹配,位置次序一一对应。置次序一一对应。2. 2. 指名传送指名传送指名传送就是显式地指出与形参相结合的实参,将形参与实参指名传送就是显式地指出与形参相结合的

5、实参,将形参与实参用用“:=”:=”连接起来,这样,就不必要求形参与实参按位置次序一连接起来,这样,就不必要求形参与实参按位置次序一一对应。如一对应。如: :Call mysub(a ,b (),Call mysub(a ,b (),王大虎王大虎 ,d ) ,d )与与Call mysub(x:=a ,yarray:=b (),zstr:=Call mysub(x:=a ,yarray:=b (),zstr:=王大虎王大虎 ,w:=d ) ,w:=d )以及以及Call mysub(yarray:=b (),x:=a ,w:=d ,zstr:=Call mysub(yarray:=b (),x

6、:=a ,w:=d ,zstr:=王大虎王大虎)是等价的。是等价的。例6-4:下面的程序求解s1=ns2=n+nsn=n+n+n(n个n累加)并输出s1到sn。n自然数,从文本框值输入。函数过程:Public Function sum(m As Integer, ByVal n As Integer) sum = m Do While n 1 sum = sum + m n = n - 1 LoopEnd Function例6-5:求数组元素的和。函数过程:Public Function sum(p() Dim m%, n% For m = LBound(p, 1) To UBound(p,

7、1) For n = LBound(p, 2) To UBound(p, 2) sum = sum + p(m, n) Next n,mEnd Function事件过程:Private Sub Command1_Click() Dim s(), a%, b%, k%, sums% Cls a = CInt(Text1.Text):b = CInt(Text2.Text) ReDim s(1 To a, 1 To b) For j = 1 To b For i = 1 To a s(i, j) = Int(80 * Rnd + 10) Next i,j sums = sum(s():Print

8、sums=; sumsEnd Sub1. 可选参数例6-6:求两个数的和的函数过程。函数过程:Public Sub multisum(mysum, first As Integer, second As Long, Optional third) mysum = first + second If Not IsMissing(third) Then mysum = mysum + thirdEnd Sub事件过程:Private Sub Command1_Click() Dim a As Integer, b As Long, c As Double a = 10: b = 20 Call m

9、ultisum(Sum, a, b) Print sum=; Sum a = 10: b = 20: c = 30 Call multisum(Sum, a, b, c) Print sum=; SumEnd Sub2. 可变参数在传递参数时,如果要求参数的数目可以变化,则在函数过程或Sub过程中一般采用如下语法:Sub (,ParamArray )例6-7:将上述程序修改为求任意个数的和。Private Sub Command1_Click() Dim s(), a As Integer, b As Long, c As Variant, d As Double s = Array(1, 2

10、, 3, 4, 5) Call multisum(Sum, s(0), s(2), s(4) Print sum=; Sum a = 1000: b = 10000: c = 100: d = 10 Call multisum(Sum, a, b, c, d) Print sum=; SumEnd SubPublic Sub multisum(mysum, ParamArray p() mysum = 0 For Each x In p mysum = mysum + x NextEnd Sub标准模块(.bas)窗体模块(.frm)Sub子过程类模块(.cls)事件过程sub()Sub过程图

11、6-2 VB应用程序的组成函数过程Function ()VB应用程序(.vbp文件)函数过程(Function)1窗体/模块级过程2全局级 在某个窗体或标准模块中定义的Sub过程或函数过程前加上Private关键字,则该过程只能被包含过程的窗体或标准模块中的过程调用。在某个窗体或标准模块中定义的Sub过程或函数过程前加上Pulbic关键字或缺省,则该过程为全局级过程,可以被应用程序的所有窗体或标准模块中的过程调用。其调用方式根据过程所处的位置有如下两种:1)在窗体中定义的过程,当外部过程要调用时,应在被调用的过程名前加上所处的窗体名。2)在标准模块中定义的过程,如果过程名唯一,则任何外部过程都

12、可以直接调用,否则应在被调用的过程名前加上所处的标准模块名。1局部变量(动态变量)局部变量是只能在一个函数或过程中访问的变量,其他过程或函数不能访问此变量的数据。2. 窗体/模块级变量窗体/模块级变量是指在一个窗体/模块的任何过程之外,即在“通用声明”段中用Dim或Private语句声明的变量。3. 全局变量全局变量是指在一个窗体/模块的任何过程之外声明的变量,即在“通用声明”段中用Public语句声明的变量。局部变量可以使用Static关键字声明为静态变量,这样,在每次调用过程时,静态变量可以保存原先的值。声明局部变量的语法为:Static As Static Sub ()Static Fu

13、nction ()As 在过程名前加上Static关键字,表明该过程的变量都是静态变量。例6-7:下面程序中有三个同名的变量wv,图6-3是运行该程序后,三次单击Command1后显示的结果。Public wv As IntegerPrivate Sub Command1_Click() Dim wv As Integer wv = wv + 3 Call wholesub Print Command1事件过程的wv=; wv, 全局的wv=; Form1.wvEnd SubPublic Sub wholesub() Static wv As Integer wv = wv + 1 Form1

14、.wv = wv + 5 Print wholesub过程的wv=; wv, 全局的wv=; Form1.wvEnd SubPrivate Sub Form_Load() wv = 1End Sub图6-3 全局变量、局部变量、静态变量利用静态变量记录某个事件被触发的次数例6-9:Private Sub Command1_Click() Call passwordEnd SubPrivate Sub password() Static counter As Integer Dim password As String counter = counter + 1 password = Input

15、Box(请输入密码) If password = 12345 Then counter = 0 If counter = 3 Then MsgBox 请核对密码后再运行程序, vbOKOnly + vbInformation, 密码错误 End End IfEnd Sub记录开关变量的值例6-9:Private Sub Command1_Click() Static tandf As Boolean tandf = Not tandf If tandf = True Then Command1.Caption = 确认修改 Text1.SetFocus Else Command1.Captio

16、n = 修改 Text1.Text = End IfEnd Sub例6-10:求阶乘Factorial(n)=n!的函数Private Sub Command1_Click() Dim myn As Double Cls myn = InputBox(请输入小于171的数) If myn =0Then Print myn & !=; factorial(myn) End IfEnd SubPublic Function factorial(n As Double) As Double If n 1 Then factorial = n * factorial(n - 1) Else f

17、actorial = 1 End IfEnd Function例6-11:用递归过程求两个整数m和 n的最大公约数。Private Sub Command1_Click() Dim x%, y%, gcdinxy% Cls x = CInt(InputBox(请输入第一个整数) y = CInt(InputBox(请输入第二个整数) Print x & 和 & y & 的最大公约数为 & greatcd(x, y)End FunctionPublic Function greatcd(m As Integer, n As Integer) As Integer图

18、6-4 求最大公约数 If (m Mod n = 0) Then greatcd = n Print m, n Else greatcd = greatcd(n, m Mod n) Print m, n End IfEnd Function顺序查找即从数组的第一个元素开始与关键字进行比较,若相等则查找成功,否则,将下一个元素与关键字进行,直到最后一个,如果某个元素与关键字相等,则查找成功且停止继续查找。若找不到,则查找失败。例6-13:利用顺序查找法找出数组中的某个数。程序代码为:Dim a()Private Sub Command1_Click() Dim myrecord As Integ

19、er myword = Val(InputBox(请输入要查找的关键字) Call search(a, myword, myrecord) If myrecord = -1 Then MsgBox 没有您要查找的关键字, vbInformation + vbOKOnly, 查询结果 Else MsgBox 您要查找的关键字位置为 & myrecord, vbInformation + vbOKOnly, 查询结果 End IfEnd SubPublic Sub search(p(), ByVal keyword, record As Integer) Dim x As Integer

20、record = -1 For x = LBound(p) To UBound(p) If p(x) = keyword Then record = x: Exit For End If NextEnd SubPrivate Sub Form_Click() ReDim a(0 To 50) For i = 0 To 50 a(i) = Int(Rnd * 91 + 10) NextEnd Sub例6-14:从数组a中删除数组b中已有的数后形成新的数组x。Dim a(), b()Private Sub Form_Click() 产生数组a和b ReDim a(1 To 10) : ReDim

21、b(1 To 10) For i = 1 To 10 : a(i) = Int(Rnd * 31 + 40): Print a(i); :Next: Print For i = 1 To 10 : b(i) = Int(Rnd * 21 + 40): Print b(i); :Next : PrintEnd SubPrivate Sub Command1_Click() Dim myrecord As Integer For k = 1 To 10 For l = 1 To 10 If a(k) = b(l) Then 在b中找到a中的元素 Call delete(a, k,9-n) n =

22、n + 1 n存放找到的元素个数 End If Next Next For i = 1 To 10 n : Print a(i); : Next a中只剩下10-n个有效元素End SubPublic Sub delete(x(), m,n) For i = m To n : x(i) = x(i + 1) : Next 依次前移 x(n + 1) = 0 最后一个元素清零End Sub2. 二分法查找顺序查找法适合数组较小的情况,当数组较大时,可以采用二分法查找以提高查找效率。二分查找的思路是:将要查找的关键字与有序数组中中间元素相比较,如果相等,则查找成功,否则判断关键字落在数组的哪一部分

23、,对该部分继续按照上述方法查找。例6-15:利用二分查找法找出数组中的某个数。Dim a(1 To 10)Private Sub Form_Click() 产生随机数组并排序 Dim mykeyword%, myrecord% For i = 1 To 10 a(i) = Int(Rnd * 91 + 10): Print a(i); Next Call sorter(a) 调用排序函数End SubPublic Sub sorter(x() 插入法排序函数 For i = 2 To 10 t = x(i): j = i - 1 Do While t high Then record = -1

24、: Exit Sub 直到 low high还找不到关键字则退出函数过程 End If If keyword x(mid) Then high = mid 1 取左半部 Else low = mid + 1 取右半部 End If Call dichotomy(x(), low, high, keyword, record) 递归End SubPrivate Sub Command1_Click() Command1_Click事件过程 mykeyword = Val(InputBox(请输入要查找的关键字) 给出关键字 Call dichotomy(a(), LBound(a), UBoun

25、d(a), mykeyword, myrecord) 调用查询函数 If myrecord = -1 Then MsgBox 没有您要查找的关键字, vbInformation + vbOKOnly, 查询结果 Else MsgBox 您要查找的关键字位置为 & myrecord, vbInformation + vbOKOnly, 查询结果 End IfEnd Sub数组由单击窗体事件时随机产生并调用排序过程进行排序。Command1_Click事件过程给出关键字,调用查询函数,利用对话框显示查询结果。查询函数使用了递归调用。如果不采用递归调用,可以将查询函数作如下修改:Public

26、 Sub dichotomy(x(), ByVal low%, ByVal high%, ByVal keyword, record) Dim mid As Integer record = -1: newmid = -1: mid = (low + high) / 2 Do While newmid mid And low = high If x(mid) = keyword Then record = mid : Exit Do End If If keyword x(mid) Then high = mid - 1 Else low = mid + 1 End If newmid = m

27、id : mid = (low + high) / 2 LoopEnd Sub例6-16:为输入的文本加密。基本原理:将英文字符的ASC码加上某个值,使其变成另外一个字符,实现加密。解密的过程则是加密的逆操作。程序代码为:Dim everytext As String 声明窗体级变量,everytext保存原文Public Function encipher(origtext As String) 加密函数 ,形参origtext对应实参everytext Dim newtext As String, currchar As String, newchar As String Dim orig

28、len As Integer origlen = Len(origtext) For k = 1 To origlen 逐个字符加密 currchar = Mid$(origtext, k, 1): newchar = Chr$(Asc(currchar) + 3) newtext = newtext & newchar Next encipher = newtextEnd FunctionPublic Function revert(origtext As String) As String 解密函数 Dim newtext As String, currchar As String

29、, newchar As String,origlen As Integer origlen = Len(origtext) For k = 1 To origlen 逐个字符还原 currchar = Mid$(origtext, k, 1): newchar = Chr$(Asc(currchar) - 3) newtext = newtext & newchar Next revert = newtextEnd Function 图6-5 加密与解密程序运行界面badxxf)(6.6.3 用梯形法求定积分函数f(x)在a,b区间的积分I =的几何意义为求曲线f(x)与直线y=0,

30、x=a,x=b所围成的曲顶矩形的面积(参见图6-6)。采用梯形法求定积分是原函数不容易找到时常用的方法。设h=(b-a)/n n为曲顶矩形的数目,n越大,精度越高则有定积分I 的近似值s:s=11)()()(5 . 0niihafhbfafh可以将上式改为迭代形式s=)()(5 . 0bfafhs=s+h()*1 ha 例6-17:编程用梯形法求定积分503)2(dxxx图6-6 梯形法求定积分示意图图6-7 求定积分程序运行界面Public Function fun(ByVal x As Double) As Double fun = x * x * x + x - 2End Functio

31、nPublic Function integral(ByVal a As Single, ByVal b As Single, ByVal n As Integer) Dim s As Double, h As Double h = (b - a) / n : s = 0.5 * h * (fun(a) + fun(b) For i = 1 To n - 1 s = s + fun(a + i * h) * h Next integral = sEnd FunctionPrivate Sub Command1_Click() If Text1.Text And Text2.Text And T

32、ext3.Text Then a = Val(Text1.Text) : b = Val(Text2.Text):n = Val(Text3.Text) : Text4.Text = integral(a, b, n) Else MsgBox 请输入数据, vbInformation + vbOKOnly, 缺少数据 End IfEnd SubPrivate Sub Command2_Click() Text1.Text = : Text2.Text = : Text3.Text = : Text4.Text = : Text1.SetFocus End Sub6.6.4 高次方程求根在数学运算中,经常会遇到高次方程求根的问题。常用的方法有牛顿切线法、二分法和弦截法。1. 牛顿切线法牛顿法的思路是:为方程0)(xf给定一个初值x0作为方程的近似根,则可以用迭代公式)1( )(iiiixfxfxx求解方程的更精确的近似根xi+1。条件是:对任意给定的较小值,总可以找到|xi+1-xi|

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论