设为首页收藏本站

嘻皮客娱乐学习网

 找回密码
 中文注册
搜索
打印 上一主题 下一主题
开启左侧

[OFFICE] 第四章 数组与过程

[复制链接]
跳转到指定楼层
楼主
发表于 2016-7-11 09:49:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  学习目标:
掌握数组和过程的概念
掌握数组的定义和应用
掌握Sub过程和Function过程的应用
掌握过程的参数传递与过程的作用域
了解Shell函数.1 数组型变量的声明
一般而言,数组由一群依序排列且数据类型相同的数组元素组成。每一个数组元素相当于一个变量,即每个数组元素可用来存取数据。
  但当数组元素的数据类型为Variant型时,各个数组元素则能够包含不同种类数据。
  数组分两类: 固定大小的数组 一维
多维
大小可改变的动态数组)声明固定大小数组
Dim\Private\Public\Static 数组名([下界to]上界)[As type])多维数组的声明
VB允许两维以上的多维数组
例如:Static Mat(9,9) As Integer ‘声明过程内一个10×10的二维数组
Static Mat(1 to,1 to) As Integer
Dim Mat(3,1 to,1 to)3)用循环操作数组
可以用FOR循环嵌套有效的处理多维数组。
  例1: P.23.
例2: 《成人》P.33.
给Mat数组中的每个元素赋值
Dim I as integer , J as integer
Static Mat (1 to,1 to) as Double
For I=1 to
For J=1 to
Mat(I , J)=I*10+J
Next J
Next I)返回数组元素的索引值(上、下界值)
UBound( ) :用于返回数组某一维的上界
LBound( ) :用于返回数组某一维的下界
例如:先声明一个数组:
Dim array1(2 to , -3 to , to) As Integer
则:
LBound(array1 ,) = -3
UBound(array1 ,) =)动态数组:可有效使用内存
① 创建动态数组
动态数组的作用域定义方法与固定数组相同,只是给数组附以一个空维数表,就将数组声明为动态数组了。如:
Dim Dyn( )
② 用ReDim语句分配实际元素的个数(分配内存)
ReDim Dyn(X+1)
[注意]:
(1) ReDim语句只能出现在过程中,对于每一维数,每个ReDim语句都能改变元素的数目及上下界,但数组的维数不能改变。
  (2) 还可用变量来设置动态数组的边界。
  (3) 每用一次ReDim语句,数组元素都会重新分配,即数组中原元素值会被清除。(数组型数据清为0,字符串型会清除为空)。若想保留数组中的数据,要使用关键字Preserve ,此时只允许改变多维数组中最后一维的上界。所以可这样编程:
ReDim Preserve Matrix (10, UBound (Matrix,) +)
而不可这样编程:
ReDim Preserve Matrix (UBound (Matrix,) +,))释放内存
释放动态数组内存的语法为:
Erase 数组名
Erase语句用于释放动态数组的内存。
  [注意]:Erase语句也可用于固定数组,此时,只是清除数组元素值,不释放数组占用的内存空间。.2 控件数组、什么是控件数组。
  控件数组是程序员为了能方便地控制某一类控件而使用的一种特殊数组。数组元素的name属性值相同,因为同一类控件,数组元素通过其Index属性来区分。
  第一个产生的控件,其Index值为0,以后依次为1,2,……
当然,数组元素的Index值可以任意改变(设置),甚至是不连续的。、如何生成控件数组。
  如:在一个窗体中放入两个文本框,将这两个文本框的name属性均设置为nametext。则会弹出一个询问框,问答“是”,则立刻生成一个控件数组。、生成控件数组的好处。(见P.26.)
控件数组中的每个元素共有相同的事件过程。
  例如:无论单击nametext(0)或nametext(1),程序开始执行关于nametext的共有的click事件过程。若单击的是nametext(0),则VB将0传递给参数Index;若单击的是nametext(1),则VB将1传递给参数Index。
  举例:P.26. 图2-4,图2-5,图2-6。、程序执行时增删控件数组元素。
  语句格式:
Load 控件数组名(索引号) ‘添加一个控件数组元素
Unload 控件数组名(索引号) ‘删除一个控件数组元素
[注意]:(1)添加的新控件的Visible属性要设置为True。
  (2)添加的新控件的位置要移动坐标,满足这两点才能看见新控件。
  例1:Private sub Form_Load( )
