VB程序设计-多种方法求阶乘
VB程序设计-多种方法求阶乘
VB程序设计-多种方法求阶乘(作者:草原飞狼 2014年5月26日)声明:仅供学习与交流使用,高手请飘过,谢谢!所有代码都是个人亲自编写并调试成功。
布局运行界面(1)运行界面(2)源代码如下:Private Sub Command1_Click()Rem 求任意数阶乘,不大于171Dim mul As DoubleDim i As IntegerDim k As Integermul = 1 '赋初值k = Val(InputBox("请输入一个正整数,不大于171!", "输入提示", "5")) Rem 以下算法是求指定数的阶乘,典型的算法For i = 1 To kmul = mul * iNext iPrint k & "的阶乘结果是:"; mulEnd SubPrivate Sub Command2_Click()Rem 清空Form1.ClsEnd SubPrivate Sub Command3_Click()Rem 退出Unload MeEnd SubPrivate Sub Command4_Click()Rem 普通过程求阶乘Dim mul As DoubleDim i As IntegerDim k As Integermul = 1 '赋初值k = Val(InputBox("请输入一个正整数,不大于171!", "输入提示", "5"))Rem 以下算法是求指定数的阶乘Call fac(k) '函数调用,注意调用方法Print k & "的阶乘结果是:"; fac(k)End SubPrivate Function fac(ByVal k As Integer) As Double 'byval表示参数按值传递Rem 普通的函数过程Dim i As IntegerDim mul As Doublemul = 1For i = 1 To kmul = mul * iNext ifac = mul '结果返回给函数,典型的用法End FunctionPrivate Sub Command5_Click()Rem 递归过程求阶乘Dim i As IntegerDim k As IntegerDim mul As Doublemul = 1 '赋初值k = Val(InputBox("请输入一个正整数,不大于171!", "输入提示", "5"))Rem 以下递归函数的调用Call fac_digui(k)Print k & "的阶乘结果是:"; fac_digui(k)End SubPrivate Function fac_digui(ByVal k As Integer) As DoubleRem 递归过程求阶Rem 以下是递归算法求阶乘,注意写法,编写递归算法时,方法类似If k = 1 Thenfac_digui = 1Elsefac_digui = fac_digui(k - 1) * kEnd IfEnd Function。
VB递归算法
调用
递归算法的基本思想是把规模较大问题 变成规模较小的、规模较小的问题又变 成规模更小的问题,当问题小到一定程 度时,可以直接得出它的解,从而得到 原来问题的解。即采用“大事化小、小 事化了”的基本思想。
调用
y = fact(3)
…… fact = 3 * fact (2)
…… fact = 2 * fact (1)
Function age(n As Integer) As Long If n = 1 Then
age = 10 Else
age = age(n - 1) + 2 End If End Function Private Sub Command1_Click()
print "第五个人的年龄为" + Str(age(5)) End Sub
Function fact(n As Integer) As Integer If n <= 1 Then fact = 1 Else fact = n * fact (n - 1) End If
End Function
递归函数调用: 求3的阶乘的值
Function fact(n As Integer) As Integer
fact = 1 ……
fact (3)=6 返回
fact (2)=2 返回
fact (1)=1 返回
递归算法的实现要点
➢ (1)有明确的结束递归的边界条件(又称终止条件)以及结束 时的边界值,可以通过条件语句(If语句)来实现
➢ (2)函数的描述中包含其本身,即能用递归形式表示,且递 归终止条件的发展。
的所有整数,解决这个问题,最适合的算法是( A )
阶乘的快速计算方法
阶乘的快速计算方法阶乘是数学中一个非常重要的概念,它在组合数学、概率论等领域有着广泛的应用。
然而,当阶乘的数值非常大时,传统的计算方法往往会因为计算量太大而变得非常耗时。
为了解决这个问题,人们提出了一系列快速计算阶乘的方法。
一、基于递归的快速计算方法递归是一种非常常见的计算方法,它可以将一个大问题分解成若干个小问题,然后通过解决小问题来解决大问题。
对于阶乘来说,我们可以使用递归的方法来计算。
具体而言,我们可以将阶乘分解为两个部分:首先计算阶乘数n的一半,然后将结果平方得到n的阶乘。
这样,我们就可以通过递归的方式来计算阶乘。
二、基于迭代的快速计算方法除了递归,迭代也是一种常见的计算方法。
与递归不同,迭代是通过循环来实现计算的过程。
对于阶乘来说,我们可以使用迭代的方法来计算。
具体而言,我们可以使用一个循环来计算阶乘。
首先,我们将阶乘的初始值设为1,然后通过循环不断将当前值乘以下一个数,直到计算到n为止。
这样,我们就可以通过迭代的方式来计算阶乘。
三、基于公式的快速计算方法除了递归和迭代,还有一种基于公式的快速计算阶乘的方法。
这种方法通过使用数学公式来计算阶乘,从而减少计算的复杂度。
具体而言,我们可以使用斯特林公式来计算阶乘的近似值。
斯特林公式是一个近似计算阶乘的公式,它可以通过对数函数的性质来简化阶乘的计算。
使用斯特林公式,我们可以将阶乘的计算复杂度从O(n)降低到O(log n)。
四、基于查表的快速计算方法除了以上三种方法,还有一种基于查表的快速计算阶乘的方法。
这种方法通过预先计算并保存阶乘的结果,然后在需要计算阶乘时直接查表获取结果,从而减少计算的时间。
具体而言,我们可以使用动态规划的方法来计算并保存阶乘的结果。
首先,我们将阶乘的初始值设为1,并将其保存在一个表中。
然后,通过循环计算并保存每个数的阶乘结果,直到计算到n为止。
这样,当需要计算阶乘时,我们只需要从表中查找结果,而不需要重新计算。
总结起来,阶乘的快速计算方法有基于递归、迭代、公式和查表等多种方式。
vb程序设计常用算法
Exit For '结束循环
End if
End if
a(imin) = temp
Next I
2.冒泡法排序(升序)
基本思想:(将相邻两个数比较,小的调到前头)
1)有n个数(存放在数组a(n)中),第一趟将每相邻两个数比较,小的调到前头,经n-1次
两两相邻比较后,最大的数已"沉底",放在最后一个位置,小数上升"浮起";
2)第二趟对余下的n-1个数(最大的数已"沉底")按上法比较,经n-2次两两相邻比较后得
,如果都除不尽,m就是素数,否则就不是。(可用以下程序段实现)
m =val( InputBox("请输入一个数"))
For i=2 To int(sqr(m))
If m Mod i = 0 Then Exit For
Next i
二、求两个整数的最大公约数、最小公倍数
分析:求最大公约数的算法思想:(最小公倍数=两个整数之积/最大公约数)
(1) 对于已知两数m,n,使得m>n;
(2) m除以n得余数r;
(3) 若r=0,则n为求得的最大公约数,算法结束;否则执行(4);
Next n1
五、排序问题
1.选择法排序(升序)
基本思想:
1)对有n个数的序列(存放在数组a(n)中),从中选出最小的数,与第1个数交换位置;
2)除第1 个数外,其余n-1个数中选最小的数,与第2个数交换位置;
3)依次类推,选择了n-1次后,这个数列已按升序排列。
VB程序设计的常用算法
Loop Print "e="; e End Sub Private Sub Command2_Click() Dim e#, t#, n% e = 1: t = 1: n = 1 Do Until (1 / t) < 0.00000001 t=t*n e=e+1/t n=n+1 Loop Print "e="; e End Sub Private Sub Command3_Click() Dim e#, t#, n% e = 1: t = 1: n = 1 While (1 / t) > 0.00000001 t=t*n e=e+1/t n=n+1 Wend Print "e="; e End Sub 3、
abc: Next i End Sub
补充实例:验证哥德巴赫猜想 (任意一个大于等于6的偶数都可以分解为两个素数之和)
基本思想:n为大于等于6的任一偶数,可分解为n1和n2两个数, 分别检查n1和n2是否为素数,如都是,则为一组解。如n1不是素数,就 不必再检查n2是否素数。先从n1=3开始,检验n1和n2(n2=N-n1)是否 素数。然后使n1+2 再检验n1、n2是否素数,… 直到n1=n/2为止。 利用上面的prime函数,验证哥德巴赫猜想的程序代码如下: Dim n%,n1%,n2% n=Val(InputBox("输入大于6的正整数")) For n1=3 to n\2 step 2 n2=n-n1 If prime(n1) Then If prime(n2) then Print n & "=" & n1 & "+" & n2 Exit For '结束循环 End if End if Next n1
VB程序
模(一二)1.从键盘上输入3个数分别放入x y z中,编程使x中的数最大,z中的数最小。
Private Sub Form_Click()x = Val(InputBox("请输入x"))y = Val(InputBox("请输入y"))z = Val(InputBox("请输入z"))If x < y Then t = x: x = y: y = tIf y < z Then t = y: y = z: z = tIf x < y Then t = x: x = y: y = tPrint x; y; zEnd Sub2.用近似公式求自然对数e的值,精确到1/n!<F,F由用户输入。
e=1+1/1!+1/2!+……1/n! Private Sub Form_Click()Dim F#, e#, n%, t&e = 1: n = 1: t = 1F = Val(InputBox("输入F值"))Doe = e + 1 / tn = n + 1t = t * nLoop Until 1 / t <= FPrint eEnd Sub3.将d:\a.txt复制为d:\b.txt,要求不能直接使用Filecopy语句。
Private Sub Command1_Click()Dim sline As StringOpen "d:\a.txt" For Input As 1Open "d:\b.txt" For Output As 2While Not EOF(1)Line Input #1, slinePrint #2, slineWendClosePrint "Copy finished"End Sub4.统计200~300中素数的个数,显示在窗体上,素数的判断用自定义函数judge来实现。
vb第7章过程
2. 按值传递参数
(【例7-8在例7-7中使用传值调 用Function过程,求两个整数的 最大公约数和最小公倍数。)
Function Hcf(m As Long, n As Long) As Long Dim r As Long, c As Long If m < n Then c = m: m = n: n = c End If r = m Mod n Do While r <> 0 m = n n = r r = m Mod n Loop Hcf = n End Function
7.1 Sub 过程
Sub Procedure
模块化 子程序(Sub) 函数(Function) 事件过程
– 对事件作出响应的程序段 –事件过程由VB自行声明,用户不能增加或删除。
通用过程
– 多个事件过程可能需要使用的一个共用过程, –通用过程只能由别的过程调用。
7.1.1 事件过程与通用过程
实现方法 : 在形参前加关键字 ByRef 来实现。 如: Function Hcf(ByRef m As Long, ByRef n
As Long) As Long
p = Hcf(Hcf(l, m), n)
1. 按地址传递参数
(【例7-7利用例7-6中的Function 过程,求任意两数的最大公约数。)
常见错误
7.3 向过程传递参数
在调用一个过程时,把实际参数传送给过程中的形 式参数,实现形参与实参的结合。 7.3.1 形式参数与实际参数 1.形式参数 定义通用过程时出现的变量名,是接收数据的。 参数表中各项之间用逗号隔开,可以是: – 合法变量名;数组名(后面跟有左、右括号的)。 要使用变长字符串(x$或x As String)作为形参, 不能用形如X As String *8 定长字符串作为形参, 2.实际参数 调用过程时,一般是传送给过程的。 实际参数表中的各项用逗号隔开,可以是:常量、 表达式、变量。
VB常用算法总结大全
22222 33333 44444
For I=2 to 3 S(2)=S(2)+X(I,1) S(3)=S(3)+X(I,5)
Next i for I=1 to 4
Next i Print t
Print Sum 思考:若把循环体前面置各变量初值的语句放 在循环体内,程序运行时会产生什么情况?
例求自然对数e的近似值,要求其误差小于0.00001,近似公式
为:
1 1 1
1
1
m1
e 1 ... ... 1
1! 2! 3! i!
i0 i!
i1 i!
常用算法总结—算法是对某个问题求解过程的描述
一、基本算法
1.累加、连乘
1~100的5或7的倍数的和
Sum = 0
3~10的乘积 t=1
For i = 1 To 100
For i =3 To 10
If i Mod 5 = 0 Or i Mod 7 = 0 Then
t=t*i
Sum = Sum + i End If Next i
Print i; "*"; j; "="; i * j;
Next j
换作行用!?
Next i
End Sub
例:xh2.vbp
执行本程序,窗体上将显示九九乘法表。Ssfrm.frm
思考:打印上三角或下三角程序如何改动?要打印下 三角?
8. 打印图形
见下页
编写程序打印如外的循行右环数边用及图来每控行形制第:输一出个 Private Sub For字m符_C的l输ic出k(位) 置
******* ***** *** *
VB各种算法
VB各种算法一、求累加和Dim sum&,i%,n%Sum=0n=inputbox(“请输入n的值:”, “输入n的值”)For i = 1 to nSum=sum+iNext iPrint “1+2+...”;n;” =”; sumEnd sub二、求阶乘Private Sub Form_Click()Dim i%, n%, p&p = 1n = Val(InputBox("请输入n:"))For i = 1 To np = p * iNext iMsgBox n & "!=" & p, , "求阶乘"End Sub三、求最值、平均值Private Sub Command1_Click()Dim n As Integer, i As Integer, min As Integer, max As Integer, aver As Single, s As Integer n = Val(InputBox("输入个数:"))s = Int(Rnd * 100) + 1max = smin = saver = sPrint "第1个数是:" & sFor i = 2 To ns = Int(Rnd * 100) + 1Print "第" & i & "个数是:" & sIf s > max Then max = sIf s < min Then min = saver = aver + sNext iaver = aver / nPrint "max="; max; "min="; min; "aver="; averEnd Sub五、输出各种金字塔图形Private Sub Form_Click()Dim i%, j%For i = 1 To 4Print spc(2 * i);For j = 1 To 9- 2 * iPrint "◆";Next jPrintNext iEnd Sub六、字符串重新排列输出Fibonacci 数列求Fibonacci 数列的前20项:⎪⎩⎪⎨⎧>+===--)2(_)2(1)1n 1n f f f 21n n n n (Private Sub Form_Click()Dim a%(1 To 20)Print "Fibonacci 数列的前20项为"Print 1; 1;For i = 3 To 10a(1) = 1a(2) = 1a(i) = a(i - 1) + a(i - 2)Print a(i);Next iPrintFor i = 11 To 20a(i) = a(i - 1) + a(i - 2)Print a(i);Next iEnd Sub六、判断素数Private Sub Form _Click()Dim m%, j%, k%m = Val(InputBox("m=?"))If m = 0 Or m = 1 ThenMsgBox m & "不是素数"Elsek = Int(Sqr(m))For j = 2 To kIf m Mod j = 0 Then Exit For Next jIf j > k ThenMsgBox m & "是素数"ElseMsgBox m & "不是素数"End IfEnd IfEnd Sub八、辗转相除求最大公约数、最小公倍数Private Sub Form_Click()Dim n%, m%, x%, r%, t%m = Val(InputBox("m="))n = Val(InputBox("n="))x = m * nIf m < n Then t = m: m = n: n = tDor = m Mod nm = nn = rLoop While r <> 0Print "最大公约数=", mPrint "最小公倍数=", x / mEnd Sub九、迭代法求平方根用迭代法求a 的平方根。
VB教材课后习题答案
<大学程序设计基础-Visual Basic>教材课后习题答案第1章一、选择题1 2 3 4 5 6 7B D BC B B D第2章一、选择题1 2 3 4 5 6 7 8 9 10B C B C B C A A A A11 12 13 14A B A A二、填空题1.rem或’ _ :2.“” # #3.5x2-3x-2sinA/34.3214565.300三、操作题1、程序段:Private Sub Command1_Click()Dim x As Integer, y As IntegerDim s As Long, c As Longx = Text1.Texty = Text2.Texts = x * yc = (x + y) * 2Label3.Caption = "长方形的面积为" + Str(s)Label4.Caption = "长方形的周长为" + Str(c)End Sub3、程序段:Private Sub Command1_Click()Text1.Text = "第一"End SubPrivate Sub Command2_Click()Text1.Text = "第二"End Sub4、程序代码:Private Sub Text1_Change()Text1.MaxLength = 10End Sub5、程序代码:Private Sub Text1_Click()Text1.SelStart = 0Text1.SelLength = Len(Text1.Text)End Sub第3章一、选择题1 2 3 4 5 6 7D A D B A D B二、填空题1. False2.B^2-4*a*c else三、操作题1.从键盘输入三个值,判断它们能否构成三角形的三个边。
如果能构成一个三角形,则计算三角形的面积。
vb编写计算公式(一)
vb编写计算公式(一)VB编写计算公式作为一名资深的创作者,你可能会在VB编程中经常使用计算公式来进行数据处理和分析。
本篇文章将列举一些常见的计算公式,并给出相应的解释和示例说明。
1. 数值计算公式基本运算符使用基本运算符来进行数值计算是VB编程中最常见的操作之一。
•加法:使用符号+进行两个数值的相加。
例如,计算两个数的和:result = num1 + num2•减法:使用符号-进行两个数值的相减。
例如,计算两个数的差:result = num1 - num2•乘法:使用符号*进行两个数值的相乘。
例如,计算两个数的乘积:result = num1 * num2•除法:使用符号/进行两个数值的相除。
例如,计算两个数的商:result = num1 / num2平方与开方在某些情况下,我们需要进行数值的平方和开方运算。
•平方:使用`方法对一个数值进行平方运算。
例如,计算一个数的平方:result = (num, 2)`•开方:使用`方法对一个数值进行开方运算。
例如,计算一个数的平方根:result = (num)`取整与四舍五入有时候我们需要对数值进行取整或进行四舍五入操作。
•取整:使用`方法将一个数值向下取整。
例如,将一个浮点数向下取整为整数:result = (num)`•四舍五入:使用`方法将一个数值进行四舍五入。
例如,将一个浮点数四舍五入为指定的小数位数:result = (num,decimalDigits)`2. 统计计算公式平均值在统计分析中,计算一组数据的平均值是常见的需求之一。
•算术平均值:对一组数据进行求和,然后除以数据个数即可得到算术平均值。
例如,计算一组数的算术平均值:result = sum / count•加权平均值:对一组有权重的数据进行求和,然后除以权重之和即可得到加权平均值。
例如,计算一组有权重的数据的加权平均值:result = sumOfData / sumOfWeights方差与标准差方差和标准差常用于描述一组数据的离散程度。
vb 矩阵乘法
vb 矩阵乘法
VB矩阵乘法是一种在Visual Basic编程语言中常用的数学运算方法,通过矩
阵乘法可以实现对矩阵中的元素进行相乘再求和的操作,从而得到最终的结果矩阵。
在进行矩阵乘法运算时,需要注意矩阵的维度和元素的排列顺序,以确保计算结果的正确性。
矩阵乘法的运算规则是:若A为m×n的矩阵,B为n×p的矩阵,那么它们的
乘积C为m×p的矩阵,其中C中第i行第j列的元素cij等于矩阵A的第i行与
矩阵B的第j列对应元素的乘积之和。
在Visual Basic中实现矩阵乘法的方法一
般是通过嵌套循环来逐个计算每个元素的值,从而得到最终的结果矩阵。
在进行VB矩阵乘法时,需要注意的一些问题包括:矩阵的维度必须满足乘法
规则,即第一个矩阵的列数必须等于第二个矩阵的行数;矩阵元素的数据类型要一致,否则可能会导致运算错误;矩阵乘法是不满足交换律的,即AB不等于BA,所
以在进行乘法运算时要确保矩阵的顺序是正确的。
另外,在进行大型矩阵乘法运算时,还需要考虑到计算效率的问题。
由于矩阵乘法的计算量较大,如果采用简单的嵌套循环方法可能会导致运算速度较慢,因此可以考虑使用多线程或并行计算的方式来加快运算速度,提高计算效率。
总的来说,VB矩阵乘法是一种重要的数学运算方法,在科学计算、数据处理
等领域都有广泛的应用。
通过熟练掌握矩阵乘法的规则和在Visual Basic中的实
现方法,可以更高效地进行复杂的矩阵运算,从而更好地解决实际问题。
希望通过本文的介绍,读者能对VB矩阵乘法有更深入的了解,从而在编程实践中运用自如。
vb复数阶乘
Public Type complex ' 复数类型re As Doubleim As Doubleinf As Boolean' "无穷大"标志NaN As Boolean' "非数字"标志End TypePublic dGammaConstants As VariantSub Main()' 初始化dGammaConstants = Array(57.1562356658629, -59.5979603554755, 14.1360979747417, -0.49191381609762, 3.39946499848119E-05,4.65236289270486E-05, -9.83744753048796E-05, 1.58088703224912E-04, -2.10264441724105E-04, 2.17439618115213E-04, -1.64318106536764E-04, 8.44182239838528E-05, -2.61908384015814E-05, 3.68991826595316E-06) End SubPublic Function number(Optional ByVal re As Double, Optional ByVal im As Double) As complex' 构造新的复数number.re = re: number.im = imEnd FunctionPublic Function newInfinity() As complex' 构造新的无穷远点复数newInfinity.inf = TrueEnd FunctionPublic Function isMultipleOfPi(d As Double, Optional nType As Long) As Boolean' 判断是否为π的整数倍、偶数倍或奇数倍Dim ret As Doubleret = d / CONST_PIIf ret <> Int(ret) ThenExit FunctionEnd IfIf nType = 0Then' 整数倍isMultipleOfPi = TrueElse' 偶数倍或奇数倍isMultipleOfPi = Abs(ret) Mod2 = nType - 1End IfEnd FunctionPublic Function add(z1 As complex, z2 As complex) As complex ' 复数加法运算If z1.NaN Or z2.NaN Thenadd.NaN = TrueExit FunctionElseIf z1.inf Or z2.inf Then' ∞ + ∞add.inf = TrueExit FunctionEnd Ifadd = number(z1.re + z2.re, z1.im + z2.im)End FunctionPublic Function mul(z1 As complex, z2 As complex) As complex ' 复数乘法运算If z1.NaN Or z2.NaN Thenmul.NaN = TrueExit FunctionElseIf (z1.inf And Not z2.inf) Or (z2.inf And Not z1.inf) Then ' ∞·a 或a·∞mul.NaN = TrueExit FunctionElseIf z1.inf And z2.inf Then' ∞·∞mul.inf = TrueExit FunctionEnd Ifmul = number(z1.re * z2.re - z1.im * z2.im, z1.re * z2.im +z2.re * z1.im)End FunctionPublic Function ln(z As complex) As complex' 返回自然对数函数值If z.NaN Thenln.NaN = TrueExit FunctionElseIf z.re = 0And z.im = 0Thenln = newInfinity()Exit FunctionEnd Ifln = number(Log(Sqr(z.re ^ 2 + z.im ^ 2)), arg(z))End FunctionPublic Function exponent(z As complex) As complex' 返回自然指数函数值' 原理: 欧拉公式If z.NaN Thenexponent.NaN = TrueExit FunctionEnd IfDim z1 As complex, z2 As complexz1 = number(Exp(z.re))z2 = number(z.im)exponent = mul(z1, number(cosine(z2).re, sine(z2).re))End FunctionPublic Function sine(z As complex) As complex' 返回正弦函数值If z.NaN Thensine.NaN = TrueExit FunctionEnd IfIf z.im = 0ThenIf isMultipleOfPi(z.re) Then' π的整数倍Exit FunctionEnd IfEnd Ifsine = number(Sin(z.re) * (Exp(z.im) + Exp(-z.im)) / 2, Cos(z.re) * (Exp(z.im) - Exp(-z.im)) / 2)End FunctionPublic Function cosine(z As complex) As complex' 返回余弦函数值If z.NaN Thencosine.NaN = TrueExit FunctionEnd IfIf z.im = 0ThenIf isMultipleOfPi(z.re * 2, 2) Then' π/2 的奇数倍Exit FunctionEnd IfEnd Ifcosine = number(Cos(z.re) * (Exp(z.im) + Exp(-z.im)) / 2, -Sin(z.re) * (Exp(z.im) - Exp(-z.im)) / 2)End FunctionPublic Function factorial(z As complex) As complex' 阶乘运算Dim zVal As complexDim n As LongIf z.im = 0Then' 实数Select Case z.reCase Is < 0If Int(z.re) = z.re Then' 负整数的阶乘为无穷大zVal.inf = TrueElse' 非整负数,使用伽马函数zVal = factorialGamma(z)End IfCase Is > 0If Int(z.re) = z.re Then' 正整数n = z.rezVal.re = 1Do While n > 1zVal.re = zVal.re * nn = n - 1LoopElse' 非整正数,使用伽马函数或递归If z.re < 16ThenzVal = factorialGamma(z)ElsezVal = factorialIteration(z)End IfEnd IfEnd SelectElse' 复数,使用伽马函数zVal = factorialGamma(z)End Iffactorial = zValEnd FunctionPublic Function factorialIteration(z As complex) As complex ' 基于递归计算阶乘Dim zVal As complex, zTmp As complex, nLast As LongDim l As LongnLast = Int(z.re)zTmp = number(z.re - CDbl(nLast))zVal = factorialGamma(zTmp)For l = 1To nLastzTmp.re = zTmp.re + 1zVal = mul(zVal, zTmp)NextfactorialIteration = zValEnd FunctionPublic Function factorialGamma(z As complex) As complex ' 基于对数伽马函数计算阶乘Dim sumRe As Double, sumIm As DoubleDim down As Double, xplusn As Double, cc As DoubleDim n As IntegerDim a As DoubleDim tmpRe As Double, saveIm As DoubleDim termRe As Double, termIm As DoubleDim zVal As complexsumRe = 0.999999999999997down = z.re ^ 2 + z.im ^ 2xplusn = z.reFor n = 0To UBound(dGammaConstants)xplusn = xplusn + 1down = down + xplusn * 2 - 1cc = dGammaConstants(n)sumRe = sumRe + cc * xplusn / downsumIm = sumIm - cc * z.im / downNexta = z.re + 0.5tmpRe = z.re + 5.2421875saveIm = z.imzVal.re = tmpRezVal = ln(zVal)termRe = a * zVal.re - saveIm * zVal.im + 0.918938533204673 - tmpRetermIm = a * zVal.im + saveIm * zVal.re - saveImzVal = ln(number(sumRe, sumIm))zVal = add(zVal, number(termRe, termIm))zVal = exponent(zVal) ' 取对数伽马函数的自然指数,即 z 的广义阶乘factorialGamma = zValEnd Function。
vb课程设计报告阶乘
vb课程设计报告阶乘一、教学目标本章节的教学目标是让学生掌握阶乘的概念,理解阶乘的计算方法,能够运用阶乘解决相关问题。
具体分为以下三个部分:1.知识目标:使学生了解阶乘的定义,掌握阶乘的计算规则,能够准确地计算任意正整数的阶乘。
2.技能目标:培养学生运用阶乘解决实际问题的能力,能够运用编程语言(如VB)实现阶乘的计算。
3.情感态度价值观目标:培养学生对数学的兴趣,激发学生探究数学问题的热情,培养学生的团队合作精神。
二、教学内容本章节的教学内容主要包括阶乘的定义、阶乘的计算方法以及运用阶乘解决实际问题。
具体分为以下三个部分:1.阶乘的定义:介绍阶乘的概念,解释阶乘的计算规则。
2.阶乘的计算方法:教授如何利用递归法、循环法等方法计算阶乘。
3.运用阶乘解决实际问题:通过编程语言(如VB)实现阶乘的计算,让学生学会运用阶乘解决相关问题。
三、教学方法为了达到本章节的教学目标,将采用以下教学方法:1.讲授法:教师讲解阶乘的定义、计算方法以及运用阶乘解决实际问题。
2.讨论法:学生分组讨论,分享各自的解题思路和编程方法。
3.案例分析法:分析典型的阶乘问题,引导学生运用阶乘解决实际问题。
4.实验法:学生动手实践,利用编程语言(如VB)实现阶乘的计算。
四、教学资源为了支持本章节的教学内容和教学方法,将准备以下教学资源:1.教材:提供相关章节,介绍阶乘的定义、计算方法以及运用阶乘解决实际问题。
2.参考书:提供数学及相关领域的参考书籍,丰富学生的知识体系。
3.多媒体资料:制作PPT、视频等资料,帮助学生更好地理解阶乘的概念和计算方法。
4.实验设备:提供计算机等设备,让学生动手实践,利用编程语言(如VB)实现阶乘的计算。
五、教学评估本章节的评估方式将包括以下几个部分:1.平时表现:评估学生在课堂上的参与程度、提问回答情况以及小组合作的表现。
2.作业:评估学生提交的阶乘相关练习题,包括计算题和编程题。
3.考试:设计一份包含阶乘知识点的考试,评估学生对阶乘的理解和应用能力。
VB程序设计的常用算法
VB程序设计的常用算法算法(Algorithm):计算机解题的基本思想方法和步骤。
算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。
通常使用自然语言、结构化流程图、伪代码等来描述算法。
然语言、结构化流程图、伪代码等来描述算法。
一、计数、求和、求阶乘等简单算法此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。
计数、和、阶乘的变量的初值。
例:用随机函数产生100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数并打印出来。
的数的个数并打印出来。
本题使用数组来处理,用数组a(1 to 100)存放产生数组x(1 to 10)来存放个位上的个随机整数,数组的确100个随机整数,数字分别为1,2,3,4,5,6,7,8,9,0的数的个数。
即个位是1的个数存放在x(1)中,个位是2的个数存放在x(2)中,……个位是0的个数存放在x(10)。
过程中,代码如下: 将程序编写在一个GetTJput过程中,代码如下:Public Sub GetTJput() Dim a(1 To 100) As Integer Dim x(1 To 10) As Integer Dim i As Integer, p As Integer '产生100个[0,99]范围内的随机整数,每行10个打印出来个打印出来For i = 1 To 100 a(i) = Int(Rnd * 100) If a(i) < 10 Then Form1.Print Space(2); a(i); Else Form1.Print Space(1); a(i); End If If i Mod 10 = 0 Then Form1.Print Next i '统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数,并将统计结果保存在数组x(1),x(2),...,x(10)中,将统计结果打印出来中,将统计结果打印出来For i = 1 To 100 p = a(i) Mod 10 ' 求个位上的数字If p = 0 Then p = 10 x(p) = x(p) + 1 Next i Form1.Print "统计结果" For i = 1 To 10 p = i If i = 10 Then p = 0 Form1.Print "个位数为" + Str(p) + "共" + Str(x(i)) + "个" Next i End Sub 二、求两个整数的最大公约数、最小公倍数分析:求最大公约数的算法思想:((最小公倍数=两个分析:求最大公约数的算法思想:)最大公约数)整数之积/最大公约数(1) 对于已知两数m,n,使得m>n;(2) m除以n得余数r;(3) 若r=0,则n为求得的最大公约数,算法结束;否则执行(4);(4) m←n,n←r,再重复执行(2)。
VB课必须掌握的基本算法与程序
VB必须掌握的基本算法与程序1.两个变量的内容相互交换;计数、求和与求阶乘;随机生成10个三位整数;求最大公约数与最小公倍数;求素数2.十进制转换为N进制。
反之?3.对某个四位整数取千位.百位.十位.个位;判断它是否为回文数4. 应用动态数组,编写求某自然数N的所有因子的程序5.掌握数组排序(选择法、直接排序法等)教科书P102例5-3;了解其它排序算法(冒泡排序...)教科书P185.例8-6 实验指导书…6.对已排序的数组插入一个数组元素;删除某个元素数组;生成10个互不相同的随机数;删除数组中重复的元素7. 矩阵的几种重要算法:①主对角线、次对角线上的操作;(斜线上的元素操作)②上三角与下三角操作③行(列)之间交换④删除某行/列⑤求转置矩阵⑥求“鞍点”8.几种常用的字符处理算法:①统计字母出现的次数(教科书P109例5-8)②求字符逆序③求反码与补码(教科书P80例),字符串加密…④应用动态数组,求字符串中的单词9.将数学公式用VB实现其算法:(选代法/递推法)①教科书P78例4-9;P83②通过X i与X i+1之间的区别,找规律,合理使用变量,写出循环体中关键语句!③教科书P184例8-5;实验指导书…10.递归算法(明白它的规律与执行过程)①求N!(教科书P176)明白其执行过程②求某字符串S的逆序③求X8(用函数实现)④求最大公约数(教科书P190例8-9)⑤求Fibolachi数11.文件操作①打开与关闭指定的文件(读方式?写方式?)②读语句操作、写语句操作③掌握文件指针的移动,判断是否到文件尾部EOF注意:1、熟练掌握VB的IDE开发环境(菜单与工具栏…)2、不断提高自己的程序调试能力(纸上会读,上机能调)3、熟练掌握程序的组合、拆分方法(掌握常用算法基础上)4、熟练掌握读程序、改程序、编程序、填空程序的方法(同学之间互相交流经验;答疑)如:编程序先确定写几个过程,它们的调用关系;再写核心语句;再….;读一遍,检查…如:读程序的技巧(代入法;快速找要点);改错程序的观察点如:考试技巧,得分手段等应该掌握书上的基本语法与基本算法程序(VB强化)1、P59-P61习题:5#,8#,10#,11#,12#,13#,16#2、P68:最大公约数算法程序。
vb常用算法
VB常用算法算法1 交换2个变量的值算法思想:若交换两个变量的值,必须引入第三个新的变量进行传递。
交换a,b的值: t=a:a=b:b=t或者t=b:b=a:a=t算法2 产生随机数算法思想:生成一个[a,b]区间的整数公式为Int(Rnd*(b-a+1))+a1.自动生成[0,100]之间的随机数: Int(Rnd*101)2.自动生成2位随机整数: Int(Rnd*90+10)例:自动产生10个100~999之间的随机整数,并放到数组a中Dim a(10 ) as integerFor i=1 to 10a(i) =Int(Rnd*900)+100Next i算法3判断一个数是否能被另一个数整除算法思想:可以用整除的定义(余数为0)或X除以Y等于X整除Y等表达式进行判断。
条件表达式可以为:X mod Y=0或X\Y=X/Y或Int(X/Y)=X/Y如果以上条件表达式为True,则表示X能被Y整除。
例题:统计0—100之间能被3整除的数的个数、累加和及其平均值。
s=0n=0For i=0 To 100If i mod 3=0 Thens=s+in=n+1End IfNext iPrint n,s,s/n算法4 求阶乘和累加和算法思想:使用循环语句,并用一个变量存放累加的中间及最终结果。
注:(1)累加求和时变量初值为0。
(2)计算阶乘时变量初值为1。
(3)统计计个数(计数)时可用一个变量作为统计个数的累加变量,每次加1即可。
(4)求平均值算法思想是先求和,再除以个数。
(5)条件求和(或计数):在循环语句中加入If-End If判断语句。
1.求1 ~n个自然数的阶乘s=1For i=1 to ns=s*iNext i2.求1 ~n个自然数的累加和s=0For i=1 to ns=s+iNext i例题:计算1到10之间所有整数的累加和以及10!。
n=10sum= 0prod= 1For i=1 To 10sum=sum+ iprod=prod* iNext iPrint sum,prod例题:统计1—100之间能被3和7整除的数的个数、并求它们的累加和。
VB程序设计的常用算法4
VB程序设计的常用算法4十、数制转换将十进制整数m转换为→ R(2-16)十六进制字符串。
方法:将m不断除r取余数,直到商为零,以反序得到结果。
下面写出一转换函数,参数idec为十进制数,ibase为要转换成数的基(如二进制的基是2,八进制的基是8等),函数输出结果是字符串。
privatefunctiontrdec(idecasinteger,iBasAsInteger)作为字符串IMSTRDECR$,idecr%strdecr=\dowhileidec<>0idecr=IdeCmodibaseIdec>=10然后strdecr=chr$(65+idecr-10)&strdecrelseSTRDCR=idecr和STRDCRENDIFidec=idec\\ibaselooptrdec=strdecrendfunction十一、字符串的一般处理1.简单加密和解密加密的思想是在每个字母C上加(或减)一个序数k,也就是说,用后面的第k个字母替换它。
转换公式为:C=Chr(ASC(C)+k)例如序数k为5,这时\→\,\\,\\当加序数后的字母超过\或\则c=chr(asc(c)+k-26)例如:你很好→ dtzfwjltti解密是与加密相反的过程将每个字母c减(或加)一序数k,即c=chr(asc(c)-k),例如,如果序号k是5,那么→ \, \ → \, \ → \ 当添加序数后的字母小于\或\时,C=Chr(ASC(C)-K+26的下一个程序是加密:I=1:STRP=\NL=len(rtrim(stri))dowile(I<=NL)strt=mid$(stri,i,1)'取第i个字符if(strt>=\ia=asc(strt)+5ifia>asc(\strp=strp+chr$(ia)elseif(strt>=\ia=asc(strt)+5ifia>asc(\strp=strp+chr$(ia)其他strp=strp+strtendifi=i+1loopprintstrp2.计算文本字数的算法思想:(1)从文本(字符串)的左边开始,取出一个字符;设逻辑量wt表示所取字符是否是单词内的字符,初值设为false(2)如果字符不是“空格”、“逗号”、“分号”或“感叹号”等单词的分隔符,则判断WT是否为真。
VB常用算法
1.求任意自然数n的阶乘:方法一Do循环法S=1FOR I=1 TO nS=S*INEXT I方法二For循环S=1:t=1DO WHILE t<=5S=S*tt= t +1LOOP2.闰年判断y = T ext1.T extIf (y Mod 4 = 0 And y Mod 100 <> 0) Or y Mod 400 = 0 Then MsgBox y & "是闰年"ElseMsgBox y & "不是闰年"End If3.求两个自然数m、n的最大公约数Hmax和最小公倍数Hmin m=T ext1.text : n=T ext2.text ‘m和n可通过其他途径赋值mn=m*n ‘暂存m和n的乘积,以便后面算最小公倍数If m<n Thent=m :m=n :n=tEnd Ifr=m Mod n Do While r< >0m=nn=rr=m Mod nLoopHmax=nHmin=mn/Hmax4. 素数判断N=InputBox( “输入>=3的正整数”)FOR I=2 TO N-1 ‘或SQR(N) ,提前退出法IF (N MOD I =0) THEN EXIT FORNEXT IIF I>N-1 THENPRINT N; “是素数”ELSEPRINT N; “不是素数”N=InputBox( “输入一个>=3的正整数”) END IFF=0 …F也可用逻辑型变量,标志法FOR I=2 TO N-1 ‘或SQR(N)IF (N MOD I =0) THEN F=1NEXT IIF F=0 THENPRINT N; “是素数”ELSEPRINT N; “不是素数”END IF6.单词数统计方法一标志法,以空格作为单词间的间隔(假设只有空格和字母)Dim a$, temp$Dim n%, i%Dim newWord As Boolean, WordNum As Integera = T ext1.T ext 'a = Ltrim(T ext1.T ext)n = Len(a)newWord = False '未遇到新单词(也可用数值变量)WordNum = 0For i = 1 T o ntemp = Mid(a, i, 1)If temp = " " ThennewWord = False'简化为ElseIf newWord = False ThenElseIf UCase(temp) >= "A" And UCase(temp) <= "Z" And newWord = False ThenWordNum = WordNum + 1newWord = T rueEnd IfNext iT ext2.T ext = WordNum方法二根据相邻两字符特征判断Dim a$, tempF$, tempB$Dim n%, wNum%, i%a = T ext1.T ext 'a = Ltrim(T ext1.T ext)wNum = 0n = Len(a)For i = 1 T o n - 1 '避免超出范围tempF = Mid(a, i, 1)tempB = Mid(a, i + 1, 1)If wNum = 0 And tempF <> " " Then '对第一个单词特殊处理wNum = wNum + 1ElseIf tempF = " " And tempB <> " " ThenwNum = wNum + 1End IfNext iT ext2.T ext = wNum7.找出二维矩阵中的最大元素、最小元素及其所在位置Dim dMax%, rowMax%, colMax% '最大值、所在行、所在列Dim dMin%, rowMin%, colMin% '最小值、所在行、所在列Dim i%, j%dMax = a(1, 1): rowMax = 1: colMax = 1 '假设a(1, 1)最大,记录位置dMin = a(1, 1): rowMin = 1: colMin = 1 '假设a(1, 1)最小,记录位置For i = 1 T o UBound(a, 1) '第一维下标范围For j = 1 T o UBound(a, 2) '第二维下标范围'找最大If dMax < a(i, j) Then '与数组中的元素一一比较dMax = a(i, j)rowMax = icolMax = jEnd If'找最小If dMin > a(i, j) ThendMin = a(i, j)rowMin = icolMin = jEnd IfNext jNext iPrint "最大元素:"; dMax; ",它在第"; rowMax; "行,第"; colMax; "列" Print "最小元素:"; dMin; ",它在第"; rowMin; "行,第"; colMin; "列"8.产生n个[10,100]范围内互不相同的数据Dim T() As Integer '过程级动态数组Dim n As IntegerForm1.Clsn = InputBox("输入一个值")ReDim T(n)RandomizeFor i = 1 T o nT(i) = Int(Rnd * 91 + 10)'保证与前面的数据不等For j = 1 T o i - 1If T(i) = T(j) Then i = i - 1: Exit ForNext jNext i9.一维数组的排序(10个数据,升序为例)方法一比较交换法(经典排序法)(输出可同时进行)•外重循环I控制比较的轮数提供每轮参照元素下标(1 To n-1)•内重循环J 要与参照元素比较的元素的下标(I+1 To n) For i = 1 T o 9 …轮数及参照元素下标For j = i + 1 T o 10 …与参照元素比较的元素下标If a(i) > a(j) Thent = a(i)a(i) = a(j)a(j) = tEnd IfNext jNext i方法二选择交换法(输出可同时进行)内、外重循环的含义和作用与比较交换法相同For i = 1 T o 9k = I ‘K记录较小元素的下标For j = i + 1 T o 10If a(k) > a(j) Then k = jNext jIf k < > i Thent = a(i) : a(i) = a(k) : a(k) = tEnd IfNext i方法三冒泡法排序(输出独立进行)•外重循环I 控制比较的轮数(1 T o n-1 )决定各轮要参与比较的元素的范围•内重循环J提供每轮要与后面相邻元素进行比较的元素的下标(1T o n-I ) For i = 1 T o 9 ‟10 T o 2 Step -1For j = 1 T o 10 –i ‟1 T o i-1If a(j) > a(j + 1) Then ‟相邻元素比较t = a(j): a(j) = a(j + 1): a(j + 1) = tEnd IfNext jNext I方法四插入法排序绝对位置插入法:(结果的输出必须独立进行)第一重循环I 要决定位置的元素的下标( 2~n-1)第二重循环J 第I个元素要插入的有序数列(1~I-1)第三重循环K 当a(I)<a(J)时, 后移的元素(I-1~J)For i = 2 T o 10n = a(i) … 暂存a(i),避免冲掉For j = 1 T o i - 1If n < a(j) ThenFor k = i - 1 T o j Step –1a(k + 1) = a(k)Next ka(j) = nExit For …注意,不能少End IfNext jNext i …不用考虑n>a(i-1), n原本就放在a(i)相对位置插入法:(结果的输出必须独立进行)外重循环I 要决定位置的元素的下标( 2~n-1)内重循环J 第I个元素要插入的有序数列下标范围(I-1 ~ 1) For i = 2 T o 10n = a(i)For j = i - 1 T o 1 S tep –1 …反向If n < a(j) Thena(j + 1) = a(j)a(j) = nElsea(j + 1) = n …本句可不要Exit ForEnd IfNext jNext i10.有序数列的插入操作(假设原数组中已存放10个数据)绝对位置插入法:s = Val(InputBox("输入15~45之间的整数"))a(11) = s '提前放入For i = 1 To 10If s < a(i) Then '根据大小顺序,举实际数据定思路For k = 10 To i Step –1 'a(k + 1) = a(k)Next ka(i) = sExit For '分析少了该句的后果End IfNext iPrint "插入数据后:"For i = 1 To 11Print a(i);Next I11.有序数列的删除(假设原数组中已按升序存有10个不同数据)n = Val(InputBox("输入要删除的数据"))Rem 查找并删除k = 0 '找到的个数,决定输出范围For i = 1 To 10If n = a(i) Thenk = 1For j = i + 1 To 10 '将数据前移,填补删除空位a(j - 1) = a(j)Next jExit ForEnd IfNext iRem由k值决定输出范围,k=0,输出10个,k=1,输出9个数据Print "删除之后的结果:"For i = 1 To 10 - kPrint a(i);Next I12.统计文本框输入的字符串中,各字母出现的次数Dim a(65 To 90) As Integer 'a数组用于统计各字母出现的次数Dim c As String, le As Integer, d As String * 1Dim i%, j%, k%Picture1.Clsc = Text1.Text '取出待考察的字符串le = Len(c) '求字符串的长度For i = 1 To led = UCase(Mid(c, i, 1)) '(不区分大小写)取出字符转换成大写 If d >= "A" And d <= "Z" Thenj = Asc(d)a(j) = a(j) + 1 '对应数组元素加1End IfNext i For i = 65 To 90 '输出字母及其出现的次数If a(i) <> 0 Then '表明对应字母出现了k = k + 1 '用于控制输出格式Picture1.Print Chr$(i); "="; a(i); " ";If k Mod 9 = 0 Then Picture1.Print '每行输出9个 End IfNext j12.二分法查找(前提原数组有序,设原数组已按升序排序)Dim n%Dim bot%, mid%, top%, find As Booleann = Val(InputBox("请输入要查找的数据"))bot = 1: top = 10find = False '是否找到的标志Do '三个分支mid = Int((bot + top) / 2)If n = a(mid) Thenfind = TrueMsgBox "在a(" & mid & ")" & "找到数据" & nExit Do '可不要ElseIf n < a(mid) Thentop = mid - 1ElseIf n > a(mid) Thenbot = mid + 1End IfLoop Until find = True Or bot > topIf find = False Then MsgBox "没找到" & n & "."13.字符串的加密、解密问题加密解密问题.加密规律:小写字母: a-d,b-e……w-z,x-a,y-b,z-c大写字母: A-D,B-E……W-Z,X-A,Y-B,Z-C其它字符不变。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VB程序设计-多种方法求阶乘
(作者:草原飞狼 2014年5月26日)
声明:仅供学习与交流使用,高手请飘过,谢谢!所有代码都是个人亲自编写并调试成功。
布局
运行界面(1)
运行界面(2)
源代码如下:
Private Sub Command1_Click()
Rem 求任意数阶乘,不大于171
Dim mul As Double
Dim i As Integer
Dim k As Integer
mul = 1 '赋初值
k = Val(InputBox("请输入一个正整数,不大于171!", "输入提示", "5")) Rem 以下算法是求指定数的阶乘,典型的算法
For i = 1 To k
mul = mul * i
Next i
Print k & "的阶乘结果是:"; mul
End Sub
Private Sub Command2_Click()
Rem 清空
Form1.Cls
End Sub
Private Sub Command3_Click()
Rem 退出
Unload Me
End Sub
Private Sub Command4_Click()
Rem 普通过程求阶乘
Dim mul As Double
Dim i As Integer
Dim k As Integer
mul = 1 '赋初值
k = Val(InputBox("请输入一个正整数,不大于171!", "输入提示", "5"))
Rem 以下算法是求指定数的阶乘
Call fac(k) '函数调用,注意调用方法
Print k & "的阶乘结果是:"; fac(k)
End Sub
Private Function fac(ByVal k As Integer) As Double 'byval表示参数按值传递Rem 普通的函数过程
Dim i As Integer
Dim mul As Double
mul = 1
For i = 1 To k
mul = mul * i
Next i
fac = mul '结果返回给函数,典型的用法End Function
Private Sub Command5_Click()
Rem 递归过程求阶乘
Dim i As Integer
Dim k As Integer
Dim mul As Double
mul = 1 '赋初值
k = Val(InputBox("请输入一个正整数,不大于171!", "输入提示", "5"))
Rem 以下递归函数的调用
Call fac_digui(k)
Print k & "的阶乘结果是:"; fac_digui(k)
End Sub
Private Function fac_digui(ByVal k As Integer) As Double
Rem 递归过程求阶
Rem 以下是递归算法求阶乘,注意写法,编写递归算法时,方法类似
If k = 1 Then
fac_digui = 1
Else
fac_digui = fac_digui(k - 1) * k
End If
End Function。