' Gambas class file

Private $cZ1 As Complex
Private $cZ2 As Complex
Private $cResult As Complex

Public Sub Form_Open()

  FMain.Center
  FMain.Resizable = False
' txbInputComplex1.Clear
' txbInputComplex1.SetFocus ' Freischalten...

' http://de.wikipedia.org/wiki/Unicodeblock_Mathematische_Operatoren
  btnAddieren.Text = " Komplexe Zahlen addieren  " & String.Chr(8853) 
  btnSubtrahieren.Text = " Komplexe Zahlen subtrahieren  " & String.Chr(8854)
  btnMultilizieren.Text = " Komplexe Zahlen multiplizieren  " & String.Chr(8855)
  btnDividieren.Text = " Komplexe Zahlen dividieren  " & String.Chr(8856)
  
End ' Form_Open()

Public Sub btnConvert_Click()  

  ' If txbInputComplex1.Text Then 
  '    txbOutputComplex.Clear
  '    If IsComplex(txbInputComplex1.Text) = True Then
  '       txbOutputComplex.Text = ValComplex(txbInputComplex1.Text).ToString(True)
  '    Else
  '       Message.Error("Der Eingabe-String kann\nnicht\nals komplexe Zahl interpretiert werden!")
  '       txbInputComplex1.SetFocus
  '    Endif
  ' Endif ' txbInputComplex.Text

  If txbInputComplex1.Text Then 
     txbOutputComplex.Clear
     Try txbOutputComplex.Text = ValComplex(txbInputComplex1.Text).ToString(True)
         If Error Then
            Message.Error("Der Eingabe-String kann\nnicht\nals komplexe Zahl interpretiert werden!")
            txbInputComplex1.SetFocus
         Endif ' ERROR ?
  Endif ' txbInputComplex.Text

End ' btnConvert_Click()

Public Sub txbInputComplex1_Activate()
  btnConvert_Click()
End ' txbInputComplex_Activate()

Public Sub txbInputComplex1_KeyPress()
  CheckInput("+-,i0123456789")
End ' txbInputComplex_KeyPress()

Public Sub txbInputComplex2_KeyPress()
  CheckInput("+-,i0123456789")
End ' txbInputComplex2_KeyPress()

Public Sub btnIsComplex_Click()

  If txbInputComplex1.Text Then 
     If IsComplex(txbInputComplex1.Text) = True Then
        Message.Info("Der Eingabe-String kann als\nkomplexe Zahl\ninterpretiert werden!")
     Else
        Message.Error("Mindestens ein Eingabe-String kann\nnicht\nals komplexe Zahl interpretiert werden!")
        txbInputComplex1.SetFocus
     Endif ' IsComplex(txbInputComplex.Text) ?
  Endif ' txbInputComplex.Text ?
  
End ' btnIsComplex_Click()

Public Sub btnAddieren_Click()
  If txbInputComplex1.Text And txbInputComplex2.Text Then 
     If (IsComplex(txbInputComplex1.Text) = True) And (IsComplex(txbInputComplex2.Text) = True) Then
        $cZ1 = ValComplex(txbInputComplex1.Text)
        $cZ2 = ValComplex(txbInputComplex2.Text)
        $cResult = $cZ1 + $cZ2
        txbOutputComplex.Text = $cResult.ToString(True)
      ' txbOutputComplex.Text = $cResult.ToString()  ----> Ausgabe mit Punkt als Dezimaltrennzeichen
      ' txbOutputComplex.Text = (ValComplex(txbInputComplex1.Text) + ValComplex(txbInputComplex2.Text)).ToString(True)
     Else
        Message.Error("Mindestens ein Eingabe-String kann\nnicht\nals komplexe Zahl interpretiert werden!")
     Endif ' IsComplex(..) ?
  Endif ' InputComplex.Text ?
End ' btnAddieren_Click()

Public Sub btnSubtrahieren_Click()
  If txbInputComplex1.Text And txbInputComplex2.Text Then 
     If (IsComplex(txbInputComplex1.Text) = True) And (IsComplex(txbInputComplex2.Text) = True) Then
        $cZ1 = ValComplex(txbInputComplex1.Text)
        $cZ2 = ValComplex(txbInputComplex2.Text)
        $cResult = $cZ1 - $cZ2
        txbOutputComplex.Text = $cResult.ToString(True)
      ' txbOutputComplex.Text = (ValComplex(txbInputComplex1.Text) - ValComplex(txbInputComplex2.Text)).ToString(True)
     Else
        Message.Error("Mindestens ein Eingabe-String kann\nnicht\nals komplexe Zahl interpretiert werden!")
     Endif ' IsComplex(txbInputComplex.Text) ?
  Endif ' txbInputComplex.Text ?
End ' btnSubtrahieren_Click()