Load nametext(2)
Nametext(2).text=”text3”
Nametext(2).visible=true
End sub
例2:Private sub Form_load( )
Load nametext(2)
Nametext(2).top=0
Nametext(2).left=1000
Nametext(2).text=”text3”
Nametext(2).visible=true
End sub.3 函数与过程、为当前窗体添加用户自定义的函数或过程的方法:
方法1:①进入代码窗口
②在object:选General
在Proc:选Declaration
③键入sub(或Function) 过程名(或函数名),回车
④输入过程体代码(或函数体代码)
方法2:①双击窗体或按F1键→打开代码窗口
②→“工具”/“添加过程”菜单命令
弹出图2-7对话框
③在对话框中填入函数或过程名,作用域,公有或私有
是否为静态变量,按“确定”
④输入过程体代码(或函数体代码)、过程
为了简化程序设计的复杂程度,往往将一个大的程序分割成较小的功能部件,称这些部件为过程。VB使用如下几种过程:
(1)sub过程,不返回值
(2)function过程,返回值、sub过程(子过程)
☆ 子过程就是一段子程序,分为通用过程和事件过程:
(1) 通用过程:把几个不同的事件过程都可能要执行的同样动作编成一个公共的代码段,生成一个分离开的过程,并由事件过程来调用它。
  (2) 事件过程:当VB中的对象收到一个发生的事件时,便自动调用该事件对应的过程名。
  控件的事件过程名是由控件名、下划线(_)和事件名组合起来的。
  如:名为Command1的按钮的click事件过程名为:
Command1_click
★ 另如:如果希望在单击窗体之后,窗体会调用事件过程,则要使用Form_click过程(注意此时不能用窗体的name属性名字)。
  ☆ sub过程的语法为:
[Private/Public]
  [static]
  sub 过程名(参数1,参数2,… 参数n)
过程体
End sub
★ [注意]:可以将子过程放入标准模块、类模块和窗体模块中。按照缺省规定,所有模块中的子过程为Public ,在应用程序中可随处调用它们。
  ☆ sub过程的调用: 例子参见书P.63.
格式1:call 过程名(参数1,参数2,… 参数n)
格式2:过程名 参数1,参数2,… 参数n
[注意]:sub过程与下面介绍的Function过程不同,它不会返回一个值,但是sub过程可以修改传递给它的任何变量的值。
  ☆ sub过程的创建:
见2.7节的1部分。、Function过程(函数过程)
VB包含有150多个内置的标准函数,如sqr , chr等。此外,用户还可自己编写Function过程,其语法为:
[Private/Public]
  [static]
  Function 函数名(参数1,… 参数n) AS 类型名
函数体
函数名=表达式
End Function
☆ Function函数的创建见2.7节的1部分。
  ☆ 函数一旦定义好,即可调用。
  ☆ 函数过程与sub过程的区别在于:
函数过程会返回值,且通过函数名返回。
  故在函数体中一定有一条给函数名赋值的语句。
  举例:定义一个计算圆的面积的函数。
  Function Square (Radius as double) as double
Square=3.14159*Radius*Radius
End Function
调用该函数的例子:
Square1=Square(5.4)、指针传递和值传递
把在调用过程时传递到过程内的变量称为参数。过程调用中的参数传递分为两类:指针传递和值传递。
  (1)值传递
按值传递参数时,传递的只是变量的。如果过程改变了变量的值,则所作变动只影响,而不会影响变量本身。用Byval关键字指出参数按值传递。
  如:sub F1(Byval A as integer , B as integer)
[注]
  A参数为按值传递,B参数为地址传递(指针传递)。
  (2)指针传递(也称按地址传递)
缺省时都是指针地址传递参数。
  按地址传递参数时,在将变量传递给过程时,通过过程也可改变变量的值(正本)。.8 良好的编程习惯(P.40.~43)、 添加注释。、 变量和常量命名的约定(前缀、后缀)。、 使用缩进格式(P.43.).4 VB的参数传送
在调用一个过程时,必须把实际参数传递给过程,完成形式参数(形参)与实际参数(实参)的结合,然后用实际参数执行调用的过程。
  一、形参与实参的结合方式
形参——在Sub、Function过程的定义中出现的变量名。
  实参——调用Sub、Function过程时传送给Sub或Function过程的常数、变量、表达式或数组。、按位置结合方式
这是大多数子程序调用时使用的方式,这种方式的特点:
① 实参的次序必须和形参的次序相匹配
② 实参与相应形参的数据类型必须相同
例如:定义了下列过程:
Sub Testsub(p1 as integer , p2 as single , p3 as string)
……
End Sub
则可用下面的语句调用该过程:
Call Testsub(A% , B! , “Test”)
实参中的各项用逗号隔开,实参可以是常数、表达式、变量和后面跟有左、右括号的数组名。、指名结合方式
该方式是显工地指出与形参结合的实参,把形参用“:=”与实参连接起来。其特点是:该方式不受位置次序的限制。
  例:假如建立了如下过程:
Sub add_num(Firstvar as integer, secondvar as integer, thirdvar as integer)
C=(firstvar +secondvar)*thirdvar
Print c
End sub
则:若按指名结合方式,调用语句为:
add_num firstvar := , secondvar := , thirdvar :=
或add_num thirdvar := , secondvar := , firstvar :=
但,若按位置结合方式,调用语句为:
add_num,6,8
二、参数的传送方式
在VB中,参数通过两种方式传送:地址传递和值传递。、地址传递(指针传递)或叫“引用”
先看一个地址传递参数的例子:
Sub tryout(X as integer , Y as integer)
X=X+100
Y=Y*6
Print “X=” ; X , “Y=” ; Y
End sub
Sub Form_click( )
Dim a as integer , b as integer
a=10;b=20
tryout a,b
print “a=”; a, “b=”; b
End Sub
单击窗体后,输出结果如下:
X=110 Y=120
a= b=120
可见,地址传递的特点:
当通过地址传递来调用一个过程时,向该过程传递变量,实际上是把变量的地址传递给该过程。因此,变量的地址和被调用过程中相应参数的地址是相同的,这样,如果通用过程中的操作修改了参数的值,它同时也修改了传送给过程的变量的值。
  如果不希望在调用过程时改变变量的值,应使用“值传递”方式。
  “地址传递”的优点:
比“值传递”更能节省内存和提高效率,特别是对于字符串参数来说,地址传递具有高次多的效率。、值传递
值传递就是通过传递实参的值给形参,而不是传送它的地址。其过程是:系统把需要传送的变量复制到一个临时单元中,然后把该临时单元的地址传送给被调用的通用过程。由于通用过程没有访问变量(实参)的原始地址,因而不会改变原来变量的值,所有的变化都在变量的上进行。
  在VB中,值传递方式通过关键字Byval实现。再看前面的例子,如果用值传递方式来传递参数,则运行结果不同:
Sub tryout (Byval X as integer , Byval Y as integer)
X=X+100
Y=Y*6
Print “X=” ; X , “Y=”; Y
End Sub
此时,事件过程Form_click( )不用做任何修改,则运行结果为:
X=110 Y=120
a=10 b=20、地址传递与值传递的比较:
传地址比传值效率高,在地址传递方式中,形参不是一个真正的局部变量,有可能付程序的执行产生不必要的干扰;在值传递方式中,形参是一个真正的局部变量,不会对程序产生干扰。
  但在有些情况下,只有用传值方式才能得到正确的结果。
  如下例:
Function power(x as single , Byval y as integer)
Dim result as single
Result=1
Do while y0
Result=result*x
y=y-1
Loop
Power=result
End Function
Sub Form_click( )
For i=1 to
r=power(5,i )
Print r
Next i
End Sub
输出结果:*5*5*5*5*5*5*5*5*5*5
如果在通用函数过程里,去掉y参数前面的Byval,则无法得到预期的结果。因为每次调用power后,i都会被重新设置为0(参数y同i的地址),所以For循环不停止,产生溢出。、几条规则(不是硬性规定)
(1)对整型、长整型或单精度参数,如果不希望过程修改实参的值,则应使用值传递。
  (2)为提高效率,字符串和数组应使用地址传递。
  (3)用户自定义类型和控件只能使用地址传递。
  (4)其它数据类型:双精度、货币型和变体型,可以用2种方式传递,但最好用值传递。
  (5)如果没有把握,最好先用值传递方式来传送所有变量,(字符串、数组和记录类型变量除外),待编写完程序后,再把部分参数改为地址传递方式,以加快运行速度。
  
回复

使用道具 举报

小黑屋|手机版|嘻皮客网 ( 京ICP备10218169号|京公网安备11010802013797  

GMT+8, 2024-4-29 09:19 , Processed in 0.180632 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表