




已阅读5页,还剩232页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VisualBasic程序设计简明教程第三版,教学目录第一章VisualBasic程序设计概述第二章VB简单的程序设计第三章VB语言基础第四章VB控制结构第五章数组第六章过程第七章用户界面设计第八章数据文件第九章图形操作,结束,第一章VisualBasic程序设计概述,1.1VisualBasic简介1.2VB集成开发环境1.3创建应用程序的过程,返回首页,1.1VisualBasic简介,1.1.1VisualBaisic及其发展VB是在Basic语言的基础上发展而来的。1991年Microsoft公司推出VisualBasic语言,以可视化工具进行界面设计,以结构化Basic语言为基础,以事件驱动为运行机制。,1.1.2VB主要功能和特点1.引例例1.1简单的字幕动画演示一行文字内容在具有背景图案的窗体上自上而下移动。移动两种方法:手动和自动。当内容超出窗体底部时,又从顶部重新开始往下移动。,1.1VisualBasic简介,1.1VisualBasic简介,2.VB主要功能和特点(1)具有面向对象的可视化设计工具;(2)事件驱动的编程机制;(3)提供了易学易用的应用程序集成开发环境;(4)结构化的程序设计语言;(5)支持多种数据库系统的访问;(6)Active技术;(7)VB6.0在开发环境上、网络功能等的增强;(8)完备的help联机帮助功能。,返回本章首页,1.2VB集成开发环境,1.主窗口应用程序窗口,由标题栏、菜单栏和工具栏组成。2.窗体(form)窗口设计VB程序的界面。3.代码(code)窗口编辑窗体、标准模块中的代码。4.属性(properties)窗口所有窗体或控件的属性设置。5.工程资源管理器(projectexpror)窗口保存一个应用程序所有的文件。6.工具箱(toolbox)窗口显示各种控件的制作工具,供用户在窗体上设计。,返回本章首页,1.3创建应用程序的过程,例1.2建立一个应用程序分为以下几个步骤:1.建立用户界面的对象。2.对象属性的设置。3.对象事件过程及编程。4.运行和调试程序。5.保存程序。(1)保存窗体文件。选择“文件Form1另存为”命令,在“文件另存为”对话框中,选择保存的文件夹,输入保存的文件名。(2)保存工程文件。选择“文件工程另存为”命令,在“工程另存为”对话框中,选择保存的文件夹,输入保存的文件名。,返回本章首页,第二章VB简单的程序设计,2.1对象的有关概念2.2窗体和基本控件2.3综合应用,返回首页,2.1对象的有关概念,程序设计方法的发展1.初期的程序设计高运行效率、少占用内存为目标。2.结构化程序设计程序的可读性、可维护性为目标。程序=算法+数据结构的面向过程的程序设计。3.面向对象的程序设计降低程序的复杂性、提高软件的开法效率和改善工作界面为目标。程序=对象+消息的面向对象的程序设计。,2.1对象的有关概念,1.类类是创建对象实例的模板,包含了创建对象的属性描述和行为特征的定义。2.对象是类的一个实例,继承了类的属性、方法。VB中常用的对象有:窗体、控件等。3.对象的建立和命名,4.对象的三要素(1)属性对象的性质,即用来描述和反映对象特征的参数。(2)方法对象的行为,即将一些通用的过程编写好并封装起来,作为方法供用户直接调用。(3)事件响应对象的动作称为事件,它发生在用户与应用程序交互时。如单击控件、鼠标移动、键盘按下等。事件过程指附在该对象上的用户编写的程序代码,是事件的处理程序。VB事件过程的形式如下:Sub对象名_事件名(参数列表)事件过程代码EndSub事件驱动过程是图形用户界面的本质,由用户控制而代码作出响应。,2.1对象的有关概念,2.1对象的有关概念,5.VB程序的执行步骤如下:(1)启动应用程序,装载和显示窗体;(2)窗体(或窗体上的控件)等待事件的发生;(3)事件发生时,执行对应的事件过程;(4)重复执行步骤(2)和(3);(5)直到遇到END结束语句结束程序的运行,或按“结束”强行停止程序的运行。,返回本章首页,2.2窗体和基本控件,1.通用属性(1)Name名称属性创建的对象名称,有默认的名。在程序中,控件名是作为对象的标识而引用,不会显示在窗体上。(2)Caption标题属性该属性决定了控件上显示的内容。(3)Height、width、top和left属性,(4)Enabled属性控件是否可操作。当设置为false时,呈暗淡色,禁止用户进行操作。(5)Visible属性控件是否可见。当设置为false时,用户看不到,但控件本身存在。(6)Font属性Fontname:字体;Fontsize:字体大小;Fontbold:是否是粗体;Fontitalic:是否斜体;Fontstrikethru:是否加一删除线。Fontunderline:是否带下划线。例2.1在窗体上建立两个命令按钮Command1和Command2,Command2的Font通过属性窗口设置,其余属性通过代码实现。,2.2窗体和基本控件,(7)Forecolor前景颜色属性设置控件的前景颜色(即正文颜色).。其值是一个十六进制常数,用户可以在调色板中直接选择所需颜色。(8)Backcolor背景颜色属性(9)Backstyle背景风格属性1-Opaque不透明显示,0-transparent:透明显示,即控件背景颜色显示不出来。(10)BorderStyle边框风格属性0-None:控件周围没有边框。(11)Alignment属性控件上正文水平对齐方式0:正文左对齐;1:右对齐;2:居中。(12)AutoSize属性控件是否根据正文自动调整大小,False(13)WordWarp属性AutoSizeTrue时,WordWarp才有效。按正文字体大小在垂直方向上改变显示区域的大小。,2.2窗体和基本控件,(14)TabIndex属性决定了按Tab键时,焦点在各个控件移动的顺序。各个控件默认TabIndex值就是以控件建立时的顺序,第一个为0。(15)控件默认属性反映该控件最重要的属性,使用时可省略属性名。注意:Command的默认属性为Default,当该属性为True,当按Enter键,该控件起作用。,2.2窗体和基本控件,2.窗体(1)主要属性Caption标题MaxButton、MinButtonIcon、ControlBoxPicture、AutoRedrawBorderStyle(012345)WindowsState(0-正常、1-最小化、2-最大化)(2)事件Click、DblClick、Load和Resize。Click和DblClick事件由鼠标单击和双击触发。Load当装入窗体时激发,通常用于对属性和变量初始化例2.2上述属性、Click、DblClick和Load事件演示。,2.2窗体和基本控件,(3)方法Print、Cls和Move等Print方法用来显示文本内容,形式为:对象.Print表达式Cls方法用来清除窗体上或图片框在运行时由Print方法显示的文本或用绘图方法所产生的图形。形式为:对象.ClsMove方法用来移动窗体或控件对象的位置,也可改变对象的大小。形式为:对象.Move左边距离,上边距离,宽度,高度,2.2窗体和基本控件,3.标签Label用于显示文本(输出)信息,不能作为输入信息的界面。BackStyle属性:背景样式0(Transparent)透明显示。1(Opaque)不透明。BorderStyle属性:边框样式0(None)控件周围没有边框。1(FixedSingle)控件带有单边框。Alignmeng属性:控件上标题(Caption)对齐方式0(LeftJustify)左对齐1(RightJustify)右对齐2(Center)居中AutoSize属性:决定控件是否可以自动调整大小。Ture自动调整大小False保持原设计时的大小,正文若太长自动裁剪掉。例1显示浮雕效果的文字,实现方法:字颜色、标签位置,2.2窗体和基本控件,例2.3标签属性的设置。效果,2.2窗体和基本控件,4.文本框TextBox是一个文本编辑区域,可在该区域输入,编辑和显示正文内容。(1)其他属性Text:正文内容;Maxlength:设置正文的最多字符个数,0任意长度值;MultiLine:是否为多行,默认为一行,False;ScrollBars:MultiLine为True时,该属性才有效,表示滚动条的形式0-None、1-Horizontal、2-Vertical、3-Both;Locked:是否可被编辑属性,False,表示为可编辑。PassWord:口令字符;Text属性返回输入的数据,屏幕显示该字符;SelStart、SelLength、SelText:选中文本的起始、长度、内容。例2.4复制选中的文本,2.2窗体和基本控件,(2)常用事件Change:当改变文本框的Text属性时会引发该事件。KeyPress(KeyAsciiAsInteger):同上,并可返回一个KeyAscii参数KeyAscii为13,按回车键;为0去除刚输入的字符。LostFocus:当控件失去焦点时发生。GotFocus:当控件获得焦点时发生。3.常用方法对象.SetFocus:是把光标移到指定的文本框对象中。4.文本框的应用数据过滤例2.5利用文本框,实现简单的两数加法运算。要求文本框具有对输入的数进行合法性检查都功能。文本框数据输入结束可通过回车或Tab键来表示。按回车键,通过KeyPress事件来判断;按Table键,焦点离开该控件,通过LostFocus事件来判断。判断输入是否是数字字符,由IsNumeric函数来实现,返回值为Ture表示是数字,否则表示有非数字字符。,5.命令按钮CommandButton接受用户输入的命令。输入命令可以有三种方式:(1)主要属性Caption:命令按钮显示的内容,可设置快捷键,例String(6-I,);Spc(6);String(I,)NextiEndSub,注意:String(number,character)返回指定长度重复字符的字符串。考虑:若把Spc(6)换成Tab(6),效果如何?,4.1顺序结构,4.Format格式输出函数作用:使数值、日期或字符串按指定的格式输出,形式为:Format(表达式,”格式字符串”)其中:表达式:要格式化的数值、日期和字符串类型表达式。格式字符串:表示按其指定的格式输出表达式的值。格式字符串有三类:数值格式、日期格式和字符串格式,格式字符串两旁要加双引号。函数返回值是按规定格式形成的一个字符串。例4.4利用格式输出符号“#”和“0”,控制小数位输出。,返回本章首页,4.1顺序结构,1.IfThen语句(单分支结构)IfThen语句块EndIf或IfThen,例4.5:已知两个数x和y,比较它们的大小,使得x大于y.Ifxz用一个IF语句和一个嵌套的IF语句实现,IfxyThent=x:x=y:y=tIfyzThent=y:y=z:z=tIfx0ThenPrint在第一象限ElseIfx0ThenPrint在第二象限ElseIfx0Andy0Andy0Print在第一象限Casex0Print在第二象限Casex0Andyy,x,y)(2)Choose函数形式是:Choose(数字类型变量,值为1的返回值,值为2的返回值)例如,Nop是1-4的值,转换成+、-、运算符的语句如下:Op=Choose(Nop,+,-,)当值为1,返回字符串“+”,然后放入Op变量中,值为2,返回字符串“-”,依次类推;当Nop是1-4的非整数,系统自动取Nop的整数办法在判断;若Nop不在14之间,函数返回Null值。,4.2选择结构,常见错误(1)在选择结构中缺少配对的结束语句对多行式的If块语句中,应有配对的EndIf语句结束。(2)多边选择ElseIf关键字的书写和条件表达式的表示ElseIf不要写成ElseIf;多个条件表达式次序问题,见例4.8。(3)SelectCase语句的使用SelectCase后不能出现多个变量;Case子句后不能出现变量,见例4.9。,4.2选择结构,返回本章首页,1.For循环语句(一般用于循环次数已知)形式For循环变量初值to终值Step步长语句块ExitFor语句块Next循环变量,循环变量,nn=n-mnmm、n为公约数m=nDoWhilemnmnIfmnThen146m=mn86Else26n=nm24EndIf22Loop,4.5综合应用,累加、连乘(要求掌握),1100的5或7的倍数的和Sum=0Fori=1To100IfiMod5=0OriMod7=0ThenSum=Sum+iEndIfNextiPrintSum,310的乘积t=1Fori=3To10t=t*iNextiPrintt,思考:若把循环体前面置各变量初值的语句放在循环体内,程序运行时会产生什么情况?,4.5综合应用,例4.18求自然对数e的近似值,要求其误差小于0.00001,近似公式为:该例题涉及两个问题:(1)用循环结构求级数和的问题。本例根据某项值的精度来控制循环的结束与否。(2)累加:e=e+t循环体外对累加和的变量清零e=0连乘:n=n*i循环体外对连乘积变量置1n=1PrivateSubForm_Click()Dimi%,neEndSub,4.5综合应用,求素数(要求掌握)素数是一个大于2,且不能被1和本身以外的整数整除的整数。判别某数m是否为素数最简单的方法是:对于m从i=2,3,m-1判别m能否被i整除,只要有一个能整除,m不是素数,否则m是素数。例5求100以内素数的代码:Form=2To100Fori=2Tom-1If(mModi)=0ThenGoToNotNextMNextiPrintmNotNextM:Nextm,m是否为素数,求100以内的素数,思考:此例用GoTo语句对非素数不作判断,若不用GoTo语句,如何修改程序?,4.5综合应用,穷举法(要求掌握)“穷举法”也称为“枚举法”或“试凑法”,即将可能出现的各种情况一一测试,判断是否满足条件,一般采用循环来实现。例4.19百元买百鸡问题。假定小鸡每只5角,公鸡每只2元,母鸡每只3元。现在有100元钱要求买100只鸡,编程列出所有可能的购鸡方案。设母鸡、公鸡、小鸡各为x、y、z只,根据题目要求,列出方程为:x+y+y=1003x+2y+0.5z=100三个未知数,两个方程,此题有若干个解。解决此类问题采用“试凑法”,把每一种情况都考虑到。方法一:最简单三个未知数利用三重循环来实现。方法二:从三个未知数的关系,利用两重循环来实现。,4.5综合应用,递推法“递推法”又称为“迭代法”,其基本思想是把一个复杂的计算过程转化为简单过程的多次重复。每次重复都从旧值的基础上递推出新值,并由新值代替旧值。例4.20猴子吃桃子。小猴在某天摘桃若干个,当天吃掉一半多一个;第二天吃了剩下的桃子的一半多一个;以后每天都吃尚存桃子的一半多一个,到第7天要吃时只剩下一个,问小猴共摘下了多少个桃子?分析:这是一个“递推”问题,先从最后一天推出倒数第二天的桃子,再从倒数第二天的桃子推出倒数第三天的桃子。设第n天的桃子为xn,那么它是前一天的桃子数的xn-1的一半减1,即xn=(xn-1+1)2,4.5综合应用,最小、最大值在若干个数中求最大值,一般先假设一个较小的数为最大值的初值,若无法估计较小的值,则取第一个数为最大值的初值;然后将每一个数与最大值比较,若该数大于最大值,将该数替换为最大值;依次逐一比较。例6随机产生10个100200之间的数,求最大值。,PrivateSubCommand1_Click()Max=100Fori=1To10 x=Int(Rnd*101+100)Printx;IfxMaxThenMax=xNextiPrintPrint最大值=;MaxEndSub,4.5综合应用,常见错误(1)不循环或死循环的问题主要是循环条件、循环初值、循环终值、循环步长的设置有问题。(2)循环结构中缺少配对的结束语句For少配对的Next(3)循环嵌套时,内外循环交叉(4)累加、连乘时,存放累加、连乘结果的变量赋初值问题1)一重循环在一重循环中,存放累加、连乘结果的变量初值设置应在循环语句前。2)多重循环这要视具体问题分别对待。,4.5综合应用,归纳:程序输入输出方式,输入(1)直接给变量赋值x=3(2)输入框inputboxs=inputbox(“提示”,“窗口标题”,“默认输入“,窗口x坐标,y坐标)(3)文本框控件:a=Text1.Text,4.5综合应用,输出(1)直接在窗体上输出(变量、字符串)PrintyPrint”正数”Print上网费用共计;Nexti,2数组的赋值在VB6.0中,提供了数组直接对数组的赋值。例如:Dima()AsVariant,b()AsVariant,i%a=Array(1,2,3,4,5)ReDimb(UBound(a)b=a3.数组的输出例5.3输出方阵sC中的下三角元素Fori=0To4Forj=0Toisc(i,j)=i*5+jPrintsc(i,j);NextjPrint换行NextI,注意:赋值号左边的数组只能声明为Variant的可调数组或简单变量。,5.2数组的基本操作,4.求数组中最大元素及所在下标例aDimMaxAsInteger,iMaxAsIntegerMax=iA(1):iMax=1Fori=2To10IfiA(i)MaxThenMax=iA(i)iMax=iEndIfNextI5.交换数组元素例5.4,5.2数组的基本操作,6.数组排序(选择法)例5.5对已知存放在数组中的n个数,用选择法按递增顺序排序。(1)从n个数的序列中选出最小的数(递增),与第1个数交换位置;(2)除第1个数外,其余n-1个数再按(1)的方法选出次小的数,与第2个数交换位置;(3)重复(1)n-1遍,最后构成递增序列。,5.2数组的基本操作,规律:n个数需要比较n-1次第m次比较第m个至第n个数第m次求出最小值,与第a(m)个元素交换,5.2数组的基本操作,DimnAsIntegern=6ReDimA(1Ton)AsInteger重新定义数组Print“原始数据是:Fori=1TonA(i)=Int(Rnd*11+20)PrintA(i);NextiPrint换行,通过循环给数组赋值,5.2数组的基本操作,Fori=1Ton-1Min=A(i)Forj=i+1TonIfA(j)=AAndcaverthenj=j+1:printjnexti,5.5综合应用,2.大量数据的输入例5.15输入一系列的数据,并将它们分离后存放在数组中。对输入的数据允许修改和自动识别非数字数据。分析:(1)利用文本框输入和编辑数据,输入时去除非法数字。(2)输入结束利用Rplace函数去除重复输入的分隔符;(3)对利用Split函数按分隔符分离,放到数组中;(4)还可利用Join函数将数组中各元素合并成一个字符串。,5.5综合应用,数组中常见错误和注意事项1.静态数组声明下标出现变量n=InputBox(输入数组的上界)Dima(1Ton)AsInteger2数组下标越界引用的下标比数组声明时的下标范围大或小。Dima(1To5)AsLong,i%a(1)=1:a(2)=1Fori=1To30a(i)=a(i-2)+a(i-1)a(0)不存在Nexti,返回本章首页,5.5综合应用,第六章过程,6.1函数过程的定义与调用6.2子过程的定义与调用6.3参数传递6.4递归6.5变量的作用域6.6常用算法(三)6.7重点和难点算法掌握:顺序查找、数值积分、字符处理应用,返回首页,除了系统提供的内部函数过程和事件过程外,用户可自定义过程:以Sub保留字开始的为子过程;以Function保留字开始的为函数过程。1.例6.1(用否函数,判断能否构成三角形)已知多边形的各条边的长度,要计算多边形的面积。计算多边形面积,可将多边形分解成若干个三角形。计算三角形面积的公式如下:,定义函数过程area:PublicFunctionarea(x!,y!,z!)AsSingleDimc!c=1/2*(x+y+z)area=Sqr(c*(c-x)*(c-y)*(c-z)EndFunction,调用函数过程:Subcommand1_click()输入若干个三角形边长S1=area(a,b,c):S2=area(c,d,e)S3=area(e,f,g):S=S1+S2+S3PrintSEndSub,6.1函数过程的定义与调用,2.函数过程的定义两种方法:(1)利用“工具”菜单下的“添加过程”命令定义,生成一个函数的框架。(2)利用代码窗口直接定义。函数过程形式:Public|PrivateFunction函数过程名(参数列表)As类型局部变量或常数定义语句块函数名=返回值函数过程体ExitFunction语句块函数名=返回值EndFunction,6.1函数过程的定义与调用,函数过程名:命名规则同变量名,可采用驼峰结构。参数列表形式:ByVal变量名()As类型称为形参或哑元,只能是变量或数组名、定义时无值,代表了参数的个数、类型和位置。如果是数组需要加(),如:Functionarea(a%,b%,c%)AsSingleFunctionMax(a()asinteger)AsIntegerFunctionA()无参数,不能省略()ByVal传值,表示参数是值传递,否则是地址传递ByRef(传址).函数名=返回值函数体内至少对函数名赋值一次。ExitFunction:表示跳出函数过程。上例调用时,area(a,b,c)将具体的值a,b,c(实参)代替形参x!,y!,z!,通过执行过程体,得到函数结果,返回给主调程序。,6.1函数过程的定义与调用,3.函数过程的调用函数过程的调用与前面大量使用的内部函数调用相同。唯一的差别是函数过程由用户定义,内部函数由VB系统提供。形式如下:函数过程名(实参列表)其中,实参(实际参数)是传递给过程的变量或表达式。,6.1函数过程的定义与调用,调用过程流程图:,Functionarea(x!,y!,z!)AsSingleDimc!c=1/2*(x+y+z)area=Sqr(c*(c-x)*(c-y)*(c-z)EndFunction,SubCommand1_Click().S1=area(a,b,c).EndSub,S1area,ax,by,cz,6.1函数过程的定义与调用,例6.3编一函数,统计字符串中汉字的个数。分析:在VB中,字符以Unicode码存放,每个西文字母和汉字字符占有两个字节。两者的区别是汉字的机内码最高位为1,若利用Asc函数求其码值为小于0(数据以补码表示),而西文字符的最高位为0,利用Asc函数求其码值为大于0.,6.1函数过程的定义与调用,算法举例:1、用函数过程判断素数2、用函数过程求最值3、用函数进行排序,返回本章首页,6.1函数过程的定义与调用,函数过程PublicFunctionsushu(nAsInteger)AsBooleansushu=TrueForj=2Ton-1If(nModj)=0Thensushu=FalseEndIfNextjEndFunction,返回逻辑型Sushu=True是素数Sushu=False不是素数,6.1函数过程的定义与调用,函数调用sushu(m)PrivateSubCommand1_Click()DimmAsIntegerm=InputBox(请输入任意正整数,判断素数)Ifsushu(m)=TrueThenPrint输入的数是:;m;它是素数ElsePrint输入的数是:;m;它不是素数EndIfEndSub,返回,6.1函数过程的定义与调用,函数过程PublicFunctionmax(a%,b%)求两个数中的最大值IfabThenmax=aElsemax=bEndIfEndFunction,6.1函数过程的定义与调用,主调程序PrivateSubCommand1_Click()Dimi,intMaxAsIntegerDima(0To4)AsIntegerPrint产生的随机数:Fori=0To4a(i)=Int(Rnd*91+10)Printa(i);NextiintMax=a(0)赋初值Fori=1To4intMax=max(intMax,a(i)NextiPrintPrint最大值=;intMaxEndSub,显示产生的随机数,循环调用函数,打印空格,打印最大值,返回,6.1函数过程的定义与调用,函数过程PublicFunctionpaixu(a()AsInteger,n)AsStringDimi,j,t,iMinasIntegerFori=1Ton-1iMin=iForj=i+1TonIfa(j)0.5Thenk=1Elsek=-1CallMyMove(k)EndSub,6.2子过程的定义与调用,例6.5分别编写统计字符串S中定冠词“the”出现个数的子过程和函数过程,并分别调用。分析:统计定冠词出现的个数,可以利用inStr函数在字符串中找子串the,若InStr函数的返回值0,说明找到1个;然后利用Mid函数取“the”后的那部分字符串,再利用InStr继续找。对同一问题定义两种过程时,只要抓住函数过程和子过程的区别,即函数名有一个值、子过程名无值的特点。这样当定义好函数过程后,要改为子过程,只要将函数过程的返回结果作为子过程的形参即可,即在子过程中增加一个参数;反之亦然。,6.2子过程的定义与调用,用函数过程实现PublicFunctionFuncThe(ByVals$)DimCount%,i%,st$Count=0st=Trim(s)i=InStr(st,the)DoWhilei0Count=Count+1st=Mid(st,i+1)i=InStr(st,the)LoopFuncThe=CountEndFunctionPrivateSubCommand1_Click()Label3=FuncThe(Text1)EndSub,用子过程实现SubProcThe(ByVals$,ByRefCount%)Dimi%,st$Count=0st=Trim(s)i=InStr(st,the)DoWhilei0Count=Count+1st=Mid(st,i+1)i=InStr(st,the)LoopEndSubPrivateSubCommand2_Click()Dimn%CallProcThe(Text1,n)Label4=nEndSub,6.2子过程的定义与调用,例10分别编一计算某级数部分和的子过程和函数过程,并调用。级数为:精度为:,函数过程实现求部分级数和Functionjishu1(x!,eps#)AsDoubleDimn%,s#,t#n=1:s=0:t=1DoWhile(Abs(t)=eps)s=s+tt=t*x/nn=n+1Loopjishu1=sEndFunction,子过程实现求部分级数和Subjishu2(s#,x!,eps#)Dimn%,t#n=1:s=0:t=1DoWhile(Abs(t)=eps)s=s+tt=t*x/nn=n+1LoopEndSub,f1=jishu1(2#,0.000001)调用函数过程Calljishu2(f2,2#,0.000001)调用子过程或jishu2f2,2#,0.00001,6.2子过程的定义与调用,程序运行流程:PrivateSubCommand1_Click()Dimf1#,f2#f1=jishu1(2#,0.000001)Calljishu2(f2,2#,0.000001)Printf1=;f1,f2=;f2EndSub,返回本章首页,6.2子过程的定义与调用,指主调过程的实参传递给被调过程的形参。1.传址与传值传址:形参得到的是实参的地址,当形参值的改变同时也改变实参的值。传值:形参得到的是实参的值,形参值的改变不会影响实参的值。例6.6两个变量的交换。SubSwap1(ByValx%,ByValy%)t%=x:x=y:y=tEndSubPrivateSubCommand1_Click()a%=10:b%=20:Swap1a,b传值PrintA1=;a,B1=;ba=10:b=20:Swap2a,b传址PrintA2=;a,B2=;bEndSub例11求若干个数的最大公约数。,SubSwap2(x%,y%)t%=x:x=y:y=tEndSub,6.3参数传递,2.数组参数的传递当参数是数组通过传址方式进行传递。注意:在实参和形参中写数组名,忽略维数的定义,但圆括号不能省。被调过程可通过Lbound和Ubound函数确定实参数组的下、上界。Lbound和Ubound函数的形式如下:L|Ubound(数组名,维数)其中:维数指明要测试的是第几维的下标值,缺省是一维数组。例12编一函数tim,求任意一维数组中各元素之积。调用tim,求和Functiontim(a()AsInteger)Dimt#,i%t=1Fori=Lbound(a)ToUbound(a)t=t*a(i)Nextitim=tEndFunction,调用:SubCommand1_Click()Dima%(1To5),b%(3To8)t1#=tim(a()t2#=tim(b()Printt1,t2EndSub,6.3参数传递,例6.7如下sum子过程求数组a各元素和,并改变数组各元素值。PublicFunctionsum%(x()Dimi%sum=0Fori=0ToUBound(x)sum=sum+x(i)x(i)=2*x(i)NextiEndFunctionPrivateSubCommand1_Click()Dimb(),i%,s%b=Array(1,3,5,7,9)s=sum(b()Print调用sum过程后数组b的各元素和为:;sPrint调用sum过程后数组b的各元素值为:Fori=0ToUBound(b)Printb(i);NextiEndSub,6.3参数传递,使用过程注意事项:1.确定自定义的过程是子过程还是函数过程函数过程名有值,子过程名无值。2过程中形参的个数和传递方式的确定过程中参数的作用是实现过程与调用者的数据通信。(1)从主调程序获得初值,值传递。(2)将结果返回给主调程序,地址传递。3.实参与形参结合时对应问题个数、类型、位置、次序一一对应。形参是值传递,对应实参可以是表达式、常量、数组元素。形参是地址传递,对应实参只能是简单变量。数组、记录类型、对象只能是地址传递。,6.3参数传递,返回本章首页,Subf1(x)x=f2(xx)*3EndSub,SubCommand1_Click()Callf1(y)EndSub,Functionf2(x)f2=f3(x)+3EndSub,Functionf3(x)f3=x*xEndSub,Subf1(x)Callf1(y)EndSub,过程的直接调用,SubCommand1_Click()Callf1(y)EndSub,过程的递归调用,6.4递归,1.递归的概念用自身的结构来描述自身就称为“递归”。例对阶乘的定义:,2.递归过程过程在自身定义的内部调用自己。例6.8编fac(n)=n!的递归函数Functionfac(nAsInteger)AsIntegerIfn=1Thenfac=1Elsefac=n*fac(n-1)EndIfEndFunction,SubCommand1_Click()Print“fac(4)=”;fac(4)EndSub结果:fac(4)=24,6.4递归,递推,回归,在递归处理中,用栈来实现。栈中存放形参、局部变量、返回地址。递推过程:每调用自身,当前参数压栈,直到达到递归结束条件。回归过程:不断从栈中弹出当前的参数,直到栈空。递归算法设计简单,但消耗的机时和占据的内存空间比非递归大。思考:若上述fac函数中少了:Ifn=1Thenfac=1即仅有语句:fac=n*fac(n-1)或nrThenCallf(nr,r)PrintnModr;EndSubPrivateSubCommand1_Click()Callf(100,8)EndSub,显示结果144,6.4递归,例6.10打印分形图,6.4递归,递归常见错误:递归调用出现“栈溢出”在递归调用时,其中的参数要向终止方向收敛。如下求阶乘的递归函数过程:PublicFunctionfac(nAsInteger)AsIntegerIfn=1Thenfac=1Elsefac=n*fac(n-1)EndIfEndFunctionPrivateSubCommand1_Click()Printfac(5)=;fac(5)Printfac(5)=;fac(-5)栈溢出EndSub,6.4递归,返回本章首页,作用域:变量、过程随所处的位置不同,可被访问的范围。1.局部变量:在过程内用声明的变量,只能在本过程中使用。2.窗体/模块级变量:在“通用声明”段中用Dim语句或用Private语句声明的变量,可被本窗体/模块的任何过程访问。3.全局变量:在“通用声明”段中用Public语句声明的变量,可被本应用程序的任何过程或函数访问。,6.5变量的作用域,例如在下面一个标准模块文件中不同级的变量声明:PublicPaAsinteger全局变量PrivateMbAsstring*10窗体/模块级变量SubF1()DimFaAsinteger局部变量EndSubSubF2()DimFbAsSingle局部变量EndSub,6.5变量的作用域,若在不同级声明相同的变量名,系统按局部、窗体/模块、全局次序访问如:PublicTempAsinteger全局变量SubForm_Load()DimTempAsInteger局部变量Temp=10访问局部变量Form1.Temp=20访问全局变量必须加窗体名PrintForm1.Temp,Temp显示2010EndSub,6.5变量的作用域,4.静态变量局部变量声明:Dim声明,随过程的调用而分配存贮单元,每次调用都对变量初始化;过程体结束,变量的内容自动消失,存储单元释放。Static声明,每次调用过程,变量保持原来的值。声明形式:Static变量名AS类型StaticFunction函数过程名(参数列表)As类型StaticSub子过程名(参数列表)过程名前加Static,表示该过程内的局部变量都是静态变量。例13PrivateSubForm_Click()Dimi%,isum%Fori=1To5isum=sum(i)PrintisumNextiEndSub,PrivateFunctionsum(nAsInteger)DimjAsIntegerj=j+nsum=jEndFunctionStaticjAsInteger,结果?,结果为:1,2,3,4,5,6.5变量的作用域,返回本章首页,例6.14编一加密和解密的程序,即将输入的一行字符串中的所有字母加密,加密后还可以再进行解密。PublicFunctionCode(ByVals$,ByValkey%)DimcAsString*1,iAsc%,i%Code=Fori=1ToLen(s)c=Mid$(s,i,1)SelectCasecCaseAToZiAsc=Asc(c)+keyIfiAscAsc(Z)TheniAsc=iAsc-26Code=Code+Chr(iAsc)CaseaToziAsc=Asc(c)+keyIfiAscAsc(z)TheniAsc=iAsc-26Code=Code+Chr(iAsc)CaseElseCode=Code+cEndSelectNextiEndFunction,6.6常用算法(三),查找(1)顺序查找例6.15。(要求掌握)顺序查找根据查找的关键值与数组中的元素逐一比较(数组可无序)PublicSubSearch(a()AsVariant,ByValkeyAsVariant,index%)Dimi%Fori=LBound(a)ToUBound(a)Ifkey=a(i)Then找到,元素的下标在index中,结束查找index=iExitSubEndIfNextiindex=-1找不到,index形参的值为-1EndSub平均查找次数n/2,6.6常用算法(三),Keya(mid)low=mid+1查找区域缩小一半,继续,直到找到或查找区域中无元素.本例用递归实现例14Subbirsearch(a(),low%,high%,key,index%),(2)二分法查找要查找的数组必须有序。思想:要查找的关键值Key同数组的中间mid项元素比较:,444,Key,6.6常用算法(三),2.排序选择、冒泡、插入法排序等。前两种排序欲排序的数据全部输入后,再进行排序;插入法排序每输入一项,马上插入到数组应在的位置,数组始终有序。例15实现的步骤:(1)输入欲排序的数据项x;在数组a中找x应所处的位置j;(2)从数组的最后一个元素开始到下标j依次往后移,使j位置空出;(3)将x放入位置j处,一个数据插入完成;(4)有若干个数重复(1)(3)。,6.6常用算法(三),3.例6.16高次方程求根有牛顿迭代法、二分法、弦截法等(1)牛顿迭代法迭代公式:思想:对方程给定一个初值x0作为方程的近似根,利用迭代公式,求得x1,当x1为求得的近似根,否则x1作为x0再迭代。,6.6常用算法(三),(2)二分法求根思想:已知求根区间a,b有一根,每次把求根区间缩小一半,直到找到解或求根区间足够小。方法:求a,b的中点c,判断:f(c)=0,,c为求得的根,结束;f(a)与f(c)同号,则a,c无根,代替a;否则c,b无根,c代替b;使求根区间缩小一半,重复上述步骤,直到区间小于精度。,PublicFunctionhalfRoot(ByVala!,ByValb!)Dimc!DoWhileAbs(b-a)0.00001c=(a+b)/2Iff(c)=0ThenExitDoElseIff(a)*f(c)0Thena=cElseb=cEndIfLoophalfRoot=cEndFunction,6.6常用算法(三),4.例16数值积分(要求掌握)有矩形法、梯形法、抛物线法(又称辛卜生法)等。梯形法积分的思想是:将积分区间a,bn等分,小区间的长度为,第i块小矩形的近似面积为:整个积分的结果为这n块小面积的累加,即:,PublicFunctiontrapez(ByVala!,ByValb!,ByValn%)AsSingleDimsum!,h!,x!h=(b-a)/nsum=(f(a)+f(b)/2Fori=1Ton-1x=a+i*hsum=sum+f(x)Nextitrapez=sum*hEndFunction,6.6常用算法(三),5.字符串处理(要求掌握)例6.17编写一个英文打字训练的程序.要求如下:(1)在标签框内随机产生30个字母的范文;(2)当焦点进入文本框时开始计时,并显示当时时间;(3)在键入文本框按产生的范文输入相应的字母;(4)当键入满了30个字母后结束计时,禁止向文本框输入内容,与范文逐一比较,显示打字的速度和正确率。,6.6常用算法(三),返回本章首页,6.7重点和难点,1.确定自定义的过程是子过程还是函数过程函数过程名有值,子过程名无值。过程有一个返回值,则使用函数过程;若返回多个值或无返回值,一般使用子过程。2过程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论