第6章.ppt

大学VISUAL BASIC程序设计教程-课件PPT

收藏

资源目录
跳过导航链接。
大学VISUALBASIC程序设计教程-课件PPT.zip
VISUAL BASIC程序设计教程-PPT演示文稿
VISUAL BASIC程序设计教程-PPT课件文件
VISUAL BASIC程序设计教程-大学教学资料
(课件资料)VISUAL BASIC程序设计教程
压缩包内文档预览:(预览前20页/共48页)
预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图
编号:21836467    类型:共享资源    大小:5.82MB    格式:ZIP    上传时间:2019-09-06 上传人:QQ24****1780 IP属地:浙江
25
积分
关 键 词:
大学VISUAL BASIC程序设计教程-课件PPT 大学 visual basic 程序设计 教程 课件 ppt
资源描述:
大学VISUAL BASIC程序设计教程-课件PPT,大学VISUAL,BASIC程序设计教程-课件PPT,大学,visual,basic,程序设计,教程,课件,ppt
内容简介:
将程序分割成较小的逻辑部件就可以简化程序设计任务,称这些部件为过程,它们可以变成增强和扩展 Visual Basic 的构件。VB中有两类过程,一类是内部过程,另类是外部过程,每类过程又可分为函数过程和事件过程。内部过程是由系统提供的、不需要用户编写、可直接用过程名调用的程序段。外部过程是由用户根据自己的需要定义和编写的、可供事件过程多次调用的程序段。过程的使用,一方面将大的程序分成离散的逻辑单元,方便程序的调试;另一方面,方便了其他的程序或过程的调用。,第6章 过 程,6.1 过程的定义,6.2 过程的调用,6.3 参数传送,6.4变量与过程的作用范围,6.5 递归,退出,6.6 综合实例,6.1 过程的定义,自定义Sub子过程和Functin函数过程有以下两种方法。,1.利用“添加过程”对话框定义,图6-1 “添加过程”对话框,2.直接在代码窗口定义 在窗体或标准模块的代码窗口之外,输入Sub子过程名或Function函数过程即可。 子过程的语法格式为: Private | Public | Friend Static Sub () Exit Sub End Sub 函数过程的语法格式为: Public|Private|FriendStaticFunction()As 函数过程名 = Exit Function = End Function,6.2 过程的调用,6.2.1子过程的调用 1使用Call语句调用过程 Call语句的格式为: Call 过程名() 2. 将过程名作为语句使用 如果省略 Call 关键字而直接将过程名作为语句使用,也必须省略 外面的括号。,1使用Call语句调用Function过程 同Sub过程一样,同样可以使用Call语句调用Function过程,这时的Function过程返回值的过程实质上相当于Sub过程,调用后,将返回所有在参数列表中列出的参数的值。 使用函数名过程调用Function过程 与Sub过程不同,不能单独将Function过程作为一个语句使用。,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) * s) End Sub Private Sub Command1_Click() Dim a As Double, b As Double, c As Double, s As Double Dim intYesorNo As Integer a = Val(Text1.Text): b = Val(Text2.Text): c = Val(Text3.Text) If a + b c And b + c a And c + a b Then Call triarea(s, a, b, c) 使用Call关键字,实际参数用括号括起来 Picture1.Print “ 面积 =“; s Else suberr intYesorNo 不使用Call关键字,实际参数不用括号 End If End Sub Private Sub suberr(intyrn As Integer) intyrn = MsgBox(“请检查您的数据“, vbYesNo + vbInformation, “数据错误“) End Sub,例6-2:将例6-1中两个Sub过程改为Function过程。 Private Function triarea(x As Double, y As Double, z As Double) Dim s As Double, area As Double s = (x + y + z) / 2 area = Sqr(s - x) * (s - y) * (s - z) * s) triarea = area End Function Private Sub Command1_Click() 用如下部分代替上面程序中带下划线的部分即可 Picture1.Print “ 面积 =“; triarea(a, b, c) else intYesorNo = suberr() 无参数时,括号不能省略 End Sub Private Function suberr() As Integer suberr = MsgBox(“请检查您的数据“, vbYesNo + vbInformation, “数据错误“) End Function,Sub过程和Function函数过程中的中的参数称为形式参数(简称形参),在程序中调用Sub过程和Function函数过程时中称为实际参数。过程调用的过程,就是实参与形参结合的过程。,6.3 参数传送,6.3.1 形参与实参的传送方式,6.3.2 传址与传值,返回,退出,6.3.3 数组参数的传递,6.3.4 可选参数与可变参数,6.3.1 形参与实参的传送方式,1. 按位置传送 按位置传送就是实参的次序与形参的次序应匹配,位置次序一一对应。如在例6-1中实参与形参按址结合的示意图见图6-2。,图6-2 实参与形参按址结合的示意图,Private Sub triarea(area As Double, x As Double, y As Double, z As Double),2. 指名传送 指名传送就是显式地指出与形参相结合的实参,将形参与实参用“:=”连接起来,这样,就不必要求形参与实参按位置次序一一对应。 如 Call mysub(a ,b (),“王大虎“ ,d ) 与 Call mysub(x:=a ,yarray:=b (),zstr:=“王大虎“ ,w:=d ) 以及 Call mysub(yarray:=b (),x:=a ,w:=d ,zstr:=“王大虎“) 是等价的。,6.3.2 传址与传值,1. 传址 在VB中,默认情况下实参与形参是传址传递数据的。,例6-3:在前面求三角形面积的triarea过程经过如下改变: 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) * s) x=100:y=200:z=150 End Sub 则与形参x,y,z对应的实参a,b,c分别改变为100,200,150。,2. 传值 传值就是通过传送实参的值而不是传送地址的方法给被调用过程中的形参。系统把需要传送的实参复制到一个临时单元中,然后再把该临时的地址传送给形参。这样,被调用的过程并没有访问实参的地址,因而也就不会改变实参的值。 在VB中,区分传址与传值的标志为:传值时,在实参前加上ByVal,传址时,在实参前加上ByDef或者是默认。,3. 传送方式的选择 传址方式的效率比传值要高,但形参并不是一个真正的局部变量,有可能对程序的运行产生干扰。传值方式的效率虽然较低,但形参是一个真正的局部变量,不会对程序的运行产生干扰。,ByVal 传值 Bydef传址,图6-3 传址方式与传值方式示意图,例6-4:下面的程序求解 s1=n s2=n+n sn=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 Loop End Function 事件过程: Private Sub Command1_Click() Dim i%, s(), a%, k% Cls a = Val(Text1.Text) ReDim s(1 To a) For i = 1 To a s(i) = sum(a, i) k = k + 1 Print “i=“; i, “k=“; k, “s“ s(i) If k a Then Exit For Next i End Sub,图6-4 按值传送 图6-5 按址传送,6.3.3 数组参数的传递,例6-5:求数组元素的和。 函数过程: Public Function sum(p() Dim m%, n% For m = LBound(p, 1) To UBound(p, 1) For n = LBound(p, 2) To UBound(p, 2) sum = sum + p(m, n) Next n,m End 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 “sums=“; sums End Sub,6.3.4 可选参数与可变参数,1. 可选参数,例6-6:求两个数的和的函数过程。 函数过程: Public Sub multisum(mysum, first As Integer, second As Long, Optional third) mysum = first + second If Not IsMissing(third) Then mysum = mysum + third End Sub 事件过程: Private Sub Command1_Click() Dim a As Integer, b As Long, c As Double a = 10: b = 20 Call multisum(Sum, a, b) Print “sum=“; Sum a = 10: b = 20: c = 30 Call multisum(Sum, a, b, c) Print “sum=“; Sum End Sub,2. 可变参数,在传递参数时,如果要求参数的数目可以变化,则在函数过程或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, 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=“; Sum End Sub Public Sub multisum(mysum, ParamArray p() mysum = 0 For Each x In p mysum = mysum + x Next End Sub,6.4 变量与过程的作用范围,图6-6 VB应用程序的组成,函数过程 Function (),VB应用程序 (.vbp文件),函数过程 (Function),6.4.1 过程的作用域,1窗体/模块级过程,2全局级,在某个窗体或标准模块中定义的Sub过程或函数过程前加上Private关键字,则该过程只能被包含过程的窗体或标准模块中的过程调用。,在某个窗体或标准模块中定义的Sub过程或函数过程前加上Pulbic关键字或缺省,则该过程为全局级过程,可以被应用程序的所有窗体或标准模块中的过程调用。其调用方式根据过程所处的位置有如下两种:,1)在窗体中定义的过程,当外部过程要调用时,应在被调用的过程名前加上所处的窗体名。,2)在标准模块中定义的过程,如果过程名唯一,则任何外部过程都可以直接调用,否则应在被调用的过程名前加上所处的标准模块名。,6.4.2变量的作用域,1局部变量(动态变量) 局部变量是只能在一个函数或过程中访问的变量,其他过程或函数不能访问此变量的数据。,2. 窗体/模块级变量,窗体/模块级变量是指在一个窗体/模块的任何过程之外,即在“通用声明”段中用Dim或Private语句声明的变量。,3. 全局变量,全局变量是指在一个窗体/模块的任何过程之外声明的变量,即在“通用声明”段中用Public语句声明的变量。,6.4.3 静态变量,局部变量可以使用Static关键字声明为静态变量,这样,在每次调用过程时,静态变量可以保存原先的值。声明局部变量的语法为:,Static As ,Static Sub (),Static Function ()As ,在过程名前加上Static关键字,表明该过程的变量都是静态变量。,例6-7:下面程序中有三个同名的变量wv,图6-7是运行该程序后,三次单击Command1后显示的结果。 Public wv As Integer Private Sub Command1_Click() Dim wv As Integer wv = wv + 3 Call wholesub Print “Command1事件过程的wv=“; wv, “全局的wv=“; Form1.wv End Sub Public Sub wholesub() Static wv As Integer wv = wv + 1 Form1.wv = wv + 5 Print “wholesub过程的wv=“; wv, “全局的wv=“; Form1.wv End Sub Private Sub Form_Load() wv = 1 End Sub,图6-7 全局变量、局部变量、静态变量,利用静态变量记录某个事件被触发的次数 例6-9: Private Sub Command1_Click() Call password End Sub Private Sub password() Static counter As Integer Dim password As String counter = counter + 1 password = InputBox(“请输入密码“) If password = “12345“ Then counter = 0 If counter = 3 Then MsgBox “请核对密码后再运行程序“, vbOKOnly + vbInformation, “密码错误“ End End If End Sub,记录开关变量的值 例6-9: Private Sub Command1_Click() Static tandf As Boolean tandf = Not tandf If tandf = True Then Command1.Caption = “确认修改“ Text1.SetFocus Else Command1.Caption = “修改“ Text1.Text = “ End If End Sub,6.5 递归,在VB中可以使用递归调用。通俗地讲,递归就是一个过程调用过程本身。在递归调用中,一个过程执行的某一步可能要用到它自身上面调用的结果。 递归分为两种类型,一种是直接递归,即在过程中调用过程本身;种是间接递归,即间接地调用一个过程。,例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 If End Sub Public Function factorial(n As Double) As Double If n 1 Then factorial = n * factorial(n - 1) Else factorial = 1 End If End 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 Function Public Function greatcd(m As Integer, n As Integer) As Integer,图6-9 求最大公约数,If (m Mod n = 0) Then greatcd = n Print m, n Else greatcd = greatcd(n, m Mod n) Print m, n End If End Function,6.6 综合实例,6.6.1 查找 1.顺序查找,顺序查找即从数组的第一个元素开始与关键字进行比较,若相等则查找成功,否则,将下一个元素与关键字进行,直到最后一个,如果某个元素与关键字相等,则查找成功且停止继续查找。若找不到,则查找失败。,例6-13:利用顺序查找法找出数组中的某个数。 程序代码为: Dim a() Private Sub Command1_Click() Dim myrecord As Integer myword = Val(InputBox(“请输入要查找的关键字“) Call search(a, myword, myrecord) If myrecord = -1 Then MsgBox “没有您要查找的关键字“, vbInformation + vbOKOnly, “查询结果“ Else MsgBox “您要查找的关键字位置为“ & myrecord, vbInformation + vbOKOnly, “查询结果“ End If End Sub Public Sub search(p(), ByVal keyword, record As Integer) Dim x As Integer record = -1 For x = LBound(p) To UBound(p) If p(x) = keyword Then record = x: Exit For End If Next End Sub Private Sub Form_Click() ReDim a(0 To 50) For i = 0 To 50 a(i) = Int(Rnd * 91 + 10) Next End Sub,例6-14:从数组a中删除数组b中已有的数后形成新的数组x。 Dim a(), b() Private Sub Form_Click() 产生数组a和b ReDim a(1 To 10) : ReDim 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 : Print End Sub Private 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 = n + 1 n存放找到的元素个数 End If Next Next For i = 1 To 10 n : Print a(i); : Next a中只剩下10-n个有效元素 End Sub Public Sub delete(x(), m,n) For i = m To n : x(i) = x(i + 1) : Next 依次前移 x(n + 1) = 0 最后一个元素清零 End Sub,2. 二分法查找,顺序查找法适合数组较小的情况,当数组较大时,可以采用二分法查找以提高查找效率。,二分查找的思路是:将要查找的关键字与有序数组中中间元素相比较,如果相等,则查找成功,否则判断关键字落在数组的哪一部分,对该部分继续按照上述方法查找。,例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 Sub Public Sub sorter(x() 插入法排序函数 For i = 2 To 10 t = x(i): j = i - 1 Do While t x(j) x(j + 1) = a(j) : j = j - 1 If j = 0 Then Exit Do Loop x(j + 1) = t Next End Sub,Public Sub dichotomy(x(), ByVal low%, ByVal high%, ByVal keyword, record) 二分法查询函数 Dim mid As Integer mid = (low + high) / 2: Print If x(mid) = keyword Then record = mid : Exit Sub 找到关键字则退出函数过程 ElseIf low high Then record = -1: 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 Sub Private Sub Command1_Click() Command1_Click事件过程 mykeyword = Val(InputBox(“请输入要查找的关键字“) 给出关键字 Call dichotomy(a(), LBound(a), UBound(a), mykeyword, myrecord) 调用查询函数 If myrecord = -1 Then MsgBox “没有您要查找的关键字“, vbInformation + vbOKOnly, “查询结果“ Else MsgBox “您要查找的关键字位置为“ & myrecord, vbInformation + vbOKOnly, “查询结果“ End If End Sub,数组由单击窗体事件时随机产生并调用排序过程进行排序。Command1_Click事件过程给出关键字,调用查询函数,利用对话框显示查询结果。查询函数使用了递归调用。 如果不采用递归调用,可以将查询函数作如下修改: Public 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 = mid : mid = (low + high) / 2 Loop End Sub,6.6.2 加密与解密,例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 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 encipher = newtext End Function,Public Function revert(origtext As String) As String 解密函数 Dim newtext As String, currchar As String, 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 = newtext End Function Private Sub cmdintext_Click() 输入原文事件,对应图6-10中的“输入原文”按钮 everytext = InputBox(“请输入需要加密的原文“, “未加密“) End Sub Private Sub Cmdencipher_Click() 加密事件,对应图6-10中的“加密”按钮 Dim enciphertext As String enciphertext = encipher(everytext) 调用加密函数过程 MsgBox enciphertext, vbExclamation, “加密成功“ 对话框中显示加密的文本 End Sub Private Sub Cmdrevert_Click() 解密事件,对应图6-10中的“解密”按钮 Dim reverttext As String reverttext = revert(encipher(everytext) MsgBox reverttext, vbExclamation, “解密成功“ 对话框中显示解密的文本 End Sub,图6-10 加密与解密程序运行界面,6.6.3 用梯形法求定积分 函数f(x)在a,b区间的积分 I =,的几何意义为求曲线f(x)与直线y=0,x=a,x=b所围成的曲顶矩形的面积(参见图6-11)。采用梯形法求定积分是原函数不容易找到时常用的方法。 设h=(b-a)/n n为曲顶矩形的数目,n越大,精度越高,则有定积分I 的近似值s: s=,可以将上式改为迭代形式 s=,s=s+h(,例6-17:编程用梯形法求定积分,图6-11 梯形法求定积分示意图,图6-12 求定积分程序运行界面,Public Function fun(ByVal x As Double) As Double fun = x * x * x + x - 2 End Function Public 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 = s End Function Private Sub Command1_Click() If Text1.Text “ And Text2.Text “ And Text3.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 If End Sub Private Sub Command2_Click() Text1.Text = “ : Text2.Text = “ : Text3.Text = “ : Text4.Text = “ : Text1.SetFocus End Sub,6.6.4 高次方程求根 在数学运算中,经常会遇到高次方程求根的问题。常用的方法有牛顿切线法、二分法和弦截法。 1. 牛顿切线法 牛顿法的思路是: 为方程,给定一个初值x0作为方程的近似根,则可以用迭代公式,求解方程的更精确的近似根xi+1。条件是:对任意给定的较小值,总可以找到|xi+1-xi|。 牛顿切线法的几何意义为曲线,在(xi,,)处的切线与x轴,的交点。,图6-13 牛顿切线法求方程的近似根 图6-14 牛顿切线法求方程的近似根流程图,例6:编程用牛顿切线法求解方程,的近似根。 (1)界面设计,=0,图6-15 牛顿切线法程序运行界面,Public
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
提示  人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:大学VISUAL BASIC程序设计教程-课件PPT
链接地址:https://www.renrendoc.com/p-21836467.html

官方联系方式

2:不支持迅雷下载,请使用浏览器下载   
3:不支持QQ浏览器下载,请用其他浏览器   
4:下载后的文档和图纸-无水印   
5:文档经过压缩,下载后原文更清晰   
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

网站客服QQ:2881952447     

copyright@ 2020-2025  renrendoc.com 人人文库版权所有   联系电话:400-852-1180

备案号:蜀ICP备2022000484号-2       经营许可证: 川B2-20220663       公网安备川公网安备: 51019002004831号

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知人人文库网,我们立即给予删除!