您现在的位置:首页 >> 课程案例 >> 内容

过程与函数的综合应用

时间:2009-6-19 9:16:28 点击:1704

一、函数的递归调用

VB6.0中可以使用递归调用。递归就是一个过程调用过程本身。分为两种类型:直接递归(在过程中调用本身)和间接递归(调用别的过程中又调用本身)

6.10  求阶乘F(n)=n!的函数。

Private Sub Command1_Click()

Dim m As Double

  Cls

  m=InputBox(“输入一个数”)

  Print m &!=;F(m)

End Sub

Private Function F(n As Double) As Double

If n>1 Then

    F=n*F(n-1)

Else

    F=1

  End If

End Function

此时,对满足条件的n值(假设n=4),连续调用F函数自身n-1次,直到n=1为止。

递归过程分为“递推”和“回推”两个阶段。在“递推”阶段,每次调用过程自身,并将当前参数压栈,直到达到递归结束条件,即把求4的阶乘转化为求3(4-1=3)的阶乘的过程,由于3的阶乘仍然未知,进一步“递推”到求2的阶乘,直到求1的阶乘的过程,而1的阶乘已知为1,“递推”过程结束。然后开始进入“回归”过程,此时不断从栈中弹出当前的参数,直到栈空,即从1的阶乘得到2的阶乘,再得到3的阶乘,最后得到4的阶乘,如图6-13所示。

6-13 递归算法的执行过程

由以上递推和回归过程可知,构成递归结构的必须具备以下两个条件:

① 具备递归结束条件和结束时的值;

② 能用递归形式表示,并且递归向终止条件发展,如本例中F(1)=1终止条件

二、加密和解密

在当今信息社会,信息的安全性得到了广泛的重视,信息加密是一项安全性的措施之一。信息加密有各种方法,最简单的加密方法是:将每个字母加一序数,序数称为密钥。例如,序数2,这时“A”→“C”,“a”→“c,B”→“D”…“Y”→“A”,“Z”→“B”;解密是加密的逆操作。

6.11  编一加密和解密的程序,即将输入的一行字符串中的所有字母加密,加密后还可再进行解密。

代码如下:

Function Code(ByVal s$,ByVal Key%)

Dim c As String * 1,iAsc%

Code =””

For i=1 To Len(s)

C=Mid $ (s,i,1)               ‘取第 i个字符

Select Case c

Case ATo Z          ‘大写字母加序数Key加密

iAsc =Asc(c)+Key

If iAsc > Asc(Z)Then iAsc =iAsc -26    ‘加密后字母超过Z

Code = Code + Chr(iAsc)

Case aTo z

iAsc = Asc(c) + Key           ‘小写字母加序数Key加密

If iAsc > Asc(z) Then iAsc =iAsc 26

Code = Code + Chr(iAsc)

Case Else                ‘其他字符时不加密,与已加密子字符串连接

Code = Code + c

End Select

Next i

End Function

Private Sub Command1_Click( )       ‘加密事件

Text2 = Code(Text1,2)             ‘调用

End Sub

程序运行如图6-14所示。

6-14  6.11运行结果

三、查找

查找在日常生活中经常遇到,利用计算机快速运算的特点,可方便地实现查找。查找是在线性表(在此为数组)中,根据指定的关键值,找出与其值相同的元素。一般有顺序查找和二分法查找,这里仅介绍顺序查找。

612  顺序查找根据查找的关键值与数组中的元素逐一比较,若相同,则查找成功;若找不到,则查找失败。查找子过程及其调用过程如下:

Sub Search(a(),ByVal Key%,ByRef index%)

Dim  i%

For i = LBound(a) To UBound(a)

If key = a(i) Then  ‘找到,元素下标保存在index形参中,结束查找

Index = i

Exit Sub

End If

Next i

Index = -1                  ‘找不到,index形参的值为-1

End Sub

Sub Form_Click()

Dim b(),k%,n%

b = Array(1,3,5,7,9,2,4)

k = Val(InputBox(“输入要查找的关键值”))

Call Search(b(),k,n)

If n>=0 Then Msgbox(“找到的位置为”& n) Else Msgbox(“找不到”)

End Sub

四、字符处理应用

6.13  编写一个英文打字训练的程序,要求如下:

① 在文本框内随机产生30个字母的范文。

② 当焦点进入输入文本框时开始计时,并显示当时的时间。

③ 在文本框按产生的范文输入相应的字母。

④ 当超出30个字母时计时结束,禁止向文本框再输入内容,显示打字的速度和正确率。

代码如下:

Dim  t  As  Date

Private Sub Command1_Click()            产生30个字母的范文

Randomize

Text1=” ”

For i=1 To 30

a =Chr(Int(Rnd*26)+65)            ‘随机产生大写字母

Text1=Text1+a                     ‘产生的字母连入范文框

Next i

End Sub

Private Sub Text2_Gotfocus()

t=Time                     ‘键入文本框获得焦点,开始计时

End Sub

Private Sub Text2_KeyPress(KeyAscii  As Integer)

If  Len(Text2)=30 Then               ‘键入满30个字符

t2=DateDiff(s,t,Time)          ‘计算速度

Text3=t2&”秒”                    ‘显示速度

Text2.Lock=True                    ‘不允许再修改

y=0:n=0

For  i=1 To 30                     ‘比较正确率

If Mid (Text1,i,1)=Mid(Text2,i,1) Then

y=y+1

Else

n=n+1

End If

Next i

y=y/(y+n)*100

Text4=y&%                      ‘显示正确率

End If

End Sub

程序运行结果如图6-15所示。

6-15 6.13运行结果

作者:Admin  
  • VB程序设计学习网站(赣南师范学院) © 2008 版权所有 All Rights Reserved.
  • 地址:江西省赣州市经济技术开发区 赣南师范学院数学与计算机科学学院 邮政编码:341000
    Email:ZQ188@163.com 技术支持QQ:87319633 移ICP备10086号
  • GnsySjxy! V2.4