




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
6可以简化程序设计任务。VisualBasic把这种逻辑部件称为过程。VisualBasic中使用的过程分为子程序过程(SubProcedure)、函数过程(FunctionProcedure)和属性过程(PropertyProcedure)三种。其中:SubFunctionProperty过程可以返回和设置窗体、标准模块以及类模块的属性值,也SubFunctionSub在VisualBasic中有两种Sub过程,即过程和通用过程 过VisualBasic程序是驱动的,所谓就是能被对象(窗体和控件)所按程序指定的方式作用把这些对发生的进行处理的代码放在过程中这样的过程称为过程在VisualBasic中当对象对一个的发生作出认定时便能自动地利用和该对应的名称引导过程因为这个名称建立了对象和代码之间的联系可以说过程是窗体和控件的附属物过程分为窗体过程和控件过程两种。定义过窗体过程的一般形式是PrivateSubForm_名(〔参数列表〕Eud窗体过程名由词Form、下划线和名结合而如果使用多文档界面(MDI)窗体,则由词“MDIForm”、下划线和名构成窗件过程名;每个窗体过程名前都有一个Private的前这表示该过程不能在它自己的窗体模块之外被调用。它的使用范围完全由VisualBasic所提供的具体本身所决定,用户不可以随意下的Load过程来实现PrivateSubForm_LoadCallMove((Screen.Width-Width)/2,(Screen.Heigh-EndScreen.WidthScreen.Heigh分别是屏幕对象的宽度和高度属性;WidthHeighVB系定义控件过控件过程的一般形式是PrivateSub控件名_名〔参数列表End控件过程名由控件名、下划线和名组组成控件过程名的控件名必须与窗体中某个控件相匹配否则VisualBasic将认为它是一个通用过程;控件过程也是私有过程,属于包含它的窗体模例如:在窗体中设置了一个名为Cmdend令按钮控件,它的对应事PrivateSubCmdend_Click()End建立过1,同时在代码框中显示默认的过程的模板对窗体而言它的默认过程是在过程列表框中选定一个过程后,就会在代码框中显示选定的PrivateSubEndSub 通用过通用过程是一个必须从另一个过程过程其它通用过程显式调用的程序段。通用过程有助于将复杂的应用程序分解成多个易于管理的逻辑单元,使得应用程序更简洁、更便于。通用Sub过程的定通用过程的结构与过程的结构类似。Sub过程的一般形式是:[Private|PublicStaticSub([参数列表])[ExitSub]EndSubEndSub体。在Sub语句之后,是过程的段,可以用Dim或Static语句过程Private|publicPublic。若在一个窗体StaticStatic指定过程中的局部变量为“静态”过程名名规则与变量命名规则相同在同一个模块中过程名必须唯数时,各参数之间用逗号分隔。VisualBasic的过程可以没有参数,但一对圆[Optional][ByVal][ByRef]变量名As数据类型]变量名[()]VisualBasic变量名或数组名。若变量名后ByVal:表明其后的形参是按值传递参数或称为“传值”(Passedby个参数ByRef;OptionalOptional前缀的参数是须用Optional关键字。所谓的可选参数就是在调用过程时,可以没有实As数据类型:该选项用来说明变量类型,若缺省,则该形参是“变体变EndVisualBasicExitSubExitSub语句时提前SubSubSubFunctionPrivateSubEmployee_Salary(ByValWork_timeAsInteger,SalarySalary=50*EndEmployeeSub过程,它有两个形式参数,其中Work_time是“传值”参数,其类型为整型变量,Salary是“传址”参数,其类建立通用Sub过第法的操作步骤是:选择“工具”菜单的“添加过程Sub1,(Function(PrivateSub1PrivateSubEndSub空白行处键入“PrivateSub过程名”或“PublicSub过程名”;EnterSubFunctionVisualBasicSqr、Sin、Int等。用户也可使Function语句编写自己的函数(Function)过程。[Private|PublicStaticFunction函数名([参数列表])AS数据类型][语句块[=表达式][ExitFunction][语句块[函数名=表达式EndFunction过程以Function语句开头,以 Function语句结Public、StaticSub过程相同;函数名名规则与变量名名规则相As在函数体内通过“=表达式”FunctionFunction过程返回0ExitFunctionExitFunctionFunctionFunctionSubSub过程或[6-1]编写一个求n!的函数过程PrivateFunctionFact(ByValNAsInteger)AsLongDimKAsIntegerFact=IfN=0OrN=1ThenExitFunctionForK=2ToNFact=Fact*KNextEndIfEndFunction 过程的调过程由一个发生在VisualBasic中的来自动调用或者由同一模请看一个说 本例的界面对象有窗体、一个命令按钮与一个。窗体的Name设置为Frmevent、Caption属性设置为“过程调用”;命令按钮的Name属性设为Cmdend、Caption属性设为“结束”;的Name属性设为Lag、Caption为空。OptionPrivateSubCallMove((Screen.Width-Width)/2,(Screen.Height-Height)/2)EndSubPrivateSub g.CaptionVisualBasicEndSubPrivateSubDimAsInteger,LAsBooleanCallForm_Unload() =1ThenMsgBox不退出,继续运行程序"EndIfEndPrivateSubForm_Unload(CancelAs MsgBox("AreyousurevbYesNo,?")6ThenCancel=1EndIfEnd运行程序,首先激活了Initialize(初始化)配置窗体,然后产生Load(加载),VisualBasic将窗体从磁盘装入到内存,调用SubForm_Load过程。执行该过程将窗体显示在屏幕正;窗体被激活Activate发生,调用Form_Activate过程,在窗体中显示“欢迎使用VisualBasic”。(见图6-3)。Initialize、Load、Activate等都是在一瞬间就完成了。接着程序等待下一个的发生。,我们单击窗体中的“结束”命令按钮命令按钮控件的Click,调Cmdend_clickCmdend_clickCallForm_Unload()语句显式调用了Form_Unload过程,在窗体出一个“退出?”的框(图6-3)。Unload与Load相反,它的最常用之过程可以由发生的自动激活以响应系统或用户的活动,也可以被,Sub过程调Sub过程和Function过程,必须在过程或其它过程中显式调用,否则过程代码就不会被执行在调用程序中程序执行到调用子过程的语句EndFunction6-4所示过程EndEndSubFunction过程时,VisualBasic就将程序后,VisualBasic将回收存放变量和参数的栈空间。然后返回断点继续程序的VisualBasicSubCallCall语句调用Sub过SubCall过程名实在参数表Sub[6-2]PrivateSubDimIntaAsInteger,StAsStringInta=Text1.TextCallFactor(Inta,St)Text2.Text=StEndPrivateSubFactor(ByValNAsInteger,ByRefSAsString)DimIAsIntegerForI=1ToN-IfNModI=0ThenS=S&Str(I)NextIEndSubFactor是找出任一个正整数的所有因子的过程,它有两个形式参数,一个是传值参数N,一个是传址参数S。在过程Command_click中,从文本框Text1输入数据给变量Inta赋值,并以IntaSt作为实参调用FactorStSSt接受过程返回Text2中。把过程名作为一个语句来[1[与第式相比,它有两点不同Factor调用Function过FunctionVisualBasic内部函数方法一样。即在Function过程名([实在参数表])FunctionSub过程不同,必须给参数加上括号,即VisualBasicSubFunctionPrivateFunctionExamAASInteger)CallExam或ExamVisualBasic[例6-3]用Function过程求二个正整数的最大公PrivateSubDimNAsIntegerMAsIntegerGAsIntegerN=InputBox("输入N")MInputBox("MG=(N,M)PrintN;"和M;"的最大公约数是GEndSubDimRAsIntegerR=AModDoWhileR<>A=B=R=AMod=BEnd本程序在Form_Click过程中用赋值语句G (N,M)调函数过程,函数返回值存放在变量G中,由于在定义函数 形式参数A和B被指定为“传值”参数。所以尽管A、B两个形参在函数调用窗体模块中的公有过SubExamSubForm1以外的模块中用下面即用<包含该过程的窗体模块名>.<过程名>作为调用名来调用对应的调用标准模块中的公有过准模块Module1Module2中都含有同名过程CommonSubModule1中CallCommonSub实在参数CommonSub过程。如果在其它模块中调用标准模块中公有过程则必须指定它是那一个模块的公有过程。例如在Module1调用Module2中的CommanSub则可用下面语句实现 类模块中的过Clssub过程:DimDemoClassASNewClass1CallDemoClass.Clssub([实参])递,SubFunction过程就能根据不同的参数执行同种任务。为了叙述形实SubFunction过程时,传送给相应过程的变量名,数组PrivateSubExamsub(XASinteger,YASEndSubPrivateSubDimXASsingle,YASCallEndSubY与形参表中的第一个形参变量X结合,实参表中的第二个实参变量X与形参表中的第二个Y结合。8-1是“形实结合”时的形参与实参形态对应关系。 假定有如下过程PrivateSubTest(AASsingle,LocASBoolean,Array1()ASInteger,Chr1ASString)EndSubPrivateSubForm_Click(DimXASSingle,StASsting*5DimA(5)ASIntegerEnd在过程Form_Click中用CallTest(X^2,True,A,St)语句调用Test过Loc结合第三个实参是整型数组A,与形参表中第三个整型形参数组Array15St,与形参表中的字符型形参Chr1结合。程序是通过参数向过程传递有关信息的在VisualBasic中参数值的传递 过程调用时VisualBasic给按值传递参数在栈中分配一个临时单元。只是实参变量的副本(图6-。当采用值传递时,过程对参数的任何改变实按值传送参数的程序示例PrivateSubCommand1_Click()DimMAsInteger,NAsIntegerM=15:N=20Print"m=";M,"n=";NEndPrivateSubValue_Change(ByValXAsInteger,ByValYAsInteger)X=X+20Y=X+Print"X=";X,"Y=";End地 变
N栈运行程序,单击命令按钮,触发命令按钮Click,执行Command1_Click过程,给整型变量M和N分别赋值15和20,执行CallValue_Change(M,NValue_ChangeMX6-5)。Value_ChangeXX20X35。赋YXYY55X、Y35,55。因为XY都是“传值”X、Y的改变,仅仅是改变栈中对应的回过程Command1_Click,M和N的值保持不变。输出的结果是:X= Y=M= N=
按地址传递参“同一”共享同一个单Value_ChangeX改为PrivateSubValue_Change(XAsInteger, ByvalYAsInteger)X=X+20Y=X+Print"X=";X,"Y=";End而过程Command1_Click不作任何改动。再调用Value_Change过参的地址(6-在过程Value_Change中对形参X的,实际是对包含M的值的内存单元的。X= Y=MXY MXY 栈图图 栈编写程序计算5!+4!+3!+2!+1!的PrivateSubDimSumAsInteger,IAsIntegerForI=5To1Step-1Sum=Sum+Fact(I)NextIPrint"SUM=";SumEndSubPrivateFunctionFact(NAsInteger)AsIntegerFact=1DoWhileN>0Fact=Fact*NN=N-1EndFunction运行上述程序,输出结果是:SUM120SUM=153的正确FunctionFactN是按地址传递的参数。而在过程Form_Click的For循环中用循环变量I作为实在参数调用函数FactFactN0I的值也跟着变为0,使得FOR循环仅执行一次,就立即退出循环。所以程序5!值,打印运行结果后就结束程序运行。在不改变函数Fact过程体的前提下,要得到预期结果,有两种方法:VisualBasic中把变量转换成表达式Fact((I))Fact,NIN的值在函数执I的值。VisualBasic就会用“按值传递”的方法来处理它。OptionPrivateSubDimV1AsInteger,V2AsInteger,V3AsIntegerV1=2:V2=3:V3=4Debug.PrintV1+V2+V3*Fun_Add(V1,V2,V3)EndSubPrivateFunctionFun_Add(aAsInteger,bAsInteger,cAsa=a+b=b+c=c+Fun_Add=a+b+cEndFunction在本例中,本想在立即窗口显示输出值161,但结果输出的是571。为什所以函数返回值39,同时也改变了实参V1、V2V3的值,实际计算的12+13+14*392+3+4*39的值。一个参数数据类型转换的程序示例PrivateSubForm_Click()DimSAsSingleS=CallConvert((S),"12"+".5")EndSubPrivateSubConvert(InxAsInteger,SingAsSingle)Inx=Inx*2Sing=Sing+Print"Inx=";Inx,"Sing=";SingEndSubCallConverts),“12”+“.5”)Convert表达式值强制转换成整型值然后传递给整型形参Inx因此Inx初值为126。12.5Sing。程序的输出结果是:Inx= Sing=如果将Call语句改为Call Convert((s),“123a”)程序执行Call语句时,将产生“类型不匹配”(Typemismatch)的错误,其原因是VisualBasic无法将字符串“123a”;转变成为单精度型的值,传送给Sing参数。数组参定义过程时,VisualBasic允许把数组作为形式参数,数组参数的格形参数组名()[As数据类型一个与数组参数的传递有关的程序示OptionExplicitOptionBase1PrivateSubDimArraya()AsInteger,IAsIntegerReDimArraya(5)Print调用前数组维上界是UBound(Arraya)CallChangedim(Arraya)Print调用后数组维上界是UBound(Arraya)Print"数组各元素值是:";ForI=1ToUBound(Arraya)PrintArraya(I);NextIEndPrivateSubChangedim(A()AsInteger)DimIAsIntegerReDimPreserveA(7)ForI=1To7A(I)=NextIEndSub数组各元素值是 对象参参变量的类型为“Control”就可以向过程传递控件。若把类型为图6- 图6-一个演示对象参数传递的程序示8-26-86-9分别是示名称标题11Frmfirst.frm,程序代码是:PrivateSubCmd1_Click()CallEndPrivateSubCmd2_Click()CallFrmarg(frmsecond)EndPrivateSubForm_Load()frmfirst.Left=2000Lab1.CaptionVB6.0"EndSubPrivateSubObjarg(LadAsControl)Lad.BackColor=&HFF0000Lad.ForeColor=&HFFFF&Lad.Font=14Lad.FontItalic=Lad.Caption="对象参数的传递"EndSubPrivateSubFrmarg(FAsF.Left=(Screen.Width-F.Width)/2F.Top=(Screen.Height-F.Height)/2EndSub2Frmsecond.frm,程序代码是:PrivateSubCmd3_Click()UnloadEndSubSubObjarg是以控件对象为参数,而SubFrmarg是以窗正体字显示“学习使用VB6.0”前景色为红(图6-若单击命令按纽Cmd1,调用执行过程Cmd1_Click,该过程以名Lab1为实在参数调用通用过程Objarg。执行SubObjarg过程后,在窗体中的框Lab1内以斜体字显会激活过程Cmd2_Click,该过程以窗体名Frmsecond为实在参数调用通用过程Frmarg。执行SubFrmarg过程后,隐藏窗体Frmfirst,显示Frmsecond窗体,Frmsecond窗体获得焦点成为活动窗体。递归过程是在过程定义中调用(或间接调用)自身来完成某一特定的任务解性好,算法的正确性证明也比较容易,因此掌握递归程序设计方法很有必要。 (n=0n!n*n- (n>1时Fact(n)n!,即要求出函Fact(n)Fact(n-1)的值。根据上面的递归表达式可编写出求n!的函数过PrivateFunctionFact(ByvalNAsInteger)AsLongIfN=0OrN=1ThenFact=1Fact=N*Fact(N-1)EndIfEndPrivateSubDimNAsInteger,FAsNInputBox("输入一个正整数")F=Fact(N)PrintN;"!=";FEndSub运行程序,点击窗体执行Form_click过程,从键盘输入3,赋值给变量N,即求3!的值。程序以Fact(N)形式调用函数Fact。当函数Fact开始运行时,首先检测传递过来的参数N是否为1,若为1则函数返回的值为1;若不为1,函数执行赋值语句Fact=N*Fact(N-1)。函数调用传递的参数N是3,函数计算表达式3*Fact(N-1)值,由于表达式中还有函数调用。于是 Basic第二次调用Fact函数但传递的参数是因为参数值不为1,函数同样要执行语句Fact=N*Fact(N-1)语句计算表达式2*Fact(N-1)值。当再一次调用此函数时,参数值为1,因此函数返回函数值1到本次调用点,此调用函数又返回2的值到调用这个调用函数的函数;最后,最初被调用的6Fact6-11
IfN=1thenFact=1
返回函数值IfN=1thenFact=1Fact=3*Fact(N-1)EndIfEndIfN=1thenFact=1
Fact=2*Fact(N-1)EndIfEnd返回函数值
返回函数值Fact1*Fact(N- End End6-6-10可以看出,一个递归问题可分为“调用”和“返回”两个阶段。当Fact函数被调用3Fact(3),Fact(2),Fact(1)Fact=1为止。然后带着初Fact(1)Fact(2)Fact(2)Fact(3)为止。编写递归过程要注意:递归有限递归,例如上面求N!的递归函数的边界条件是:Fact1.若一个递VisualBasic编程是非常重要的,变量和过程的作用域是用这个过程之中才有意义。过程级变量又称为局部变量。例如下面的函数Local_VariableX、YZ。PrivateFunctionLocal_Variable(NAsInteger)AsIntegerDimXAsInteger,YAsInteger,ZAsIntegerX=N*Y=X+Z=X+Local_Variable=X+Y-ZEndFunction当函数运行结束,VisualBasicX、Z明段(GeneralDeclarations)PrivateDim语句说明这个变量,由此说都可以它们但其它模块却不能这些变量下面的程序段是一个模块OptionDimTestStringAsStringPrivateSubForm_Activate()Debug.Print"在Form_Activate过程中";EndSubPrivateSubForm_Load()TestString测试变量作用域"EndPrivateSubDebug.PrintShowTestString中TestStringEndSubTestString,当程序运行时,首先在Form_Load过程中初始化TestString,接着系统激活Form_Activate过程显示变量TestString的值并调用子过程ShowTestString,ShowTestStringShowTestString的值。从上例可知模块级变TestString全局变VisualBasic程序中的任何一个代码段都可以(ModuleModule1.bas的OptionExplicitPublicGbaAsStringPublicSubMain()GbaGbaModule1.Bas中定义的全局变量LoadForm1Load EndOptionExplicitPublicGbfAsStringPrivateSubForm_Load()GbfGbf是在窗体模块中定义的全局变量CallMainEndSubPrivateSubDebug.Print"Form1中打印:"Debug.PrintGba的内容:GbaDebug.Print"Gbf的内容:";Gbf EndSubForm2.frm,代码为:OptionExplicitbPrivateSubDebug.Print"Form2中打印:"Debug.Print"Gba的内容:";GbaDebug.PrintGbf的内容:Form1.GbfEnd过程中都可以直接用它的变量名来它。而在过程中其它窗体模块中能正确地它例如在窗体模块Form2中用Form1.Gbf的格式在窗体Form1Gbf。误是由哪一个程序段的。另外如果对程序中的全局变量的使用理解不很模块Module1和Module2,分别在这两个模块中都定义了一个全局变量以Module1.Password的形式来调用它。若在标准模块Module1中本模块中的Password变量则可用变量名直接而使用标准模块Module2中Password的话,必须用标准模块名“Module2”Password的下面程序中,在窗体模块中定义了的全局变量X、Y和Z_XXYZOptionExplicitPublicXAsInteger,YAsInteger,ZAsIntegerPrivateSubForm_Activate()Debug.PrintX,YZ是X,YZEndSubPrivateSubForm_Load()X=10Y=Z=EndPrivateSub DimXAsIntegerX=Debug.PrintX,YZ是XYZEndSubX,Y和ZX,Y和Z从运行结果可以看出当不同作用域的同名变量发生时优先局限性静态变Static定义变量,那么这个变量就是一个静态变量。静态OptionPrivateSubCommand1_Click()DimKAsIntegerK=CallDebug.Print第一次调用:KKK=5CallDebug.Print第二次调用:KKEndSubPrivateSubStatic_Variable(ByRef NAsInteger)StaticStaAsIntegerSta=N+StaN=Sta+NEnd第一次调用:K第二次调用:KOptionPrivateSubDebug.Print"4!=Debug.Print"5!=";Fact_Error(5)EndSubPrivateFunctionFact_Error(ByValNAsInteger)AsIntegerStaticCountAsIntegerFact_Error=DoWhileCount<NCount=Count+1Fact_Error=Fact_Error*CountEnd如果上面程序正确在立即窗口第一行显示4!=24,第二行显示5!=120。4!=24,5!=5。[例6-4]简易文本编辑程文本框控件不仅可用于接受从键盘输入的数据或显示程序的处理结果,也可以用作文本编辑。图-1是本程序运行时的起始画面。为了使文本框可Me属性被设为r;coar属性设为(同时具有水平与垂直滚动条;程序的文件菜单包含了“打开保存退出等命令另外本程序还使了公共框部件以便 框图0-使用程序中的“打开”Text120-本内容。在该过程中调用了“保存”文件的过程。flag用于获取文本被修改的信息,只要文本发生改变,就会引flag的取值给用户提示信息,让用户决定是否保存文件。OptionDimflagAsPrivateSubForm_Unload(CancelAsInteger)DimfAsIntegerIfflagfMsgBox("文本已改变,要保存吗vbYesNo,程序示例")Iff=6ThenCall
EndEndIfEndSubPrivateSubDimInameAsString,sAsCommonDialog1.Filter="*.txt(文本文件 ‘设置公共框的Filter Iname=CommonDialog1.FileNameOpenInameForInputAs#11DoWhileNotEOF(11)s=s&Input(1,Close11EndPrivateSubDimOnameAsString,nAsLong,sAsCommonDialog1.Filter="*.txt(文本文件 ‘设置公共框Filter Oname=CommonDialog1.FileNameOpenOnameForOutputAs#12Print#12,sClose12flag=FalseEndPrivateSubM1_3_Click()UnloadMeEndPrivateSubText1_Change()flag=True 框控件 框控件属于ActiveX控件。使用“工程”菜单中的“部件”命令, CommonDialogControl6.0”后单击“确定”,即可将公共框控件加入VB的控件工具箱。ActiveX控件加入工具箱后,使用方法与VB的固有控件相同。[例6-5]利用级数法编程求arcsin函数 x
13x
135x
n13(2i1) xx 2
245
246
x
24(2i)(2i图6-13是根据程序功能要求及求解设计的程序界面。运行程序,要InputBoxx及允许误差值。若输入“0.5,0.0005”,xepsafunn6-14是程序执行的结果画面。图6-OptionPrivateSubDimxAsSingle,nAsInteger,epsAsSingleDimsAsSingle,aAsSingle,tempAsStringtemp=InputBox("1",
"求函数值temp=Trim(temp)n=InStr(temp,",")x=Left(temp,n-1):eps=Right(temp,Len(temp)-n)s=x:n=1a=afun(x,Ifa<=epsThenExitDos=s+an=n+Label2.Caption="arcsin("&CStr(x)&")="Text1.Text=sEndPrivateFunctionafun(ByValxAsSingle,ByValnAsInteger)AsSingleDimiAsInteger,pAsSinglep=Fori=1Top=p*(2*i-1)/(2*Nextafun=p*x^(2*n+1)/(2*n+1)EndFunctionPrivateSubCmdcls_Click()Text1.Text=""EndPrivateSubCmdend_Click()End图0-[例6-6]冒泡法冒泡法排序的算法是将待排序的数存放在Sort数组中首先比较Sort(1)Sort(3)(换这两个元素的值。重复此过程,直到处理完Sort(n-1)和Sort(n)这两个元素n-1次比较处理,最大的数被传到数组最后一个元素中,而较Switch,在比较过程中,若发生数据交换,将开关设置为真,即Switch=True,若没有发生数据交换,则将开关设为假,即Switch=FalseSwitchSwitch的值和ISwitchFalseOptionExplicitOptionBase1PrivateSubDimNumber(10)AsInteger,IAsIntegerForI=1ToNumber(I)=Int(Rnd*100)+1Text1=Text1&NextCallBubble_Sort(Number)ForI=1To10Text2=Text2&Str(Number(I))NextIEndPrivateSubBubble_Sort(Sort()AsInteger)DimIAsInteger,TemAsIntegerDimUbAsInteger,SwitchAsBooleanUb=UBound(Sort)Switch=TrueDoWhileSwitchSwitch=FalseUb=Ub-1ForI=1ToIfSort(I)>Sort(I+1)ThenSwitch=TrueTem=Sort(I)Sort(I)=Sort(I+1)Sort(I+1)=TemEndIfNextIEndSub[例6-7]把一个任意十进制正整数转换成N进制数名称标题文本1无2无3无4无无无无无无每个“FontMsSans图8-6-15DimNAsInteger,NumAsLongPrivateSubCmd1_Click()DimChAsString,IAsIntegerDimChar(15)AsStringDimBin()AsStringForI=0To9Char(I)=Str$(I)NextIForI=0ToChar(10+I)=Chr$(Asc("A")+NextIReDimForI=UBound(Bin)To1Step-1Ch=Ch+Bin(I)NextIEndPrivateSubCmd2_Click()EndPrivateSubText1_Change()N=Val(Text1.Text)Lal4.CaptionStr$(N进制数"EndSubPrivateSubText2_Change()Num=Val(Text2.Text)EndPrivateSubTrans(Vary()AsString,St()AsString)DimRAsIntegerDimKAsIntegerK=0DoUntilNum=R=NumModK=K+ReDimPreserveVary(K)Vary(K)=St(R)Num=Num\NEnd在程序中的过程Cmd1_Click中定义了字符串数组Char,并在其后For循环中将字符0~9、A~F0~15号元素。还定义了一个动态字符串数组Bin,将来用它作为实在参数与通用过程Trans的形参数组Vary结合,Trans是一个利用“N求余法”NTrans后,StCharSt的0~15号元素值也0~9,A~FNum÷N(Num中存放的值是它们的商的余数R,并用R作为St数组下标,用赋值语句Vary(K)=St(R)把每次求得的余数所对应的N进制数的字符存放到Vary数组Num0Bin是一个动态数VaryDo循环中每求得一个余数后,都要用KK1和ReDimpreserveVary(K)两个语句来Vary数组的维上界,Bin维上界也跟着变化了。返回调用程BinCh中。字符串变量Ch的值就N进制数。将十进制整数转换为八进制整数,可以采用“8取余法”,具体步骤8 86 0经过上述运算,(53)1016 163 0经过上述运算,(53)10将十进制整数转换为二进制整数,可以采用“2取余法”,具体步骤2120212602312110经过上述运算,(53)10[例6-8]用法求定积 法求函数f(x)=x2+12x+4在区间[1,4]的定积分4f1算法分析 法求积分为hy=
(b其中,a,b为积分区间[a,b];若将区间分为n等分,则h OptionPrivateSubCommand1_Click()DimaAsInteger,bAsIntegerDimstepAsInteger,SimpAsa=b=Val(Text2)Simp=Simps(a,b,step)PrintSimpEndPrivateFunctionFun(XAsSingle)AsFun=X*X+12*X+EndPrivateFunctionSimps(aAsInteger,bAsInteger,stepAsInteger)AsSingleDimHAsSingle,FourAsSingle,TwoAsSingleDimSAsSingle,XAsSingle,IAsIntegerH=(b-a)/stepX=S=Fun((a))+Fun((b))ForI=1Tostep/2X=X+Four=Four+Fun(X)X=X+HTwo=Two+Fun(X)NextITwo=Two-S=4*Four+2*TwoSimps=S*H/3EndSimpsSimpsForTwo所加的Fun(x)的值与Fun((b))的值重复,所以在循环外用语句Two=Two-[例6-9]编写一个递归函数,求任意两个整数的最大公约程序中的Function过程 是按照算(也称为辗转除法设计的一个递归函数,其边界条件(终止条件)是:当R=0时,函数赋值返回名称标题文本1无2无3无无无无无无6-17DimMAsLong,NAsLongPrivateSubCmd1_Click()DimvalueAsIfM<>0AndN<>0Thenvalue= (M,N)Text3.Text=Str$( EndIfEndPrivateSubCmd2_Click()EndPrivateSubText1_Change()M=Val(Text1.Text)EndPrivateSubText2_Change()N=Val(Text2.Text)EndPrivateFunction (ByValXAsLong,ByValYAsLong)DimRAsLongR=XModIfR=0=X=YY= EndIfEndFunction图8-[例6-10]验证大于5的奇数可表示成三个素数的算法说明:给定一个大于5N,调用Prime过程求出N以内的所OptionExplicitOptionBase1PrivateSubDimP()AsInteger,NAsInteger,LAsDimIAsInteger,JAsInteger,kAsInteger,AsBooleanN=InputBox("5的整数!")CallPrime(P,N)L=UBound(P)ForI=1ToLForJ=1ToFork=1ToIfP(I)+P(J)+P(k)=NDebug.PrintN;"=";P(I);"+";P(J);"+";=TrueExitForEndIfNextkIfThenExitForNextJIfThenExitForNextIEndPrivateSubPrime(A()AsInteger,NAsInteger)DimIAsInteger,IdxAsIntegerDimJAsIntegerForI=2ToNForJ=2ToIfIModJ=0ThenExitForNextJIfJ>Sqr(I)ThenIdx=Idx+ReDimPreserveA(Idx)A(Idx)=IEndIfNextIEnd多窗体程序设添加窗菜单中的新工程”(NewProject命令实现。其它窗体可以通过工程”(Project)菜单中的“添加窗体”(AddForm)命令实现。每创建一个窗体,该窗体作为一个对象添加到工程中去了。你可以在“Form在标准模块中添加过中“添加模块”(AddModule)(Private)过[例6-11]编写一个既可以求排列,又能求组合的应用程 1名称标题文本1VisualBasic多窗体2名称标题文本From21C2=MN3名称标题文本From31A2=MN6-186-196-20分别是三个窗体的参考界面。Module1中的程序代码是:PublicFunctionFact(nAsInteger)AsLongIfn=0Orn=1ThenFact=1Fact=n*Fact(n-1)EndIfEndPrivateSubEndPrivateSubCmd2_Click()EndPrivateSubCmd3_Click()End图8-图8-窗体bin的程序代码是:DimmAsIntegernAsIntegerPrivateSubCmdjs_Click()DimvalueAsIfm>nMsgBoxmn重新输入"Txtm.Text="m"Txtn.Text="n"ExitSubEnd图0-Txtv.Text=Str(Funzh(m,图0-PrivateSubCmdretu_Click()EndPrivateSubTxtm_Change()'Txtm.Text=""EndSubPrivateSubTxtn_Change()'Txtn.Text=""EndSubPrivateFunctionFunzh(mAsInteger,nAsInteger)AsLongDimfacmAsLong, AsLongDimfacmnAsLongfacm=Fact(m)=Fact(n)facmn=Fact(n-m)Funzh /(facm*EndFrmpermute的程序代码是:DimmAsInteger,nA
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论