由于vb6.0中没有提供复数计算的相关api,但若设计一个辅助科学计算的程序,复数计算功能是必不可少的,以下为源码,将其封装进一个模块中,方便全局调用。以下代码仅供交流学习。
一、代码实现
1、定义类型
自定义了一个复数类型,A 表示实部,B 表示虚部;
2、定义类型转换函数
分别定义“string → Imaginary”和“Imaginary → string”的类型互转函数,这段代码是基于“a+bi”的复数格式对字符串进行拆解分析的,可能有很多不够完善的地方,如果小伙伴有更好的思路欢迎一起交流~
3、编写计算函数
实现复数四则运算和部分常用运算,考虑复数平方根的两个解,这里并没有返回两个解的数组,如有需要,可以修改成返回解的数组。
Public Type Imaginary '定义复数类型
A As Double '实部
B As Double '虚部
End Type
Public Function StrToIma(s As String) As Imaginary '字符串转成复数
Dim pos As Integer '正号出现索引+1(位数)
Dim neg As Integer '负号出现索引+1(位数)
If InStr(s, "+") = 1 Then s = right(s, Len(s) - 1) '去掉实部的正号
pos = InStr(s, "+")
neg = InStr(s, "-")
If pos > 1 Then 'a+bi 或 -a+bi 的情况
s = Replace(s, "I", "", 1, -1, 1)
Dim n1() As String
n1() = Split(s, "+")
StrToIma.A = CDbl(n1(0))
StrToIma.B = CDbl(n1(1))
ElseIf pos = 0 And neg > 1 Then 'a-bi 的情况
s = Replace(s, "I", "", 1, -1, 1)
Dim n2() As String
n1() = Split(s, "-")
StrToIma.A = CDbl(n1(0))
StrToIma.B = CDbl(n1(1)) * (-1)
ElseIf pos = 0 And neg = 1 Then '-a-bi 的情况
s = right(s, Len(s) - 1) '去掉开头的负号
s = Replace(s, "I", "", 1, -1, 1)
Dim n3() As String
n1() = Split(s, "-")
StrToIma.A = CDbl(n1(0)) * (-1)
StrToIma.B = CDbl(n1(1)) * (-1)
End If
End Function
Public Function ImaToStr(i As Imaginary) As String '复数转成字符串
If i.B < 0 Then
ImaToStr = CStr(i.A) & CStr(i.B) & "i"
Else
ImaToStr = CStr(i.A) & "+" & CStr(i.B) & "i"
End If
End Function
Public Function ImaAdd(X As Imaginary, Y As Imaginary) As Imaginary '复数加法
ImaAdd.A = X.A + Y.A
ImaAdd.B = X.B + Y.B
End Function
Public Function ImaSub(X As Imaginary, Y As Imaginary) As Imaginary '复数减法
ImaSub.A = X.A - Y.A
ImaSub.B = X.B - Y.B
End Function
Public Function ImaMul(X As Imaginary, Y As Imaginary) As Imaginary '复数相乘
ImaMul.A = X.A * Y.A - X.B * Y.B
ImaMul.B = X.A * Y.B + X.B * Y.A
End Function
Public Function ImaMulReal(X As Imaginary, Y As Double) As Imaginary '复数乘实数
ImaMulReal.A = X.A * Y
ImaMulReal.B = X.B * Y
End Function
Public Function ImaAddReal(X As Imaginary, Y As Double) As Imaginary '复数加实数
ImaAddReal.A = X.A + Y
ImaAddReal.B = X.B
End Function
Public Function ImaDiv(X As Imaginary, Y As Imaginary) As Imaginary '复数除法
Dim down As Double
down = Y.A ^ 2 + Y.B ^ 2
ImaDiv.A = (X.A * Y.A + X.B * Y.B) / down
ImaDiv.B = (X.B * Y.A - X.A * Y.B) / down
End Function
Public Function ImaMo(X As Imaginary) As Double '复数求模
ImaMo = Sqr(X.A ^ 2 + X.B ^ 2)
End Function
Public Function ImaFu(X As Imaginary) As Double '复数幅角
ImaFu = Atn(X.B / X.A)
End Function
Public Function ImaSqrtA(X As Imaginary) As Imaginary '复数平方根(代数)A根
ImaSqrtA.A = Sqr((ImaMo(X) + X.A) / 2)
ImaSqrtA.B = Sqr((ImaMo(X) - X.A) / 2)
If X.B < 0 Then ImaSqrtA.A = ImaSqrtA.A * (-1)
End Function
Public Function ImaSqrtB(X As Imaginary) As Imaginary '复数平方根(代数)B根
ImaSqrtB.A = Sqr((ImaMo(X) + X.A) / 2)
ImaSqrtB.B = Sqr((ImaMo(X) - X.A) / 2)
If X.B < 0 Then ImaSqrtB.B = ImaSqrtB.B * (-1)
End Function
Public Function ImaII(X As Imaginary) As Imaginary '乘以复数单位
ImaII.A = X.B * (-1)
ImaII.B = X.A
End Function
Public Function ImaTanh(X As Imaginary) As Imaginary '复数的双曲正切
Dim ez As Imaginary
Dim e_z As Imaginary
ez.A = Exp(X.A) * Cos(X.B)
ez.B = Exp(X.A) * Sin(X.B)
e_z.A = Exp(X.A * (-1)) * Cos(X.B * (-1))
e_z.B = Exp(X.A * (-1)) * Sin(X.B * (-1))
ImaTanh = ImaDiv(ImaSub(ez, e_z), ImaAdd(ez, e_z))
End Function
二、计算调试
为方便测试,可以在 Form_Load() 过程中调用 MsgBox 弹出结果,这里采用的界面化,测试复数加法的代码如下:
Private Sub Command1_Click()
Text3 = ImaToStr(ImaAdd(StrToIma(Text1), StrToIma(Text2)))
End Sub
这里绘制了3个 TextBox 组件和1个计算按钮,在参数1和参数2中输入两个复数,结果打印在下方,执行复数的加法计算,如下图所示:
实现复数计算时,需要注意的是代码全部都是函数的嵌套,容易混淆,如有更高效直观的实现方法欢迎交流讨论,另外如有兴趣可以依据上述代码实现一个复数计算器程序。