vb6.0实现复数计算

由于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中输入两个复数,结果打印在下方,执行复数的加法计算,如下图所示:

实现复数计算时,需要注意的是代码全部都是函数的嵌套,容易混淆,如有更高效直观的实现方法欢迎交流讨论,另外如有兴趣可以依据上述代码实现一个复数计算器程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌上初荷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值