Public Sub btnMultilizieren_Click()
  If txbInputComplex1.Text And txbInputComplex2.Text Then 
     If (IsComplex(txbInputComplex1.Text) = True) And (IsComplex(txbInputComplex2.Text) = True) Then
        $cZ1 = ValComplex(txbInputComplex1.Text)
        $cZ2 = ValComplex(txbInputComplex2.Text)
        $cResult = $cZ1 * $cZ2
        txbOutputComplex.Text = $cResult.ToString(True)
      ' txbOutputComplex.Text = (ValComplex(txbInputComplex1.Text) * ValComplex(txbInputComplex2.Text)).ToString(True)
     Else
        Message.Error("Mindestens ein Eingabe-String kann\nnicht\nals komplexe Zahl interpretiert werden!")
     Endif ' IsComplex(txbInputComplex.Text) ?
  Endif ' txbInputComplex.Text ?
End ' btnMultilizieren_Click()

Public Sub btnDividieren_Click()
  If txbInputComplex1.Text And txbInputComplex2.Text Then 
     If (IsComplex(txbInputComplex1.Text) = True) And (IsComplex(txbInputComplex2.Text) = True) Then
        $cZ1 = ValComplex(txbInputComplex1.Text)
        $cZ2 = ValComplex(txbInputComplex2.Text)
        $cResult = $cZ1 / $cZ2
        txbOutputComplex.Text = $cResult.ToString(True)
      ' txbOutputComplex.Text = (ValComplex(txbInputComplex1.Text) / ValComplex(txbInputComplex2.Text)).ToString(True)
     Else
        Message.Error("Mindestens ein Eingabe-String kann\nnicht\nals komplexe Zahl interpretiert werden!")
     Endif ' IsComplex(txbInputComplex.Text) ?
  Endif ' txbInputComplex.Text ?
End ' btnDividieren_Click()

Public Sub btnVergleichen_Click()
  If txbInputComplex1.Text And txbInputComplex2.Text Then 
     If (IsComplex(txbInputComplex1.Text) = True) And (IsComplex(txbInputComplex2.Text) = True) Then
        If ValComplex(txbInputComplex1.Text) = ValComplex(txbInputComplex2.Text) Then
           txbOutputComplex.Text = "Z1 und Z2 sind gleich!"
        Else
           txbOutputComplex.Text = "Z1 und Z2 sind NICHT gleich!"
        Endif
     Else
        Message.Error("Mindestens ein Eingabe-String kann\nnicht\nals komplexe Zahl interpretiert werden!")
     Endif ' IsComplex(txbInputComplex.Text) ?
  Endif ' txbInputComplex.Text ?
End ' btnVergleichen_Click()

Public Sub btnKonjugation_Click()
  If txbInputComplex1.Text Then 
     If (IsComplex(txbInputComplex1.Text) = True) Then
        txbOutputComplex.Text = ValComplex(txbInputComplex1.Text).Conj().ToString(True)
     Else
        Message.Error("Mindestens ein Eingabe-String kann\nnicht\nals komplexe Zahl interpretiert werden!")
     Endif ' IsComplex(txbInputComplex.Text) ?
  Endif ' txbInputComplex.Text ?
End ' Sub btnKonjugation_Click()

Public Sub btnInverse_Click()
  If txbInputComplex1.Text And txbInputComplex2.Text Then 
     If (IsComplex(txbInputComplex1.Text) = True) And (IsComplex(txbInputComplex2.Text) = True) Then
        txbOutputComplex.Text = ValComplex(txbInputComplex1.Text).Inv().ToString(True)
     Else
        Message.Error("Mindestens ein Eingabe-String kann\nnicht\nals komplexe Zahl interpretiert werden!")
     Endif ' IsComplex(txbInputComplex.Text) ?
  Endif ' txbInputComplex.Text ?
End ' btnInverse_Click()

Public Sub btnPotenzieren_Click()
  If txbInputComplex1.Text Then 
     If IsComplex(txbInputComplex1.Text) = True Then
        $cZ1 = ValComplex(txbInputComplex1.Text)
        $cResult = $cZ1 ^ sboxExponent.Value
        txbOutputComplex.Text = $cResult.ToString(True)
     Else
        Message.Error("Mindestens ein Eingabe-String kann\nnicht\nals komplexe Zahl interpretiert werden!")
     Endif ' IsComplex(..) ?
  Endif ' InputComplex.Text ?
End ' btnPotenzieren_Click()

