过程与函数课件_第1页
过程与函数课件_第2页
过程与函数课件_第3页
过程与函数课件_第4页
过程与函数课件_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

关于过程与函数第1页,讲稿共43页,2023年5月2日,星期三VisualBasic函数分为内部函数和自定义函数,自定义函数是用户根据需要用Function关键字定义的函数过程。6.1.1函数过程(Function过程)的定义[Public|Private][Static]Function函数名([<参数列表>])[As<类型>]

<局部变量或常数定义><语句块>[函数名=返回值][ExitFunction]<语句块>[函数名=返回值]EndFunction函数体6.1Function过程第2页,讲稿共43页,2023年5月2日,星期三Function定义示例(两种方式)第3页,讲稿共43页,2023年5月2日,星期三调用形式:

函数名(实参列表)说明:在调用时实参和形参的数据类型、顺序、个数必须匹配。函数调用只能出现在表达式中,其功能是求得函数的返回值。6.1.2函数的调用PrivateSubForm_Click()Dimx%,y%,z%x=Val(InputBox("输入一个正整数x:"))y=Val(InputBox("输入一个正整数y:"))z=gcd(x,y)Printx&"与"&y&"的最大公约数为:"&zEndSub第4页,讲稿共43页,2023年5月2日,星期三例6.2打印出100到200之间的所有素数FunctionIsPrime(n%)AsBooleanDimk%

IsPrime=True'先假定n是素数

Fork=2ton-1Ifnmodk=0Then

IsPrime=False

'确定n是不素数,返回FalseExitFunction'退出函数,也可用ExitFor或k=nEndIfNextk'For循环正常结束时,n是素数,返回TrueEndFunctionPrivateSubForm_Click()Dimi%,k%k=0'k用来记录素数的个数,初始值为0

Fori=100to200IfIsPrime(i)ThenPrinti;k=k+1

IfkMod10=0

ThenPrint

'书中印刷错误

EndIf

NextiEndSubFori=101to199

Step2

'偶数不可能是素数

第5页,讲稿共43页,2023年5月2日,星期三

在程序中调用一个函数,而在函数中又调用另外的函数,这种程序结构称为函数的嵌套调用。嵌套调用的执行过程如下图所示:6.1.3函数的嵌套调用第6页,讲稿共43页,2023年5月2日,星期三例6.3牛顿迭代法求解高次方程的根FunctionFunx#(ByValx#)Funx=3*x*x*x-4*x*x-5*x+13'求函数的值EndFunctionFunctionFun1x#(ByValx#)Fun1x=9*x*x-8*x-5'求导函数的值EndFunctionFunctionNewton#()Dimxx=8'随意指定一个初值

Dox=x-Funx(x)/Fun1x(x)

'牛顿迭代公式

LoopUntilabs(Funx(x))<=0.000001Newton=xEndFunctionPrivateSubForm_Click()Print"方程3*x^3-4*x^2-5*x+13=0的根为:";Newton()EndSub第7页,讲稿共43页,2023年5月2日,星期三6.1.4函数的递归调用第8页,讲稿共43页,2023年5月2日,星期三递归函数的三个要点①要有一个结束递归的条件。②递归结束时,要有一个明确的值。③要有一个求值的递归公式,且递归能向结束条件的方向发展。例6.4用递归算法求一个正整数的阶乘。PrivateFunctionfac(nAsInteger)AsLongIfn=1Orn=0Then'结束递归的条件

fac=1

'结束递归时,函数的值为1Else

fac=n*fac(n-1)

'递归公式

EndIfEndFunctionPrivateSubCommand1_Click()Dimk%

k=Val(InputBox("输入一个正整数k"))Printk&"!="&fac(k)EndSub第9页,讲稿共43页,2023年5月2日,星期三递归函数的执行过程第10页,讲稿共43页,2023年5月2日,星期三递归程序示例能够用递推算法解决的问题,大多数都能用递归算法来实现!

'猴子吃桃问题PrivateFunctiontao(mAsInteger)AsIntegerIfm=7Then'第7天只剩下一个桃

tao=1

'结束递归时,函数的值为1Else

tao=2+2*tao(m+1)

'递归公式

EndIfEndFunction'求最大公约数的函数PrivateFunctiongcd2%(ByValm%,ByValn%)IfmModn=0Then

gcd2=nElse

gcd2=gcd2(n,mModn)EndIfEndFunction第11页,讲稿共43页,2023年5月2日,星期三6.2Sub过程6.2.1Sub过程的定义

[Public|Private][Static]Sub过程名([形参表])

<局部变量或常数定义>

<语句块

1>

[ExitSub]

<语句块

2>EndSub

说明:<过程名>的命名规则与变量名规则相同。过程名不返回值,不能当变量使用。第12页,讲稿共43页,2023年5月2日,星期三Sub过程的调用形式:

子过程名[参数列表]

Call

子过程名(参数列表)说明:

(1)参数列表称为实参或实元,它必须与形参保持个数相同,位置与类型一一对应。(2)调用时把实参值传递给对应的形参。6.2.2过程的调用或PrivateSubSwap(ByRefx%,yAsInteger)….Callswap(a,b)Swapa,b第13页,讲稿共43页,2023年5月2日,星期三例6.5

交换两个变量值的Sub过程PrivateSubSwap(x%,yAsInteger)

DimtempAsInteger

temp=x:x=y:y=tempEndSubPrivateSubCommand1_click()

Dima%,b%a=15:b=20

Print"BeforeSwap(a,b):a=";a,"b=";b

Call

swap(a,b)

Print"AfterSwap(a,b):a=";a,"b=";bEndSubBeforeSwap(a,b):a=15b=20AfterSwap(a,b):a=20b=15第14页,讲稿共43页,2023年5月2日,星期三1、形式参数

在定义过程时,出现在Sub或Function语句中的过程名或函数名后面的园括号内的参数,只能是简单变量或数组名,它没有值,等待传递…。6.3过程之间参数的传递2、实际参数在调用Sub或Function过程时,写在过程名或函数名后括号内的参数。实参可以是常量、变量名、表达式或数组名。PrivateSubSwap(x%,yAsInteger)….EndSubCallswap(a,b)实参的个数与类型,要按顺序与形参一一对应匹配!第15页,讲稿共43页,2023年5月2日,星期三6.3.1单向的传值方式第16页,讲稿共43页,2023年5月2日,星期三6.3.2双向的传地址方式

实参必须是变量。如果实参是常量或表达式,只能实现单向的值传递!Callswap(a,b+0)Callswap((a),b)第17页,讲稿共43页,2023年5月2日,星期三例6.6传值与传地址的区别PrivateFunctionfx(ByValxAsInteger)

x=x+x

fx=xEndFunctionPrivateFunctionfy(ByRefyAsInteger)

y=y+y

fy=yEndSubPrivateSubcommand1_click()

Dima%,b%a=10:b=15

printfx(fx(a));fy(fy(b));a;bEndFunction程序的运行结果为:40601030第18页,讲稿共43页,2023年5月2日,星期三6.3.3数组参数的传递PrivateSubSort(x()AsIntefer)Dimi%,j%,m%,t%Fori=LBound(X)ToUBound(X)-1m=iForj=i+1ToUBound(X)IfX(m)>X(j)Thenm=jNextjt=X(i):X(i)=X(m):X(m)=tNextiEndSubDimA%(1To10)CallSort(A())或SortA()CallSort(A)

或SortAByVal?不能指定形参数组的维数及其下标不能指定下标第19页,讲稿共43页,2023年5月2日,星期三6.3.4可选参数与可变参数的传递

PrivateFunctionmax1%(a%,b%,c%,Optional

d)max1=aIfmax1<bThenmax1=bIfmax1<cThenmax1=cIfNot

IsMissing(d)ThenIfmax1<dThenmax1=dEndIfEndFunctionPrivateSubCommand1_Click()Print"可选参数的应用"Print"max1(7,5,8)=";max1(7,5,8)Print"max1(7,2,3,9)=";max1(7,2,3,9)EndSub变体类型的可选参数d只能有三个或四个实参1.可选参数测试函数第20页,讲稿共43页,2023年5月2日,星期三2.可变参数PrivateFunctionmax2(ParamArray

d(

))

max2=d(LBound(d))ForEachxIndIfmax2<xThenmax2=xNextxEndFunctionPrivateSubCommand2_Click()Print"可变参数的应用"Print"max2(1,3,8,7,2,3,9,7,5,8)=";_max2(1,3,8,7,2,3,9,7,5,8)Print"max2(1,3,9,7,2,3,9,7,7,7,58)=";_max2(1,3,9,7,2,3,9,7,7,7,58)EndSub变体类型的数组d可以有任意多个实参续行标志“_”第21页,讲稿共43页,2023年5月2日,星期三6.3.5对象参数的传递

PrivateSubReObject(cAsObject)

If

TypeOfcIs

FormThenc.Cls:c.Caption="窗体参数的传递"c.Print"窗体参数的类型"

ElseIf

TypeOfcIs

LabelThenc.Caption="Label控件参数的传递"

ElseIf

TypeOfcIs

TextBoxThenc.Text="文本框控件参数的传递"ElseIf……

EndIfEndSubPrivateSubForm_Click()CallReObject(Form1)CallReObject(Label1)……EndSub可以是Control、Form、Label、TextBox等类型名测试对象的类型第22页,讲稿共43页,2023年5月2日,星期三6.4工程与工程资源管理6.4.1VB应用程序的结构

应用程序

(工程)窗体模块标准模块类模块控件对象通用声明部分通用过程部分事件过程部分窗体设计器代码窗口通用声明部分通用过程部分两个特殊的过程:每个窗体都可以有一个Form_Load过程;

整个工程只能在某个标准模块中有一个Main过程。第23页,讲稿共43页,2023年5月2日,星期三6.4.2

工程资源管理1.工程资源管理器窗口

先选定某个模块查看代码

查看对象

右键菜单

