Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CALCUL DE NOMBRES COMPLEXES, À L'AIDE D'UNE STRUCTURE SIMPLE, SURCHARGE DES OPÉRATEURS COURANTS ET CONVERSIONS IMPLICITES


Information sur la source

Catégorie :Maths Source .NET ( DotNet ) Classé sous : structure, nombre, complexe, surcharge, operateur Niveau : Expert Date de création : 19/03/2007 Date de mise à jour : 02/05/2007 11:15:53 Vu : 10 578

Note :
Aucune note

Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note


Description

Voici transposé en VB ce qui je suppose existe depuis longtemps dans d'autres langages objets... la création d'un type de donnée complexe, qui permet les opérations (+ - / *) comparaison (= <> > <) et conversions de base (string, entier si possible)  implicites. l'utilisation évidente:

Dim X as new complexe(1, 2), Y as new complexe(3, 4)
Dim C as complexe = X + Y ' opération de 2 complexes
msgbox C ' conversion implicite vers String de la forme a+i*b

en prime quelques propriétés simples (partie réelle, imaginaire, module, argument, etc).
 

Source

  • Public Class Complexe
  • Implements IEquatable(Of Complexe), IFormattable, IComparable(Of Complexe)
  • Private m_Reelle As Double ' partie réelle
  • Private m_Imaginaire As Double ' partie imaginaire
  • ' initialisation par défaut
  • Public Shared ReadOnly Empty As Complexe = New Complexe(0, 0)
  • Public Shared ReadOnly i As Complexe = New Complexe(0, 1)
  • ''' <summary>
  • ''' initialisation à partir d'une chaine de caractère de la forme a + ib => (a, b)
  • ''' </summary>
  • ''' <param name="cplx">complexe litéral de la forme a+ib</param>
  • ''' <remarks></remarks>
  • Public Sub New(ByVal cplx As String)
  • Dim aNeg As Boolean
  • Dim str_Reel As String = "0", str_Im As String = "0"
  • cplx = cplx.Trim
  • If cplx(0) = "-" Then aNeg = True
  • If aNeg Or cplx(0) = "+" Then cplx = cplx.Remove(0, 1)
  • If cplx.IndexOf("+") <> -1 Then ' a + ib
  • str_Reel = cplx.Substring(0, cplx.IndexOf("+"))
  • str_Im = cplx.Substring(cplx.IndexOf("+"))
  • ElseIf cplx.IndexOf("-") <> -1 Then ' a - ib
  • str_Reel = cplx.Substring(1, cplx.IndexOf("-") - 1)
  • str_Im = cplx.Substring(cplx.IndexOf("-"))
  • ElseIf cplx.IndexOf("i") = -1 Then 'réel pur
  • str_Reel = cplx
  • Else ' imaginaire pur
  • str_Im = cplx
  • End If
  • m_Reelle = IIf(aNeg, -Val(str_Reel), Val(str_Reel))
  • str_Im = str_Im.Replace("i", "").Replace("*", "")
  • m_Imaginaire = Val(str_Im)
  • End Sub
  • ''' <summary>
  • ''' initialisation usuelle (partie réelle, partie imaginaire)
  • ''' </summary>
  • ''' <param name="entierA">partie réelle</param>
  • ''' <param name="imaginaireA">partie imaginaire</param>
  • Public Sub New(ByVal entierA As Double, ByVal imaginaireA As Double)
  • m_Reelle = entierA
  • m_Imaginaire = imaginaireA
  • End Sub
  • #Region "Propriétés (partie réelle imaginaire etc)"
  • ''' <summary>
  • ''' Partie réelle du nombre complexe
  • ''' </summary>
  • Public Property Reel() As Double
  • Get
  • Return m_Reelle
  • End Get
  • Set(ByVal value As Double)
  • m_Reelle = value
  • End Set
  • End Property
  • ''' <summary>
  • ''' partie imaginaire du complexe
  • ''' </summary>
  • Public Property Imaginaire() As Double
  • Get
  • Return m_Imaginaire
  • End Get
  • Set(ByVal value As Double)
  • m_Imaginaire = value
  • End Set
  • End Property
  • ''' <summary>
  • ''' Rotation avec un angle et un autre nombre complexe
  • ''' </summary>
  • ''' <param name="angle">angle de rotation en radians</param>
  • ''' <param name="centre">centre de la rotation (complexe)</param>
  • ''' <value></value>
  • Public ReadOnly Property Rotation(ByVal angle As Double, ByVal centre As Complexe) As Complexe
  • Get
  • Return (((Me - centre) * (New Complexe(Math.Cos(angle), Math.Sin(angle)))) + centre)
  • End Get
  • End Property
  • ''' <summary>
  • ''' Conjugué du complexe (a-ib)
  • ''' </summary>
  • ''' <returns>a-ib</returns>
  • Public ReadOnly Property Conjugue() As Complexe
  • Get
  • Return New Complexe(Me.m_Reelle, (-Me.m_Imaginaire))
  • End Get
  • End Property
  • ''' <summary>
  • ''' Module du complexe
  • ''' </summary>
  • ''' <value></value>
  • ''' <returns>racine(a²+b²)</returns>
  • Public ReadOnly Property [Module]() As Double
  • Get
  • Return Math.Sqrt(Me.m_Reelle ^ 2 + Me.m_Imaginaire ^ 2)
  • End Get
  • End Property
  • ''' <summary>
  • ''' Argument du complexe (arctan(imaginaire/reelle))
  • ''' </summary>
  • ''' <value></value>
  • ''' <returns>arcTan(b/a)</returns>
  • Public ReadOnly Property Argument() As Double
  • Get
  • Return Math.Atan(Me.m_Imaginaire / Me.m_Reelle)
  • End Get
  • End Property
  • ''' <summary>
  • ''' Carré du complexe ( Reel² - Img² ) / ( 2 Reel Img )
  • ''' </summary>
  • ''' <value></value>
  • ''' <returns>(a²-b²)/(2ab)</returns>
  • ''' <remarks></remarks>
  • Public ReadOnly Property Carre() As Complexe
  • Get
  • Return New Complexe((Me.m_Reelle ^ 2 - Me.m_Imaginaire ^ 2), (2 * Me.m_Reelle * Me.m_Imaginaire))
  • End Get
  • End Property
  • #End Region
  • #Region "surcharge des opérateurs"
  • Public Shared Operator +(ByVal c1 As Complexe, ByVal c2 As Complexe) As Complexe
  • Return New Complexe(c1.Reel + c2.Reel, c1.Imaginaire + c2.Imaginaire)
  • End Operator
  • Public Shared Operator -(ByVal c1 As Complexe, ByVal c2 As Complexe) As Complexe
  • Return New Complexe(c1.Reel - c2.Reel, c1.Imaginaire - c2.Imaginaire)
  • End Operator
  • Public Shared Operator *(ByVal c1 As Complexe, ByVal c2 As Complexe) As Complexe
  • Return (New Complexe(((c1.Reel * c2.Reel) - (c1.Imaginaire * c2.Imaginaire)), ((c1.Reel * c2.Imaginaire) + (c2.Reel * c1.Imaginaire))))
  • End Operator
  • Public Shared Operator /(ByVal c1 As Complexe, ByVal c2 As Complexe) As Complexe
  • Dim bgModule As BigInt = c2.Reel ^ 2 + c2.Imaginaire ^ 2
  • Return New Complexe( _
  • (c1.Reel * c2.Reel - c1.Imaginaire * c2.Imaginaire) / bgModule, _
  • (c1.Reel * -c2.Imaginaire + c2.Reel * c1.Imaginaire) / bgModule)
  • End Operator
  • Public Shared Operator -(ByVal c1 As Complexe) As Complexe ' opérateur unitaire!
  • Return New Complexe(-c1.Reel, -c1.Imaginaire)
  • End Operator
  • ''' <summary>
  • ''' opérateur d'égalité complexe: C1(a1, b1)=C2(a2, b2) vrai si a1=a2 et b1=b2
  • ''' </summary>
  • ''' <param name="a"></param>
  • ''' <param name="b"></param>
  • ''' <returns>boolean</returns>
  • ''' <remarks>l'opérateur = implique l'opérateur <></remarks>
  • Public Shared Operator =(ByVal a As Complexe, ByVal b As Complexe) As Boolean
  • If (a.Reel = b.Reel AndAlso a.Imaginaire = b.Imaginaire) Then Return True
  • Return False
  • End Operator
  • Public Shared Operator <>(ByVal a As Complexe, ByVal b As Complexe) As Boolean
  • Return Not a = b
  • End Operator
  • ''' <summary>
  • ''' Opérateurs simulant la comparaison de 2 complexes
  • ''' </summary>
  • ''' <param name="a"></param>
  • ''' <param name="b"></param>
  • ''' <returns></returns>
  • ''' <remarks>AVERTISSEMENT /!\ les opérateurs de comparaison ci-dessous sont indiqué à titre d'exemple de programmation. Leur validité mathématique est NULLE, on ne peut PAS comparer 2 nombres complexes.</remarks>
  • Public Shared Operator >(ByVal a As Complexe, ByVal b As Complexe) As Boolean
  • If (a.Reel > b.Reel AndAlso a.Imaginaire >= b.Imaginaire) Then Return True
  • Return False
  • End Operator
  • ' les autres comparaisons 'pourraient' être déduites de la précédente selon la logique des nombres réels
  • ' il suffit de faire attention à ne pas induire de récursivité.
  • Public Shared Operator <(ByVal a As Complexe, ByVal b As Complexe) As Boolean
  • Return Not (a > b OrElse a = b)
  • End Operator
  • Public Shared Operator >=(ByVal a As Complexe, ByVal b As Complexe) As Boolean
  • Return a > b OrElse a = b
  • End Operator
  • Public Shared Operator <=(ByVal a As Complexe, ByVal b As Complexe) As Boolean
  • Return Not a > b
  • End Operator
  • #End Region
  • #Region "Conversions explicites et implicites"
  • ''' <summary>
  • ''' conversion implicite, double => complexe, automatique et sans perte de données
  • ''' </summary>
  • ''' <param name="a"></param>
  • ''' <returns></returns>
  • ''' <remarks></remarks>
  • Public Shared Widening Operator CType(ByVal a As Long) As Complexe
  • Return New Complexe(a, 0)
  • End Operator
  • ''' <summary>
  • ''' conversion implicite, Long => complexe, automatique et sans perte de données
  • ''' </summary>
  • ''' <param name="a"></param>
  • ''' <returns></returns>
  • ''' <remarks></remarks>
  • Public Shared Widening Operator CType(ByVal a As Double) As Complexe
  • Return New Complexe(a, 0)
  • End Operator
  • ''' <summary>
  • ''' conversion implicite String => complexe !
  • ''' </summary>
  • ''' <param name="a"></param>
  • ''' <returns></returns>
  • ''' <remarks></remarks>
  • Public Shared Widening Operator CType(ByVal a As String) As Complexe
  • Return New Complexe(a)
  • End Operator
  • ''' <summary>
  • ''' conversion explicite Complexe => BigInt (avertissement éventuel)
  • ''' </summary>
  • ''' <param name="c"></param>
  • ''' <returns></returns>
  • ''' <remarks></remarks>
  • Public Shared Narrowing Operator CType(ByVal c As Complexe) As Double
  • If c.Imaginaire <> 0 Then Throw New ArgumentException("Conversion impossible")
  • Return c.Reel
  • End Operator
  • ''' <summary>
  • ''' conversion explicite Complexe => String
  • ''' </summary>
  • ''' <param name="c"></param>
  • ''' <returns></returns>
  • ''' <remarks></remarks>
  • Public Shared Widening Operator CType(ByVal c As Complexe) As String
  • Return c.Reel & IIf(Math.Sign(c.Imaginaire) <> 0, IIf(Math.Sign(c.Imaginaire) > 0, "+", "-") & _
  • "i" & IIf(Math.Sign(c.Imaginaire) <> 1, Math.Abs(c.Imaginaire), ""), "")
  • End Operator
  • ''' <summary>
  • ''' conversion en string
  • ''' </summary>
  • ''' <returns></returns>
  • ''' <remarks></remarks>
  • Overloads Function ToString() As String
  • Dim strResult As String = ""
  • If Me.m_Reelle <> 0 Then strResult = Convert.ToString(Me.m_Reelle)
  • If Me.m_Imaginaire = 1 Then
  • Return strResult & "+i"
  • ElseIf Me.m_Imaginaire = -1 Then
  • Return strResult & "-i"
  • ElseIf Me.m_Imaginaire > 0 Then
  • Return strResult & "+i*" & Math.Abs(Me.m_Imaginaire)
  • ElseIf Me.m_Imaginaire < 0 Then
  • Return strResult & "-i*" & Math.Abs(Me.m_Imaginaire)
  • ElseIf Me.m_Reelle <> 0 Then
  • Return strResult
  • Else
  • Return "0"
  • End If
  • End Function
  • ''' <summary>
  • ''' interface de comparaison implémtenté bien que les complexes ne peuvent pas être comparés /!\ (à titre d'exemple donc)
  • ''' </summary>
  • ''' <param name="c"></param>
  • ''' <returns></returns>
  • ''' <remarks></remarks>
  • Public Overloads Function CompareTo(ByVal c As Complexe) As Integer Implements IComparable(Of Complexe).CompareTo
  • If c > Me Then Return 1 Else If c = Me Then Return 0 Else Return -1
  • End Function
  • Public Overloads Function Equals(ByVal c As Complexe) As Boolean Implements IEquatable(Of Complexe).Equals
  • Return Me = c
  • End Function
  • Public Overloads Function ToString(ByVal format As String, ByVal iformat As IFormatProvider) As String Implements IFormattable.ToString
  • Return ""
  • End Function
  • #End Region
  • End Class
Public Class Complexe
    Implements IEquatable(Of Complexe), IFormattable, IComparable(Of Complexe)

    Private m_Reelle As Double      ' partie réelle
    Private m_Imaginaire As Double  ' partie imaginaire
    ' initialisation par défaut
    Public Shared ReadOnly Empty As Complexe = New Complexe(0, 0)
    Public Shared ReadOnly i As Complexe = New Complexe(0, 1)

    ''' <summary>
    ''' initialisation à partir d'une chaine de caractère de la forme a + ib => (a, b)
    ''' </summary>
    ''' <param name="cplx">complexe litéral de la forme a+ib</param>
    ''' <remarks></remarks>
    Public Sub New(ByVal cplx As String)
        Dim aNeg As Boolean
        Dim str_Reel As String = "0", str_Im As String = "0"

        cplx = cplx.Trim
        If cplx(0) = "-" Then aNeg = True
        If aNeg Or cplx(0) = "+" Then cplx = cplx.Remove(0, 1)

        If cplx.IndexOf("+") <> -1 Then ' a + ib
            str_Reel = cplx.Substring(0, cplx.IndexOf("+"))
            str_Im = cplx.Substring(cplx.IndexOf("+"))

        ElseIf cplx.IndexOf("-") <> -1 Then  ' a - ib
            str_Reel = cplx.Substring(1, cplx.IndexOf("-") - 1)
            str_Im = cplx.Substring(cplx.IndexOf("-"))

        ElseIf cplx.IndexOf("i") = -1 Then  'réel pur 

            str_Reel = cplx
        Else ' imaginaire pur
            str_Im = cplx
        End If

        m_Reelle = IIf(aNeg, -Val(str_Reel), Val(str_Reel))
        str_Im = str_Im.Replace("i", "").Replace("*", "")
        m_Imaginaire = Val(str_Im)

    End Sub

    ''' <summary>
    ''' initialisation usuelle (partie réelle, partie imaginaire)
    ''' </summary>
    ''' <param name="entierA">partie réelle</param>
    ''' <param name="imaginaireA">partie imaginaire</param>
    Public Sub New(ByVal entierA As Double, ByVal imaginaireA As Double)
        m_Reelle = entierA
        m_Imaginaire = imaginaireA
    End Sub

#Region "Propriétés (partie réelle imaginaire etc)"
    ''' <summary>
    ''' Partie réelle du nombre complexe
    ''' </summary>
    Public Property Reel() As Double
        Get
            Return m_Reelle
        End Get
        Set(ByVal value As Double)
            m_Reelle = value
        End Set
    End Property
    ''' <summary>
    ''' partie imaginaire du complexe
    ''' </summary>
    Public Property Imaginaire() As Double
        Get
            Return m_Imaginaire
        End Get
        Set(ByVal value As Double)
            m_Imaginaire = value
        End Set
    End Property

    ''' <summary>
    ''' Rotation avec un angle et un autre nombre complexe
    ''' </summary>
    ''' <param name="angle">angle de rotation en radians</param>
    ''' <param name="centre">centre de la rotation (complexe)</param>
    ''' <value></value>
    Public ReadOnly Property Rotation(ByVal angle As Double, ByVal centre As Complexe) As Complexe
        Get
            Return (((Me - centre) * (New Complexe(Math.Cos(angle), Math.Sin(angle)))) + centre)
        End Get
    End Property

    ''' <summary>
    ''' Conjugué du complexe (a-ib)
    ''' </summary>
    ''' <returns>a-ib</returns>
    Public ReadOnly Property Conjugue() As Complexe
        Get
            Return New Complexe(Me.m_Reelle, (-Me.m_Imaginaire))
        End Get
    End Property

    ''' <summary>
    ''' Module du complexe
    ''' </summary>
    ''' <value></value>
    ''' <returns>racine(a²+b²)</returns>
    Public ReadOnly Property [Module]() As Double
        Get
            Return Math.Sqrt(Me.m_Reelle ^ 2 + Me.m_Imaginaire ^ 2)
        End Get
    End Property

    ''' <summary>
    ''' Argument du complexe (arctan(imaginaire/reelle))
    ''' </summary>
    ''' <value></value>
    ''' <returns>arcTan(b/a)</returns>
    Public ReadOnly Property Argument() As Double
        Get
            Return Math.Atan(Me.m_Imaginaire / Me.m_Reelle)
        End Get
    End Property

    ''' <summary>
    ''' Carré du complexe ( Reel² - Img² ) / ( 2 Reel Img )
    ''' </summary>
    ''' <value></value>
    ''' <returns>(a²-b²)/(2ab)</returns>
    ''' <remarks></remarks>
    Public ReadOnly Property Carre() As Complexe
        Get
            Return New Complexe((Me.m_Reelle ^ 2 - Me.m_Imaginaire ^ 2), (2 * Me.m_Reelle * Me.m_Imaginaire))
        End Get
    End Property

#End Region

#Region "surcharge des opérateurs"
    Public Shared Operator +(ByVal c1 As Complexe, ByVal c2 As Complexe) As Complexe
        Return New Complexe(c1.Reel + c2.Reel, c1.Imaginaire + c2.Imaginaire)
    End Operator
    Public Shared Operator -(ByVal c1 As Complexe, ByVal c2 As Complexe) As Complexe
        Return New Complexe(c1.Reel - c2.Reel, c1.Imaginaire - c2.Imaginaire)
    End Operator
    Public Shared Operator *(ByVal c1 As Complexe, ByVal c2 As Complexe) As Complexe
        Return (New Complexe(((c1.Reel * c2.Reel) - (c1.Imaginaire * c2.Imaginaire)), ((c1.Reel * c2.Imaginaire) + (c2.Reel * c1.Imaginaire))))
    End Operator
    Public Shared Operator /(ByVal c1 As Complexe, ByVal c2 As Complexe) As Complexe
        Dim bgModule As BigInt = c2.Reel ^ 2 + c2.Imaginaire ^ 2
        Return New Complexe( _
            (c1.Reel * c2.Reel - c1.Imaginaire * c2.Imaginaire) / bgModule, _
            (c1.Reel * -c2.Imaginaire + c2.Reel * c1.Imaginaire) / bgModule)
    End Operator
    Public Shared Operator -(ByVal c1 As Complexe) As Complexe ' opérateur unitaire! 
        Return New Complexe(-c1.Reel, -c1.Imaginaire)
    End Operator

    ''' <summary>
    ''' opérateur d'égalité complexe: C1(a1, b1)=C2(a2, b2) vrai si a1=a2 et b1=b2
    ''' </summary>
    ''' <param name="a"></param>
    ''' <param name="b"></param>
    ''' <returns>boolean</returns>
    ''' <remarks>l'opérateur = implique l'opérateur <></remarks>
    Public Shared Operator =(ByVal a As Complexe, ByVal b As Complexe) As Boolean
        If (a.Reel = b.Reel AndAlso a.Imaginaire = b.Imaginaire) Then Return True
        Return False
    End Operator
    Public Shared Operator <>(ByVal a As Complexe, ByVal b As Complexe) As Boolean
        Return Not a = b
    End Operator

    ''' <summary>
    ''' Opérateurs simulant la comparaison de 2 complexes
    ''' </summary>
    ''' <param name="a"></param>
    ''' <param name="b"></param>
    ''' <returns></returns>
    ''' <remarks>AVERTISSEMENT /!\  les opérateurs de comparaison ci-dessous sont indiqué à titre d'exemple de programmation. Leur validité mathématique est NULLE, on ne peut PAS comparer 2 nombres complexes.</remarks>
    Public Shared Operator >(ByVal a As Complexe, ByVal b As Complexe) As Boolean
        If (a.Reel > b.Reel AndAlso a.Imaginaire >= b.Imaginaire) Then Return True
        Return False
    End Operator
    ' les autres comparaisons 'pourraient' être déduites de la précédente selon la logique des nombres réels
    ' il suffit de faire attention à ne pas induire de récursivité.
    Public Shared Operator <(ByVal a As Complexe, ByVal b As Complexe) As Boolean
        Return Not (a > b OrElse a = b)
    End Operator
    Public Shared Operator >=(ByVal a As Complexe, ByVal b As Complexe) As Boolean
        Return a > b OrElse a = b
    End Operator
    Public Shared Operator <=(ByVal a As Complexe, ByVal b As Complexe) As Boolean
        Return Not a > b
    End Operator

#End Region

#Region "Conversions explicites et implicites"

    ''' <summary>
    ''' conversion implicite, double => complexe, automatique et sans perte de données
    ''' </summary>
    ''' <param name="a"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Widening Operator CType(ByVal a As Long) As Complexe
        Return New Complexe(a, 0)
    End Operator
    ''' <summary>
    ''' conversion implicite, Long => complexe, automatique et sans perte de données
    ''' </summary>
    ''' <param name="a"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Widening Operator CType(ByVal a As Double) As Complexe
        Return New Complexe(a, 0)
    End Operator
    ''' <summary>
    ''' conversion implicite String => complexe !
    ''' </summary>
    ''' <param name="a"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Widening Operator CType(ByVal a As String) As Complexe
        Return New Complexe(a)
    End Operator

    ''' <summary>
    ''' conversion explicite Complexe => BigInt (avertissement éventuel)
    ''' </summary>
    ''' <param name="c"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Narrowing Operator CType(ByVal c As Complexe) As Double
        If c.Imaginaire <> 0 Then Throw New ArgumentException("Conversion impossible")
        Return c.Reel
    End Operator
    ''' <summary>
    ''' conversion explicite Complexe => String
    ''' </summary>
    ''' <param name="c"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Widening Operator CType(ByVal c As Complexe) As String
        Return c.Reel & IIf(Math.Sign(c.Imaginaire) <> 0, IIf(Math.Sign(c.Imaginaire) > 0, "+", "-") & _
            "i" & IIf(Math.Sign(c.Imaginaire) <> 1, Math.Abs(c.Imaginaire), ""), "")
    End Operator

    ''' <summary>
    ''' conversion en string
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Overloads Function ToString() As String
        Dim strResult As String = ""
        If Me.m_Reelle <> 0 Then strResult = Convert.ToString(Me.m_Reelle)
        If Me.m_Imaginaire = 1 Then
            Return strResult & "+i"
        ElseIf Me.m_Imaginaire = -1 Then
            Return strResult & "-i"
        ElseIf Me.m_Imaginaire > 0 Then
            Return strResult & "+i*" & Math.Abs(Me.m_Imaginaire)
        ElseIf Me.m_Imaginaire < 0 Then
            Return strResult & "-i*" & Math.Abs(Me.m_Imaginaire)
        ElseIf Me.m_Reelle <> 0 Then
            Return strResult
        Else
            Return "0"
        End If
    End Function

    ''' <summary>
    ''' interface de comparaison implémtenté bien que les complexes ne peuvent pas être comparés /!\ (à titre d'exemple donc)
    ''' </summary>
    ''' <param name="c"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overloads Function CompareTo(ByVal c As Complexe) As Integer Implements IComparable(Of Complexe).CompareTo
        If c > Me Then Return 1 Else If c = Me Then Return 0 Else Return -1
    End Function

    Public Overloads Function Equals(ByVal c As Complexe) As Boolean Implements IEquatable(Of Complexe).Equals
        Return Me = c
    End Function

    Public Overloads Function ToString(ByVal format As String, ByVal iformat As IFormatProvider) As String Implements IFormattable.ToString
        Return ""
    End Function

#End Region

End Class

Conclusion

C'est typiquement un exercice pour créer une nouvelle structure de données (j'espère que les formules mathématiques sont quand même correctes car mes années d'étude sont déjà loin, n'hésitez pas à me reprendre à ce sujet!)

La conversion String => complexe est un peu à l'arrache, il faut impérativement une chaine "a+i*b" ou "a+ib" ... par exemple "i+1" ou "4-3*i+1" ça passera pas, j'ai pas fais un algo de calcul formel non plus...

Pour continuer sur l'étude des structures je voudrais implémenter les interfaces! Si vous avez de l'aide à ce sujet (msdn ne m'a pas aidé). C'est le commentaire en 1ere ligne:
    'Implements IComparable, IConvertible, IEquatable(Of Complexe), IFormattable, IComparable(Of Long)

Quand j'en aurais terminé avec les complexes je ferais la même choses avec les BigNum les nombres 'infini' pour dépasser les limitations des long et double. Toute suggestion bienvenue, merci!
 

Historique

02 mai 2007 11:15:53 :
Ajout des interfaces IEquatable(Of Complexe), IFormattable, IComparable(Of Complexe) (cette dernière étant mathématiquement invalide, mais juste pour l'exemple) ainsi que les conversions implicites (Public Shared Widening Operator CType(ByVal a As Long) As Complexe ...) Ceci nous permet de faire des opérations sur 2 types différents (Long + Complexe, Double + Complexe) le tout est automatiquement et implicitement converti en complexe.

Commentaires et avis

signaler à un administrateur
Commentaire de Willi le 19/03/2007 19:12:25 administrateur CS

Excellente démonstration de la surchage d'opérateur et des conversions explicit de types !!!
Bonne continuaton ++

signaler à un administrateur
Commentaire de MadM@tt le 19/03/2007 21:28:01

Oui c'est très interessant, la surcharge des opérateurs à l'air beaucoup plus simple en .Net qu'en VB6 (cf une source de Renfield ou EbArtSoft je crois)
Par contre l'espace complexe ne contient pas de relations de comparaisons : > ou <

signaler à un administrateur
Commentaire de Patrice99 le 20/03/2007 08:34:18

Super ! si tu arrives à implémenter IComparable, cela servira par exemple à faire des tris via un comparateur universel multi-clé (qui existe déjà). Ce qui serait bien aussi, c'est une classe en précision infinie : dans le constructeur, on indique simplement la précision souhaitée (pratique pour le calcul haute précision, par exemple un zoom infini sur les images fractales).

signaler à un administrateur
Commentaire de NHenry le 20/03/2007 10:26:26

Intéressant, Pour les membres accessibles par les utilisateurs (propriétés et méthodes), utilise ''' (3') pour la doc, cela permettra de connaitre des infos par des infos bulles (comme pour le reste du framwork).

En .NET2, c'est mis dans l'EDI, en .NET1, il te faut VBCommenter.

signaler à un administrateur
Commentaire de pifou25 le 20/03/2007 11:39:10

Ha! j'en apprend une bonne, ainsi on ne peut pas valider mathématiquement ma pseudo-comparaison des complexes... domage! Je vais laisser tomber pour l'interface IComparable alors en attendant qu'un matheux définisse un jour une relation de comparaison ^^

Par contre Patrice, j'ai bien l'intention de faire une classe BigNum des chiffres à précision infinie, et ensuite il sera tout simple d'utiliser pour nos complexes cette structure BigNum.
J'ai trouvé des algo de calcul matriciel sur CS, alors pourquoi pas aussi des calculs de matrices en complexes?

signaler à un administrateur
Commentaire de MadM@tt le 20/03/2007 13:38:37

Pifou > Ben oui, un nombre complexe est un couple de 2 réels : (a,b). Comment tu compare (1,4) et (3,2) par exemple ?

signaler à un administrateur
Commentaire de pifou25 le 21/03/2007 15:59:35

MadMatt > en effet tu a raison sur ce point. (je laisserais quand meme à titre d'exemple de programmation les comparaisons mais j'ajouterais en commentaire que c'est pas valide mathématiquement)

Je viens juste de réaliser un truc: pour que mes opérateurs soient valables dans tous les cas, je dois encore plus les surcharger, genre A as Complexe + B as Long, A as Complexe + B as Double... et pour la commutativité ajouter aussi A as Long + B as Complexe ... etc si je veux prendre en compte tous les types et ceci pour toutes les opérations ça va nous faire un paquet de surcharges!!

Autre question: quelqu'un sait comment qu'on éleve un complexe à une puissance? pour implémenter l'opérateur ^ ! il y a forcément une méthode mais je ne sais plus laquelle...

Je ferais bientot une mise à jour avec une nouvelle classe pour les BigInt!

signaler à un administrateur
Commentaire de Patrice99 le 21/03/2007 16:46:30

C'est indiqué ici :
http://fr.wikipedia.org/wiki/Nombre_complexe
Les nombres complexes ne peuvent pas avoir d'ordre.

Regarde d'abord à quoi servent les nombres complexes pour savoir ce qu'il est utile d'implémenter, à mon avis l'opérateur ^ ne sert pas à grand chose. Cependant, j'ai programmé les puissances 2, 3, 4 et 5 ici pour les images fractales :
http://patrice.dargenton.free.fr/fractal/FractalisSrc.html#228

Si tu utilises les génériques du DotNet2, normalement tu ne devrais pas avoir besoin de faire des surcharges pour chaque type (c'est justement l'intérêt de la chose).

signaler à un administrateur
Commentaire de pifou25 le 02/04/2007 16:25:46

Après de longues recherches sur les génériques j'ai (enfin!) compris leur intérêt: exemple de déclaration:
Public Structure Complexe(of monType)
ensuite dans toute la classe je remplace Int32 par monType (!) ainsi je déclare les nombres complexes comme une partie réelel et une partie imaginaire en type générique (qui pourrait être Int32 comme ici, ou long ou double ou bien même une classe BigNum... de précision infinie... on peut rêver)
Sauf que, comme je viens de l'apprendre ici ( http://www.osnews.com/story.php/7930/The-Problem-with-.NET-Generics ) on ne peut pas implémenter d'interface iarithmetic en VB.NET (ni non plus C# apparement) ce qui nous interdit toute opération entre 2 variables déclarées as monType. on pourra au mieux utiliser une interface de comparaison (aucun intérêt pour les complexes). Et ça n'est d'aucune utilité par rapport à la surcharge des opérateurs entre un complexe et un numérique autre (int long double etc).

signaler à un administrateur
Commentaire de Patrice99 le 03/04/2007 08:36:03

Autant pour moi donc, mais je vais continuer à suivre l'affaire, car je suis déjà persuadé que les génériques ne sont pas aussi inutiles que ça (j'ai déjà utilisé un comparateur universel assez pratique pour trier facilement sur plusieurs clés n'importe quel tableau ou liste, ou bien pour sérialiser/désérialiser en une ligne de code n'importe quelle structure de données sérialisable), mais j'avoue que je n'ai pas bien saisi pourquoi certains pensent que les génériques sont inutiles pour l'arithmétique.

signaler à un administrateur
Commentaire de pifou25 le 03/04/2007 12:07:37

De ce que j'ai compris, ils sont inutiles pour l'arithmétique parce qu'il n'existe pas d'interface Iarithmetic, (ou bien Iaddable + Isubstract + Imultipl + Idivise) et surtout on ne peut pas implémenter de tel interface car on ne peut pas ajouter les opérateurs dans les interfaces, aussi bien en VB que C#. Alors que apparement on peut le faire en C++, je devrais creuser la question mais je connais pas du tout C++.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Selection d'un nombre dans un textbox [ par pericles0 ] Bonsoir à tous !Je cherche à extraire nombre dans un textbox, qui contient des lettres, des nombres, ou les deux acollés (ex: Q403). Comment faire pou Expression régulière [ par tabarrant ] Bonjour,Voila j'ai un petit souci concernant l'expression d'un expression régulière, j'aimerais tester si une string est bien un nombre donc j'ai util nombre cellule non vide dans une colonne [ par akmer ] Bonjour,Quel formule permettrait de compter le nombre de cellule non vide dans la collone A de la feuille traitement?Merci d'avanceSa parrait tout bêt Sacré Wend ! [ par OlivesGT ] Cela fait longtemps que je parcours votre site ou j'ai trouvé plein de renseignements mais une fonction me résiste : While / Wend !Voici ce que je veu Combobox [ par faucheuse ] Bonjour tout le monde (osashiburi desuyo^^), J'utilise pour la premiere fois une combobox sous excel (en VBA) et je ne trouve pas comment ajouter des Connaitre le nombre de chiffres après la virgule d'un nombre [ par Dagry ] Bonjour à tous! je me tourne encore vers vous pour m'aider à résoudre un problème. J'aimerais savoir comment connaitre le nombre de chiffres après la Moyenne sur un echantillon aleatoire [ par Taeris ] Navre si la question a déjà ete posée auparavant, mais je n'ai rien réussi a trouver, étant donne la spécificité de ma demande ...Navre également pour Operateur dans string [ par kratosfever ] Bonjour, je travaille sous VB.net pro 2008J'ai deux variable : dim chainex as string                             dim valx as integer                   Structure TYPE [ par gmelapet ] BonjourJe souhaite faire une grosse structure TYPE avec un tableau de 512 octets.Mais etant donné qu il y a beaucoup de variables, je voudrais utilise Conversion de dates en nombre et inversement [ par mimo37 ] Bonjour à tous,Débutant en Visual Basic je me trouve confronté à un PB que je suis incapable de résoudre, mais qui je pense doit être simple pour un e


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,390 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.