Public Sub btnArcusArgument_Click()
  Dim fWinkel As Float
  
  If txbInputComplex1.Text Then 
     If IsComplex(txbInputComplex1.Text) = True Then
        $cZ1 = ValComplex(txbInputComplex1.Text)
        Print $cZ1.Imag
        $cResult = $cZ1.Arg()
        fWinkel = Deg($cResult.Real)
        Print fWinkel
        txbOutputComplex.Text = "Arc(" & String.Chr(966) & ") = " & $cResult.ToString(True) & "  "
        txbOutputComplex.Text &= String.Chr(8596) & "  " & String.Chr(966) & " = " & Format(fWinkel, "-0.##°")
     Else
        Message.Error("Mindestens ein Eingabe-String kann\nnicht\nals komplexe Zahl interpretiert werden!")
     Endif ' IsComplex(..) ?
  Endif ' InputComplex.Text ?
End ' btnArcusArgument_Click()

Public Sub btnTrigonForm_Click()
  Dim fWinkel, fBetrag As Float

  If txbInputComplex1.Text Then 
    If IsComplex(txbInputComplex1.Text) = True Then
       $cZ1 = ValComplex(txbInputComplex1.Text)
       $cResult = $cZ1.Arg()
       fWinkel = Deg($cResult.Real)
       If fWinkel < 0 Then fWinkel += 360
       fBetrag = Sqr($cZ1.Abs2())
       txbOutputComplex.Text = "Z1  = " & Format(fBetrag, "-0.###") 
       txbOutputComplex.Text &= String.Chr(8901) & "(cos(" & Format(fWinkel, "0.##°") & ")"
       txbOutputComplex.Text &= " + i" & String.Chr(8901) & "sin(" & Format(fWinkel, "0.##°") & "))"
    Else
       Message.Error("Mindestens ein Eingabe-String kann\nnicht\nals komplexe Zahl interpretiert werden!")
    Endif ' IsComplex(..) ?
  Endif ' InputComplex.Text ?
End ' btnTrigonForm_Click()

'***************************************************************************************************************

Public Sub txbInputComplex1_Change()
  txbOutputComplex.Clear
End ' txbInputComplex_Change()

Public Sub txbInputComplex2_Change()
  txbOutputComplex.Clear
End ' txbComplex2_Change()

Public Sub sboxExponent_Change()
  txbOutputComplex.Clear
End ' sboxExponent_Change()

Public Sub CheckInput(sAllowed As String)
  Dim iAllow As Integer = 0
   
  If Key.Code = Key.Left Then iAllow = 1
  If Key.Code = Key.Right Then iAllow = 1
  If Key.Code = Key.BackSpace Then iAllow = 1 
  If Key.Code = Key.Delete Then iAllow = 1
  If Key.Code = Key.End Then iAllow = 1
  If Key.Code = Key.Home Then iAllow = 1
  If txbInputComplex1.Text And (Key.Code = Key.Enter Or Key.Code = Key.Return) Then 
     iAllow = 1
  Endif
  
  If Key.Text And (InStr(sAllowed, Key.Text) > 0) Then iAllow = 1
  If iAllow = 0 Then Stop Event
  
End ' CheckInput(sAllowed As String)

Public Function ValComplex(sInput As String) As Complex
  Dim complexNumber As Complex
  Dim iCount As Integer
  Dim sReal, sImaginary As String
  
  sInput = Trim(sInput)
' Print "Eingabe-String = "; sInput
  
  ' If IsComplex(sInput) = True Then
  For iCount = Len(sInput) To 1 Step -1 ' Invertierte Iteration
    ' Print "Zeichen = "; Mid(sInput, iCount, 1)
      If (Mid(sInput, iCount, 1) = "+") Or (Mid(sInput, iCount, 1) = "-") Then            
         sReal = Left(sInput, iCount - 1)
       ' Print "RE = "; sReal
         sImaginary = Mid(sInput, iCount, Len(sInput) - iCount)
       ' Print "IM = "; sImaginary
         complexNumber = Complex(Val(sReal), Val(sImaginary))
       ' Print "Z = "; complexNumber
         Return complexNumber
      Endif ' + oder - ?
  Next ' iCount
  ' Else
  '    Error.Raise("Die String-Eingabe kann nicht\nals komplexe Zahl interpretiert werden!")
     'Message.Error("Die String-Eingabe kann nicht\nals komplexe Zahl interpretiert werden!")
     'Return ?
  ' Endif ' IsComplex(sInput) = True ?

End ' Function ValComplex(sInput As String) As Complex

Public Function IsComplex(sInput As String) As Boolean
  Dim sPattern As String
  
  sInput = Trim(sInput)
' Sonderfälle behandeln ...
  If sInput = "0-0i" Or sInput = "0+0i" Then Return False
  
  sPattern = "^([-+]?[0-9]+(,[0-9]+)?)[-+][0-9]+(,[0-9]+)?[i]$"
  
  If sInput Match sPattern Then
     Return True
  Else
    Return False
  Endif ' Match Pattern
  
End ' Function IsComplex(sInput As String) As Boolean