第24页,讲稿共43页,2023年5月2日,星期三2.为工程添加模块3.从工程中移除指定的模块

选定模块的右键菜单右击“工程1”

第25页,讲稿共43页,2023年5月2日,星期三4.为工程指定启动对象

第26页,讲稿共43页,2023年5月2日,星期三5.工程的编译

第27页,讲稿共43页,2023年5月2日,星期三Private…..EndSub

过程的作用域就是该过程在工程中能够被调用的范围。分模块级和工程级两种。PublicSubSub1(x%,y%,z%)6.4.3过程的作用域窗体/模块级过程

工程级过程

调用其它模块中的工程级过程

CallForm2.Sub1(a,b,c)Form2.Sub1a,b,cCallModule1.Sub2(a,b,c)CallSub2(a,b,c)Sub2a,b,c无同名过程

第28页,讲稿共43页,2023年5月2日,星期三

在VB中,可以在某个过程中定义变量,也可以在模块的通用段定义变量。根据定义变量的位置和定义变量的语句不同,变量可以分为:6.4.4变量的作用域局部变量(过程级变量,只能在本过程中使用)窗体/模块级变量(私有的模块级变量,能被本模块的所有过程和函数使用)全局变量(公有的模块级变量工程级变量)。第29页,讲稿共43页,2023年5月2日,星期三过程级变量——局部变量

局部变量:在过程内声明的变量,只能在本过程中使用。1、过程级变量PrivateSubForm_Load()Dimn%n=10EndSubPrivateSubFrom_Click()Dimn%n=n+10Print"n=";nEndSub结果:n=10第30页,讲稿共43页,2023年5月2日,星期三Dimn%PrivateSubForm_Load()

n=10EndSubPrivateSubFrom_Click()

n=n+10Print"n=";nEndSub2、窗体/模块级变量Privaten%结果:n=20

在窗体模块或标准模块的通用段用关键字Dim

或Private定义的变量都称为模块级变量或称私有的模块级变量。

模块级变量的作用域是它所在的整个模块。第31页,讲稿共43页,2023年5月2日,星期三3、全局变量在模块的通用段用Public定义的变量

第32页,讲稿共43页,2023年5月2日,星期三PublicTempAsInteger

'定义全局变量PrivateSubForm_Load()

Temp=1'将全局变量Temp的值设置成

1EndSubPrivateSubCommand1_Click()

DimTempAsInteger

'定义局部变量

Temp=2'将局部变量Temp的值设置成

2Print"temp=";Temp;Form1.TempEndSubPrivateSubCommand2_Click()Print"temp=";Temp

EndSub多变量同名示例第33页,讲稿共43页,2023年5月2日,星期三6.4.5变量的存储方式与生存期

Windows操作系统对存储器采用的是动态存储管理方式第34页,讲稿共43页,2023年5月2日,星期三1.动态变量及其生存期

动态变量就是采用动态存储方式的变量,在应用程序中用关键字Dim或Private定义的变量都是动态变量。变量的生存期是指从变量获取存储空间开始,到该变量所占据的存储空间被Windows操作系统回收时结束的一段时间。模块级动态变量是在模块被装入内存运行时创建的,在退出该模块时释放其所占据的存储空间。过程级动态变量是在该过程被调用时创建,在该过程运行结束时释放其所占据的存储空间。第35页,讲稿共43页,2023年5月2日,星期三2.静态变量及其生存期

静态变量就是采用静态存储方式的变量,在应用程序中用关键字Static或Public定义的变量都是静态变量。所有的全局变量都是静态变量。静态变量的生存期就是整个程序(工程)的生存期,也就是说静态变量在整个程序运行期间都是存在的。第36页,讲稿共43页,2023年5月2日,星期三

例6.12

阅读以下程序,当用户连续3次在窗体中单击鼠标时,程序运行结果如何?3.静态局部变量

PrivateSubForm_Click()Dima%

Static

b%a=a+1

b=b+1Print"a=";a;"b=";bEndSub

第一次运行:

a=1b=1

第一次运行:

a=1b=2

第一次运行:

a=1b=3第37页,讲稿共43页,2023年5月2日,星期三6.5用户自定义数据类型6.5.1记录类型

1.用Type语句创建用户自定义数据类型[Public|Private]Type<用户自定义类型名><元素名1>As<类型名><元素名2>As<类型名>……EndTypePrivateType

StudentXhaslongNameasstring*10EnglishasintegerMathasintegerComputerasintegerEndType

第38页,讲稿共43页,2023年5月2日,星期三2.用自定义的数据类型定义变量

3.自定义类型变量的引用

例如:DimStuAsStudent,Sa(1to10)AsStudentStu.Xh=20110808Stu.Name="孙吴空"Stu.English=90Stu.Math=95Stu.Computer=98Print

Stu.Xh;Stu.Name;Stu.English;PrintStu.Math;Stu.ComputerWith

Stu

.Xh=20110808:

.Name="孙吴空"

.English=90:

.Math=95

.Comput

温馨提示

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

评论

0/150

提交评论