《c语言程序设计课件第6章.ppt》由会员分享,可在线阅读,更多相关《c语言程序设计课件第6章.ppt(50页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第6章 数组本章要点:6.1 子过程(Sub)的定义与调用6.1.1 子过程的定义子过程的定义Private|定义子过程的一般格式如下:定义子过程的一般格式如下:Public|FriendStatic Sub 过程名(过程名(参数列表参数列表)语句块语句块 Exit sub 语句块语句块 End Sub说明:说明:(1)子过程以)子过程以Sub开头,以开头,以End Sub结束,而在结束,而在Sub和和End Sub之间的语句块,称为之间的语句块,称为“过程体过程体”或或“子过程体子过程体”,它决定着子过程的功能;,它决定着子过程的功能;(2)Private表示只有在包含其声明的模块中的其表示
2、只有在包含其声明的模块中的其他过程可以访问该他过程可以访问该Sub过程;过程;(3)Public表示表示Sub过程是公有过程,可以在程过程是公有过程,可以在程序的任何地方调用。缺省序的任何地方调用。缺省 Private|Public 时,时,系统默认为系统默认为 Public;(4)Friend只能在类模块中使用;只能在类模块中使用;6.1 子过程的定义与调用(5)Static表示在调用期间保留表示在调用期间保留Sub过程的局部变过程的局部变量的值。量的值。Static属性对在属性对在Sub外声明的变量不会外声明的变量不会产生影响,即使过程中也使用了这些变量。产生影响,即使过程中也使用了这些变
3、量。(6)过程名的命名规则与变量命名规则相同,在)过程名的命名规则与变量命名规则相同,在同一个模块中,同一符号名不得既用作同一个模块中,同一符号名不得既用作Sub过程过程名,又用作名,又用作Function过程名。过程名。(7)参数列表中的参数称为形式参数(简称形参)参数列表中的参数称为形式参数(简称形参),它可以是变量名或数组名,也可以是简单变量,它可以是变量名或数组名,也可以是简单变量,但不能是常量、数组元素、表达式;若有多个参但不能是常量、数组元素、表达式;若有多个参数时,各参数之间用逗号分隔,形参没有具体的数时,各参数之间用逗号分隔,形参没有具体的值。值。6.1 子过程的定义与调用形式
4、参数格式为:形式参数格式为:ByVal 变量名变量名()()As 数据类型数据类型(8)Exit Sub语句可以提前结束过程调用,使语句可以提前结束过程调用,使执行立即从一个执行立即从一个Sub过程中退出。过程中退出。(9)Sub 过程不能嵌套定义,但可以嵌套调过程不能嵌套定义,但可以嵌套调用。用。6.1 子过程的定义与调用6.1.2 建立建立Sub过程过程建立一个子过程有如下两种方法。建立一个子过程有如下两种方法。1.利用菜单利用菜单“工具工具”|“添加过程添加过程”命令定义命令定义具体方法如下:具体方法如下:(1)进入代码窗口,在左侧显示对象名的下拉框)进入代码窗口,在左侧显示对象名的下拉
5、框中选择中选择“通用通用”,在右侧显示过程的下拉框中选,在右侧显示过程的下拉框中选择择“声明声明”,然后键入,然后键入Sub及子程序名。及子程序名。(2)按)按Enter键后,键后,Visual Basic系统会自动加上系统会自动加上End Sub与子程序名后的一对括号,此时便可输与子程序名后的一对括号,此时便可输入子程序语句。入子程序语句。6.1 子过程的定义与调用2.利用代码窗口直接定义利用代码窗口直接定义6.1 子过程的定义与调用【例例6-2】打印一个平行四边形。打印一个平行四边形。Private Sub triangle(Str As String,n As Integer)Dim i
6、%,j%For i=1 To n print spc(6-i);For j=1 To n Print Spc(1);Str;Next j PrintNext iEnd Sub 6.1 子过程的定义与调用6.1.3 调用调用Sub过程过程 1.用用Call语句调用语句调用Sub过程过程语法:语法:Call 过程名(实际参数表)过程名(实际参数表)说明:说明:(1)实际参数的个数、类型和顺序,应该与被调)实际参数的个数、类型和顺序,应该与被调用过程的形式参数相匹配,有多个参数时,用逗用过程的形式参数相匹配,有多个参数时,用逗号分隔。号分隔。(2)如果子程序不带参数,)如果子程序不带参数,Call语
7、句中子程序名语句中子程序名后的一对括号可以省去,例如:后的一对括号可以省去,例如:Call Add1 这是允许的。这是允许的。6.1 子过程的定义与调用【例例6-3】编写一个名为编写一个名为MyDay过程输入,用户输过程输入,用户输入一个入一个06的数字,在窗体上显示对应的星期。程的数字,在窗体上显示对应的星期。程序运行效果如图序运行效果如图6-1-3所示。所示。6.1 子过程的定义与调用查看代码查看代码【例例6-4】利用过程编写求任意三角形面积的利用过程编写求任意三角形面积的程序。程序。(1)界面设计)界面设计6.1 子过程的定义与调用Private Sub area(X!,Y!,z!,s!
8、)Dim p!p=(X+Y+z)/2 s=Sqr(p*(p-X)*(p-Y)*(p-z)End Sub6.1 子过程的定义与调用Private Sub cmdJs_Click()Dim a!,b!,c!,w!a=Val(txtA.Text)b=Val(txtB.Text)c=Val(txtC.Text)If a b+c Or b a+c Or c a+b Then MsgBox 输入的三条边不能构成一个三角形!Else Call area(a,b,c,w)txtMj.Text=Str(w)End IfEnd Sub2.把过程名作为一个语句来用把过程名作为一个语句来用语法:语法:过程名过程名 实
9、参实参1,实参,实参2它与它与Call语句的不同点是:去掉了语句的不同点是:去掉了Call关键字和实关键字和实参列表的括号。参列表的括号。如上例中可以改成:如上例中可以改成:area a,b,c,w6.1 子过程的定义与调用6.2.1 函数过程的定义函数过程的定义定义函数过程的语法格式如下:定义函数过程的语法格式如下:Public|PrivateStaticFunction 函数名函数名()As函数名函数名=返回值返回值Exit Function函数名函数名=返回值返回值End Function6.2 函数过程的定义与调用说明:说明:(1)函数过程以)函数过程以Function开头,以开头,以
10、End Function结结束,两者之间是描述函数操作的语句块为束,两者之间是描述函数操作的语句块为“函数体函数体”。(2)函数名命名规则与变量名规则相同。但不能与)函数名命名规则与变量名规则相同。但不能与系统的内部函数或其他通用子过程同名,也不能与系统的内部函数或其他通用子过程同名,也不能与已定义的全局变量和本模块中模块级变量同名。已定义的全局变量和本模块中模块级变量同名。(3)在函数体内,函数名可以当变量使用,函数的)在函数体内,函数名可以当变量使用,函数的返回值就是通过对函数名的赋值语句来实现的。返回值就是通过对函数名的赋值语句来实现的。6.2 函数过程的定义与调用(4)如果函数体内没有
11、给函数名赋值,则返回对应类)如果函数体内没有给函数名赋值,则返回对应类型的缺省值,数值函数返回型的缺省值,数值函数返回0,字符串函数返回空字符,字符串函数返回空字符串,变体型函数返回串,变体型函数返回Empty。(5)As类型:是指函数返回值的类型,若省略,则函类型:是指函数返回值的类型,若省略,则函数返回变体类型值(数返回变体类型值(Variant)。)。(6)Exit Function:表示退出函数过程,常常是与选:表示退出函数过程,常常是与选择结构(择结构(If或或Select Case语句)联用,即当满足一定条语句)联用,即当满足一定条件时,退出函数过程。件时,退出函数过程。(7)形参
12、数列表:形参的定义与子过程完全相同。)形参数列表:形参的定义与子过程完全相同。(8)函数过程内部不得再定义)函数过程内部不得再定义Sub过程或过程或Function过过程。程。6.2 函数过程的定义与调用6.2.2 建立函数过程建立函数过程1.用代码窗口直接定义用代码窗口直接定义其步骤如下:其步骤如下:(1)打开代码窗口,在)打开代码窗口,在“对象对象”列表框中选择列表框中选择“通用通用”选项。选项。(2)在)在“过程过程”列表框中选择列表框中选择“声明声明”选项。选项。(3)输入)输入Function和函数名。和函数名。(4)按)按Enter键后,键后,Visual Basic系统会自动加上
13、系统会自动加上End Function与函数名后的一对括号,此时便可与函数名后的一对括号,此时便可输入函数语句。输入函数语句。6.2 函数过程的定义与调用2.利用菜单利用菜单“工具工具”|“添加过程添加过程”命令定命令定义义其步骤如下:其步骤如下:(1)打开代码窗口,选择菜单)打开代码窗口,选择菜单“工具工具”|“添加过添加过程程”栏命令。打开栏命令。打开“添加过程添加过程”对话框。对话框。(2)在)在“名称名称”文本框中输入函数名;在文本框中输入函数名;在“类型类型”栏栏中选取中选取“函数函数”定义函数过程;在定义函数过程;在“范围范围”栏中若选栏中若选取取“公有的公有的”则定义一个公共级全
14、局函数;若选取则定义一个公共级全局函数;若选取“私有的私有的”,则定义一个标准模块板,则定义一个标准模块板/窗体板的局部函窗体板的局部函数。数。(3)单击)单击“确定确定”按钮后,系统自动建立一个函数模按钮后,系统自动建立一个函数模板,之后就可以在其中编写函数代码。板,之后就可以在其中编写函数代码。6.2 函数过程的定义与调用6.2.3 调用函数过程调用函数过程 函数过程返回一个值,这是与子过程的主要函数过程返回一个值,这是与子过程的主要区别,其调用方式与标准函数调用一样,作为表区别,其调用方式与标准函数调用一样,作为表达式中的一个部分被引用。达式中的一个部分被引用。语法:函数名(语法:函数名
15、(实参列表实参列表)注意:必须给参数加上括号,即使没有参数注意:必须给参数加上括号,即使没有参数也不可省略括号;实际参数和形式参数对应关系也不可省略括号;实际参数和形式参数对应关系的要求与子过程相同。的要求与子过程相同。6.2 函数过程的定义与调用【例【例6-5】编写一个程序,对输入的成绩进行编写一个程序,对输入的成绩进行评定,要求程序的评定在函数中完成,评定评定,要求程序的评定在函数中完成,评定结果(字符串)为函数的返回值。结果(字符串)为函数的返回值。6.2 函数过程的定义与调用Private Function Appraise(ByVal score%)As String Select
16、Case score Case 0 To 59 Appraise=重修重修 Case 60 To 100 Appraise=通过通过 Case Else Appraise=数据超出范围!数据超出范围!End Select End Function Private Sub Command1_Click()Text2=Appraise(Val(Text1)End Sub 6.2 函数过程的定义与调用【例例6-6】编写计算阶乘的函数过程,当用编写计算阶乘的函数过程,当用户单击窗体时,利用下列近似公式计算户单击窗体时,利用下列近似公式计算(直(直到最后一项小于到最后一项小于10-7为止)。为止)。6.
17、2 函数过程的定义与调用Private Sub Form_Click()Dim n!s=1:n=1:t=1 Do t=1/Fact(n)s=s+t n=n+1 Loop While t=10 -7 Print sEnd Sub调用函数Fact的程序代码如下:Private Function Fact(x!)Dim p!p=1 For n=1 To x p=p*n Next Fact=pEnd Function6.3.1 模块概述模块概述 Visual Basic应用程序通常由应用程序通常由3种模块组成,种模块组成,即窗体模块(即窗体模块(Form)、标准模块()、标准模块(Module)和)和
18、类模块(类模块(Class)。)。6.3 变量、过程的作用域应用程序窗体模块标准模块类模块声明部分通用过程事件过程全局声明部分模块层声明部分通用过程模块层声明部分通用过程(1)窗体模块)窗体模块 窗体模块是大多数窗体模块是大多数 Visual Basic 应用程序的应用程序的基础。窗体模块可以包含处理事件的过程、通用基础。窗体模块可以包含处理事件的过程、通用过程以及变量、常数、类型和外部过程的窗体级过程以及变量、常数、类型和外部过程的窗体级声明。如果要在文本编辑器中观察窗体模块,则声明。如果要在文本编辑器中观察窗体模块,则还会看到窗体及其控件的描述,包括它们的属性还会看到窗体及其控件的描述,包
19、括它们的属性设置值。写入窗体模块的代码是该窗体所属的具设置值。写入窗体模块的代码是该窗体所属的具体应用程序专用的;它也可以引用该应用程序内体应用程序专用的;它也可以引用该应用程序内的其他窗体或对象。的其他窗体或对象。6.3 变量、过程的作用域(2)标准模块)标准模块 标准模块(文件扩展名为标准模块(文件扩展名为.BAS)是应用)是应用程序内其他模块访问的过程和声明的容器。它程序内其他模块访问的过程和声明的容器。它们可以包含变量、常数、类型、外部过程和全们可以包含变量、常数、类型、外部过程和全局过程的全局(在整个应用程序范围内有效的)局过程的全局(在整个应用程序范围内有效的)声明或模块级声明。写
20、入标准模块的代码不必声明或模块级声明。写入标准模块的代码不必绑在特定的应用程序上;如果不小心用名称引绑在特定的应用程序上;如果不小心用名称引用窗体和控件,则在许多不同的应用程序中可用窗体和控件,则在许多不同的应用程序中可以重用标准模块。以重用标准模块。6.3 变量、过程的作用域(3)类模块)类模块 在在Visual Basic中类模块(文件扩展名为中类模块(文件扩展名为.CLS)是面向对象编程的基础。可在类模块中编)是面向对象编程的基础。可在类模块中编写代码建立新对象。这些新对象可以包含自定义写代码建立新对象。这些新对象可以包含自定义的属性和方法。实际上,窗体正是这样一种类模的属性和方法。实际
21、上,窗体正是这样一种类模块,在其上可安放控件、可显示窗体窗口。块,在其上可安放控件、可显示窗体窗口。6.3 变量、过程的作用域6.3.2 变量的作用域变量的作用域1.局部变量局部变量 在过程内部(如在过程内部(如Command1_Click)使用)使用Dim或者或者Static关键字来声明的变量,只在声明关键字来声明的变量,只在声明它们的过程中才能被访问或改变该变量的值,别它们的过程中才能被访问或改变该变量的值,别的过程不可访问。所以可以在不同的过程中声明的过程不可访问。所以可以在不同的过程中声明相同名字的局部变量而互不影响。相同名字的局部变量而互不影响。6.3 变量、过程的作用域【例例6-7
22、】编写一个程序,用来演示局部变量的编写一个程序,用来演示局部变量的作用范围和生存期。程序界面由作用范围和生存期。程序界面由1个窗体、个窗体、2个文个文本框、本框、2个命令按钮组成。个命令按钮组成。6.3 变量、过程的作用域Private Sub cmdDim_Click()Dim n As Integer n=n+1 txtDim.Text=nEnd SubPrivate Sub cmdSta_Click()Static n As Integer n=n+1 txtSta.Text=nEnd Sub6.3 变量、过程的作用域2.窗体窗体/模块级变量模块级变量 在在“通用声明通用声明”段中用段中
23、用Dim语句或用语句或用Private语句声明的变量,可被本窗体语句声明的变量,可被本窗体/模块的任何过程访模块的任何过程访问。但其他模块却不能访问该变量。问。但其他模块却不能访问该变量。声明窗体声明窗体/模块级变量要先进入程序代码窗口,模块级变量要先进入程序代码窗口,单击左侧的下拉框并选择单击左侧的下拉框并选择“通用通用”,再单击右侧,再单击右侧下拉框并选择下拉框并选择“声明声明”。例如,在。例如,在“通用声明通用声明”段声明如下变量:段声明如下变量:Private s As StringDim a As Integer,b As Single6.3 变量、过程的作用域3.全局变量全局变量
24、全局变量也称工程级变量,在窗体模块或标全局变量也称工程级变量,在窗体模块或标准模块的顶部的准模块的顶部的“通用通用”声明段用声明段用Public或或Global关键字声明,它的作用范围是整个应用程关键字声明,它的作用范围是整个应用程序,即可被本应用程序的任何过程或函数访问。序,即可被本应用程序的任何过程或函数访问。例如:例如:Public a As IntegerGlobal b As single6.3 变量、过程的作用域【例例6-8】编写一个应用程序,其由编写一个应用程序,其由1个窗体模块个窗体模块和和1个标准模块组成,界面由个标准模块组成,界面由1个窗体及其中的个窗体及其中的3个文本框、
25、个文本框、3个标签和个标签和2个命令按钮组成。个命令按钮组成。6.3 变量、过程的作用域查看代码查看代码6.3.3 过程的作用域过程的作用域 在窗体或模块中用在窗体或模块中用Private定义的过程为窗体或定义的过程为窗体或模块级过程,只能在定义它的窗体或模块中调用。模块级过程,只能在定义它的窗体或模块中调用。在窗体中用在窗体中用Public定义的过程,可以在其他窗定义的过程,可以在其他窗体中调用,但必须在过程名前加上自定义过程所体中调用,但必须在过程名前加上自定义过程所在的窗体名。在的窗体名。在模块中用在模块中用Public定义的过程为全局级过程,定义的过程为全局级过程,可在任意窗体中调用。
26、可在任意窗体中调用。6.3 变量、过程的作用域6.4.1 形参与实参的概念形参与实参的概念 形式参数(简称形参)指出现在形式参数(简称形参)指出现在Sub和和Function过程的定义中出现的变量名、数组名,过程的定义中出现的变量名、数组名,过程被调用前,没有分配内存,其作用是说明自过程被调用前,没有分配内存,其作用是说明自变量的类型和形态以及在过程中的角色。形参可变量的类型和形态以及在过程中的角色。形参可以是:以是:(1)除定长字符串变量之外的合法变量名;)除定长字符串变量之外的合法变量名;(2)后面跟()括号的数组名。)后面跟()括号的数组名。6.4 参数的传递例如定义了下面一个过程:例如
27、定义了下面一个过程:Sub Swap2(x%,y%,str$)End Sub可以用下面的语句调用该过程:可以用下面的语句调用该过程:Call Swap2(a%,y%,Student)6.4 参数的传递过程定义:过程定义:Sub Swap2(x%,y%,str$)过程调用:过程调用:Call Swap2(a%,y%,Student)6.4.2 按值传递参数按值传递参数 按值传递参数(按值传递参数(Passed By Value)时,是)时,是将实参变量的值复制一个到临时存储单元中,如将实参变量的值复制一个到临时存储单元中,如果在调用过程中改变了形参的值,不会影响实参果在调用过程中改变了形参的值,
28、不会影响实参变量本身,即实参变量保持调用前的值不变变量本身,即实参变量保持调用前的值不变.6.4 参数的传递88实参x形参y在Visual Basic中,传值方式通过关键字ByVal来实现。也就是说,在定义通用过程时,如果形参前面有关键字ByVal,则该参数用传值方式传递。【例例6-9】编写一个程序,实现两个整数的相加。编写一个程序,实现两个整数的相加。Sub AddTest(ByVal m%,ByVal n%)Dim sum%sum=m+nprint a+b=;sumEnd SubPrivate Sub Command1_Click()a%=10:b%=20Call AddTest(a,b)
29、传值传值Print a=;a,b=;bEnd Sub6.4 参数的传递6.4.3 按地址传递参数按地址传递参数 缺省或加缺省或加“ByRef”关键字的为按地址传递参关键字的为按地址传递参数。按地址传递参数时,把实参变量的地址传送数。按地址传递参数时,把实参变量的地址传送给被调用过程,形参和实参共用内存的同一地址。给被调用过程,形参和实参共用内存的同一地址。在被调用过程中,形参的值一旦改变,相应实参在被调用过程中,形参的值一旦改变,相应实参的值也跟着改变。这意味着实参与形参共用同一的值也跟着改变。这意味着实参与形参共用同一个内存单元。个内存单元。6.4 参数的传递8实参x形参y【例例6-10】通
30、过下面程序观察值传递和地址通过下面程序观察值传递和地址传递方式的区别。传递方式的区别。【例例6-11】阅读程序并写出程序的运行结果。阅读程序并写出程序的运行结果。6.4 参数的传递查看代码查看代码查看代码查看代码6.4 参数的传递实参x实参y实参y形参x形参y形参z3412420 x=3*zy=2*z8z=x+y6.4.4 数组参数数组参数VB允许把数组作为形参出现在形参表中,语法为:允许把数组作为形参出现在形参表中,语法为:形参数组名形参数组名()As 数据类型数据类型 在传送数组时,除遵守参数传送的一般规则外,在传送数组时,除遵守参数传送的一般规则外,还应注意以下几点:还应注意以下几点:(
31、1)形参数组只能按地址传递参数,对应的实参也)形参数组只能按地址传递参数,对应的实参也必须是数组,且数据类型相同。必须是数组,且数据类型相同。(2)把一个数组的全部元素传送给一个过程,应将)把一个数组的全部元素传送给一个过程,应将数组名分别写入形参列表中,并略去数组的上下数组名分别写入形参列表中,并略去数组的上下界,但括号不能省略。界,但括号不能省略。6.4 参数的传递(3)在过程中不可以用)在过程中不可以用Dim语句对形参数组进行语句对形参数组进行声明,否则会产生声明,否则会产生“重复声明重复声明”的错误。但在使的错误。但在使用动态数组时,可以用用动态数组时,可以用ReDim语句改变形参数组
32、语句改变形参数组的维界,重新定义数组的大小。的维界,重新定义数组的大小。(4)被调过程可通过)被调过程可通过Lbound和和Ubound函数确定函数确定实参数组的上、下界。实参数组的上、下界。(5)实参和形参结合是按地址传递,即形参数组)实参和形参结合是按地址传递,即形参数组和实参数组共用一段内存单元。和实参数组共用一段内存单元。(6)调用时形参数组)调用时形参数组m和实参数组和实参数组n进行形实结合,进行形实结合,它们共用一段内存单元。它们共用一段内存单元。6.4 参数的传递【例【例6-12】编写一个程序,用数组作参数,编写一个程序,用数组作参数,计算方阵对角元素的和。它由一个窗体模块计算方
33、阵对角元素的和。它由一个窗体模块构成,其中包括一个自定义过程和一个命令构成,其中包括一个自定义过程和一个命令按钮的单击事件过程。按钮的单击事件过程。6.4 参数的传递查看代码查看代码6.4.5 对象参数对象参数 在在VB中除了用变量作参数外,还允许中除了用变量作参数外,还允许用窗体或控件作参数,即允许用对象作参用窗体或控件作参数,即允许用对象作参数。在某些情况下,使用对象参数可以简数。在某些情况下,使用对象参数可以简化代码,提高程序效率。用对象作为参数化代码,提高程序效率。用对象作为参数和用其他数据类型作为参数一样,唯一的和用其他数据类型作为参数一样,唯一的差别就是在形参表中,把形参变量的类型
34、差别就是在形参表中,把形参变量的类型声明为声明为Control或或Form。6.4 参数的传递Function f2(x)f2=f3(x)+3End Sub6.5.1 过程的嵌套过程的嵌套在程序中调用一子过程,而在子过程中又调用另在程序中调用一子过程,而在子过程中又调用另外的子过程,这种程序结构称为过程的嵌套。外的子过程,这种程序结构称为过程的嵌套。6.5 过程的嵌套与递归Sub f1(x)x=f2(xx)*3End SubSub CmdOk_Click()Call f1(y)End SubFunction f3(x)f3=x*xEnd Sub6.5.2 过程的递归过程的递归 用自身的结构来描
35、述自身称为递归,即一个用自身的结构来描述自身称为递归,即一个过程调用过程本身,在递归调用中,一个过程执过程调用过程本身,在递归调用中,一个过程执行的某一步要用到它自身的上一步或上几步的结行的某一步要用到它自身的上一步或上几步的结果。例如:最典型的例子是对阶乘运算可作如下果。例如:最典型的例子是对阶乘运算可作如下定义:定义:n!=n*(n-1)!(n-1)!=(n-1)*(n-2)!6.5 过程的嵌套与递归【例【例6-13】编一个计算编一个计算n!(n1)的递归调用的递归调用的函数。的函数。6.5 过程的嵌套与递归fac(5)=5*fac(4)fac(4)=4*fac(3)fac(3)=3*fac(2)fac(2)=2*fac(1)fac(1)=1fac(2)=2*1fac(3)=3*2fac(4)=4*6fac(5)=5*24查看代码查看代码【例例6-14】编写一个程序,求契比雪夫多项编写一个程序,求契比雪夫多项式。式。6.5 过程的嵌套与递归查看代码查看代码本章内容结束,谢谢观看
限制150内