N阶行列式计算程序(VB,递归)
2007-04-04 14:09
507 查看
行列式计算程序(VB,已修改为N阶)
2007-03-29 14:37
2007-03-29 14:37
用递归算法 FORM1中控件名称从上到下,从左到右依次为: frame2,text1,command3,command4 frame1,txt(index设为0,visible设为false) frame4,command1,command2 frame3,text2 工程属性中,启动对象设置为Sub main 对n值初始化为4 FORM2为“关于” 源程序: FORM1中: Option Explicit Private Sub Command1_Click() Dim i, j, a, b, temp_n As Integer Dim result As Double Erase MatrixA ReDim MatrixA(1 To n, 1 To n) temp_n = n For i = 1 To cindex If i Mod n = 0 Then a = i / n '/为整数除法 b = n Else a = i / n + 1 b = i Mod n End If MatrixA(a, b) = Val(txt(i).Text) Next i result = calcMatrix(MatrixA(), temp_n) Text2.Text = Str$(result) End Sub Private Sub Command2_Click() Dim i As Integer For i = 1 To cindex txt(i).Text = "0" Next i End Sub Private Sub Command3_Click() Erase MatrixA m = CInt(Text1.Text) n = m 'm列和n行相等 If n > 23 Then MsgBox "阶数大于23后屏幕显示不够!请重新输入!" Text1.SetFocus Exit Sub End If ReDim MatrixA(1 To n, 1 To n) 'MatrixA(a.b)用来存储第a行第b列的元素值 Unload Form1 Form1.Show End Sub Private Sub Command4_Click() Form2.Show End Sub Private Sub Form_Load() Dim i As Integer, j As Integer Dim nTop As Double Dim nLeft As Double Dim moveWidth As Double Dim moveHeight As Double cindex = 0 Text1.Text = n nLeft = 120 nTop = 240 m = CInt(Text1.Text) n = m 'm列和n行相等 For i = 1 To n nLeft = 120 For j = 1 To m cindex = i * m + j - m Load txt(cindex) txt(cindex).Move nLeft, nTop nLeft = nLeft + txt(0).Width + 100 txt(cindex).Visible = True txt(cindex).Text = "0" Next j nTop = nTop + txt(0).Height + 100 Next i If n > 4 Then moveWidth = 595 * (n - 4) moveHeight = 415 * (n - 4) Form1.Width = Form1.Width + moveWidth Form1.Height = Form1.Height + moveHeight Frame1.Width = Frame1.Width + moveWidth Frame1.Height = Frame1.Height + moveHeight Frame3.Move 2700 + moveWidth, 2220 + moveHeight Frame4.Move 1200 + moveWidth, 2220 + moveHeight End If End Sub Private Sub Text1_KeyPress(KeyAscii As Integer) If Chr(KeyAscii) >= 0 And Chr(KeyAscii) <= 9 Then KeyAscii = KeyAscii ElseIf KeyAscii <> 9e2c ; 8 And KeyAscii <> 9 And KeyAscii <> 10 And KeyAscii <> 13 Then MsgBox "请输入正确的整数!" KeyAscii = Asc("0") End If End Sub Private Sub txt_KeyPress(Index As Integer, KeyAscii As Integer) If Chr(KeyAscii) >= 0 And Chr(KeyAscii) <= 9 Or KeyAscii = 46 Or KeyAscii = 45 Then KeyAscii = KeyAscii ElseIf KeyAscii <> 8 And KeyAscii <> 9 And KeyAscii <> 10 And KeyAscii <> 13 Then MsgBox "请输入正确的实数!" KeyAscii = Asc("0") End If End Sub FORM2 中 Option Explicit Private Sub Form_Load() Form2.Icon = Form1.Icon End Sub 标准模块中: Option Explicit Public n, m, cindex As Integer Public MatrixA() As Double Public a() As Double 'temp2()用于求A()的余子式的中间数组, 'temp1()用于计算行列式值中存储行列式原值的中间数组 Sub Main() n = 4 '对n初始化,初始阶数为4 Form1.Show ReDim MatrixA(1 To 4, 1 To 4) End Sub Function calcMatrix(a() As Double, k As Integer) As Double '用递归方法求 Dim c, d As Integer Dim temp As Double Dim i, j, x, y As Integer Dim temp1() As Double Dim temp2() As Double ReDim temp1(1 To k, 1 To k) For i = 1 To k For j = 1 To k temp1(i, j) = a(i, j) ' Next j Next i d = k For c = 1 To d ReDim a(1 To d, 1 To d) '在每降一阶的循环中,a()初始化为原传入的数组 For i = 1 To d For j = 1 To d a(i, j) = temp1(i, j) Next j Next i k = d '初始化k,每调用一次ConvertA,k值减1 If k >= 2 Then ''以下为求行列式a()的第一行元素a(1,c)的余子式 ReDim temp2(1 To k - 1, 1 To k - 1) '求行列式a()的第一行元素a(1,c)的余子式 For x = 1 To k - 1 For y = 1 To k - 1 If y < c Then temp2(x, y) = a(x + 1, y) Else temp2(x, y) = a(x + 1, y + 1) End If Next y Next x k = k - 1 ReDim a(1 To k, 1 To k) For x = 1 To k For y = 1 To k a(x, y) = temp2(x, y) Next y Next x ''以上为求行列式a()的第一行元素a(1,c)的余子式 temp = (-1) ^ (1 + c) * temp1(1, c) * calcMatrix(a(), k) 'k为阶数,c为元素第几列 calcMatrix = calcMatrix + temp ElseIf k = 1 Then calcMatrix = calcMatrix + a(1, 1) End If Next c End Function 另附:简单四阶行列式计算程序: 利用公式:sum=sum+(-1)^t*A1p1*A2p2*A3p3*A4p4 (t为p1,p2,p3,p4的逆序数) Dim MatrixA(1 To 4, 0 To 3) As Double Private Sub Command1_Click() Dim k, l, m, n, i, j As Integer Dim product, sum As Double Dim p(0 To 3), t, tt, a, b, c, d As Integer For k = 0 To 3 MatrixA(1, k) = Val(Text1(k).Text) Text5.Text = Str$(MatrixA(1, k)) Next k For l = 0 To 3 MatrixA(2, l) = Val(Text2(l).Text) Text5.Text = Str$(MatrixA(2, l)) Next l For m = 0 To 3 MatrixA(3, m) = Val(Text3(m).Text) Text5.Text = Str$(MatrixA(3, m)) Next m For n = 0 To 3 MatrixA(4, n) = Val(Text4(n).Text) Text5.Text = Str$(MatrixA(4, n)) Next n For a = 0 To 3 For b = 0 To 3 For c = 0 To 3 For d = 0 To 3 If (a <> b And a <> c And a <> d And b <> c And b <> d And c <> d) Then p(0) = a p(1) = b p(2) = c p(3) = d t = 0 '计算每一项的逆序数t For i = 0 To 3 For j = i + 1 To 3 If (p(i) > p(j)) Then t = t + 1 End If Next j Next i tt = (-1) ^ t product = tt * MatrixA(1, a) * MatrixA(2, b) * MatrixA(3, c) * MatrixA(4, d) sum = sum + product End If Next d Next c Next b Next a Text5.Text = Str$(sum) End Sub Private Sub Command2_Click() Dim i As Integer For i = 0 To 3 Step 1 Text1(i).Text = "0" Text2(i).Text = "0" Text3(i).Text = "0" Text4(i).Text = "0" Next i End Sub Private Sub Form_Load() Dim i As Integer For i = 0 To 3 Step 1 Text1(i).Text = "0" Text2(i).Text = "0" Text3(i).Text = "0" Text4(i).Text = "0" Next i End Sub |
相关文章推荐
- (c++)设圆半径r,圆柱高h 求圆周长C1、圆面积Sa、圆球表面积Sb、圆球体积Va、圆柱体积Vb。 用scanf输入数据,输出计算结果,输出时要求文字说明,取小数点后两位数字。请编程序。 PI=3
- 用VB计算PI精确数值到30000位的程序代码。
- 设计vb程序计算税率
- 求助,用VB编写个计算程序 高手解答
- VB.net | 如何在程序中执行用户脚本以及进行代数式计算
- 递归程序的时间复杂度计算
- 递归程序复杂度计算->主定理
- 15 电气 郄慧敏 vb 作业 循环程序计算10个随机数的和
- C++递归方法计算n阶行列式
- 计算结果总是100的程序
- 迭代和递归计算分数
- C语言如何 计算程序运行时间?
- 计算Fibonacci数,循环和递归
- 用VB编写键盘拦截程序
- VB 程序设计参考
- C/C++中如何计算程序运行的时间
- python编写一个计算小程序-学习笔记8
- 用C++编写递归函数GetPower(int x,int y)计算x的y次幂,在同一程序里中针对整型和实型实现两个重载的函数;在主程序中实现输入输出
- 一个计算电脑屏幕宽高的Python程序
- 计算一段程序的运行时间