vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Variablen/Strings · Algorithmen/Mathematik   |   VB-Versionen: VB2005, VB2008, VB201004.04.11
Arithmetik mit Feldern und/oder Konstanten

Eine Funktion, mit der man zwei Felder oder ein Feld mit einer Konstanten arithmetisch verknüpfen kann, will heißen: Anwenden der vier Grundrechenarten.

Autor:   Dietrich HerrmannBewertung:     [ Jetzt bewerten ]Views:  8.461 
ohne HomepageSystem:  Win2k, WinXP, Win7, Win8, Win10, Win11kein Beispielprojekt 

Die folgende Funktion erlaubt das 'Rechnen' mit Feldern und Konstanten. Als Parameter kann man entweder zwei Felder, deren stellungsbezogene Elemente mit einer der vier Grundrechenarten verknüpft werden sollen, oder ein Feld, dss mit einer Konstanten 'verrechnet' werden soll, angeben. Dabei heißt 'stellungsbezogen', dass das Element mit Index x des ersten Feldes mit dem Element mit Index x des zweiten Feldes verknüpft wird (das setzt voraus, dass die Felder möglichst gleich dimensioniert sein müssen).

Wenn man arr2 nicht angibt, erwartet die Funktion, dass mit einer Konstanten gerechnet werden soll. Es können auch Felder angegeben werden, die aus gemischten Typen von Elementen bestehen. Es werden nur Elemente für die Berechnung verwendet die vom Typ so zu sagen 'numerisch' sind. Im Feld der Ausnahmetypen sind diejenigen Datentypen angegeben, die nicht 'verrechnet' werden können. Wenn das der Fall ist, sind unten im Funktionscode Möglichkeiten angegeben, wie man verfahren, um das Ergebnisfeld zu füllen.

Die Funktion:

''' <summary>
''' Elemente zweier Arrays mit arithmetischer Operation verknüpfen
''' </summary>
''' <param name="arithArt">die Operation als String ("+", "-", "*", "/")</param>
''' <param name="arr1">das erste Array</param>
''' <param name="arr2">das zweite Array</param>
''' <param name="idx1">Anfangsindex</param>
''' <param name="idx2">Endeindex</param>
''' <param name="constante">eine Konstante</param>
''' <returns>das Ergebnis-Array</returns>
''' <remarks>
''' Das zweite Array muss bei Subtraktion die Subtrahenden-,
''' bei Division die Divisoren-Elemente enthalten.
''' Wird ein zweites Array nicht angegeben, wird erwartet,
''' dass mit einer Konstanten gerechnet wird.
''' Es werden alle Elemente anhand der Ausnahmetypen überprüft, ob sie numerische Elemente sind,
''' wenn nicht, wird als Ergebniselement 0 gespeichert.
''' </remarks>
Public Function arithArrays(ByVal arithArt As String, _
  ByVal arr1 As Array, Optional ByVal arr2 As Array = Nothing, _
  Optional ByVal idx1 As Short = 0, Optional ByVal idx2 As Short = 0, _
  Optional ByVal constante As Object = 1) As Array
 
  ' Ausnahmetypen
  Dim types() As Type = _
    {GetType(Boolean), GetType(Byte), GetType(Char), _
    GetType(DateTime), GetType(Object), GetType(String)}
  Dim ty1, ty2 As Type, value As Object
 
  ' Ausgabe-Array
  ' das erste Feld bestimmt die Dimension des Ausgabefelds
  Dim tmpArr(arr1.Length - 1) As Object	
  Dim lastIdx As Short = idx2
  If idx2 = 0 Then lastIdx = arr1.Length - 1
  For i As Short = idx1 To lastIdx
    ' Rechnen mit zwei Feldern
    If Not IsNothing(arr2) Then
      If IsDBNull(arr1(i)) OrElse IsDBNull(arr2(i)) Then Continue For
      ty1 = arr1(i).GetType : ty2 = arr2(i).GetType
      If types.IndexOf(types, ty1) >= 0 OrElse types.IndexOf(types, ty2) >= 0 Then
        ' Arrayelement war nicht numerisch (könnte auch DBNull oder Nothing o.ä. gesetzt werden)
        tmpArr(i) = 0
        Continue For
      End If
      value = arr2(i)
 
    ' Rechnen mit Konstante
    Else
      If types.IndexOf(types, ty1) >= 0 Then
        ' Arrayelement war nicht numerisch, dann Ergebniselement = Originalelement
        tmpArr(i) = arr1(i)
        Continue For
      End If
      value = constante
    End If
 
    Select Case arithArt
      Case "+" ' Addition
        tmpArr(i) = arr1(i) + value
    Case "-" ' Subtraktion
      tmpArr(i) = arr1(i) - value
    Case "*" ' Multiplikation
      tmpArr(i) = arr1(i) * value
    Case "/" ' Division
      If value = 0 Then
        ' wenn Divisorelement oder constante =0, dann Ergebniselement =0
        ' (könnte auch =DBNull oder =Nothing oder =Originalelement von arr1 o.ä. gesetzt werden)
        tmpArr(i) = 0
      Else
        tmpArr(i) = arr1(i) / value
      End If
    End Select
  Next
  Return tmpArr
End Function

Aufrufbeispiel zwei Felder:
(Differenz zweier Datenzeilen einer Datentabelle, beginnend ab Index 1)

Dim dr1, dr2 As DataRow
Dim diff As Array = arithArrays("-", dr2.ItemArray, dr1.ItemArray, 1)

Aufrufbeispiel rechnen mit Konstanter:
(alle Werte eines gebundenen DGV-Datensatzes durch 1000 dividieren)

Dim drj() As Object
drj = DatagridView1.Rows(0).DataBoundItem.Row.ItemArray
drj = arithArrays("/", drj, , , , 1000)

Dieser Tipp wurde bereits 8.461 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
   

Druckansicht Druckansicht Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel