Rubrik: Variablen/Strings · Algorithmen/Mathematik | VB-Versionen: VB4, VB5, VB6 | 02.09.05 |
Division wie in der Schulzeit Division von sehr großen Zahlen, nach der Methode, wie wir es zu unserer Schulzeit gelernt haben. | ||
Autor: Bodo Massa | Bewertung: | Views: 14.548 |
ohne Homepage | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Die Division ist im Rahmen der bekannten Zahlengrößen in VB und VBA kein Problem. Mit dem Zeichen '/' kann eine Division durchgeführt werden. Was aber, wenn man eine 24-stelige Zahl teilen möchte? Bisher ist mir noch keine Funktion bekannt, mit der man so etwas bewerkstelligen könnte.
Da gibt es aber doch etwas. Damals in der Schule, als wir das Teilen gelernt haben, war das ein System, mit dem beliebig lange Zahlen geteilt werden konnten.
Beschreibung des Ablaufes:
Die zu teilende Zahl wird als String an die Funktion übergeben. Der Divisor als Long-Variable. Die Funktion geht nun Schritt für Schritt den String durch und versucht den bisher gelesenen Teil durch den Divisor zu teilen. Gelingt dies nicht, so wird das nächste Zeichen angehängt und nochmals versucht. Gelingt es, so wird der Ganzzahlanteil des Divisionsergebnises dem Ergebnisstring angehängt und der Rest wird 'notiert'. Am Ende steht das Ergebnis samt Rest durch ein Leerzeichen getrennt in der Funktionsvariablen.
Beispiel für Übergabevariablen:
TxtZahl = "123123120001212123131400" Divisor = 97
Das Ergebnis:
Division = "1269310515476413640529 87"
Die Ziffern bis zum Leerzeichen beinhalten das ganzzahlige Ergebnis, die Ziffern nach dem Leerzeichen beinhalten den Rest der Division.
Erstellen Sie ein neues Projekt mit eine Form und folgenden Controls:
- TextBox (txtZahl)
- TextBox (txtDiv)
- TextBox (txtResult) mit den Eigenschaften MultiLine = True und ScrollBars = 2
- CommandButton (Command1)
Fügen Sie nachfolgenden Code in den Codeteil der Form ein:
Private Sub Form_Load() txtZahl.Text = "123123120001212123131400" txtDiv.Text = "97" txtResult.Text = "" txtResult.FontName = "FixedSys" End Sub
Private Sub Command1_Click() Division txtZahl.Text, Val(txtDiv.Text) End Sub
Function Division(txtZahl As String, Divisor As Long) As String ' Variabeln deklarieren Dim TeilStart As Integer Dim TeilEnd As Integer Dim TxtLen As Integer Dim Erg As Long Dim Ganz As Long Dim Rest As Long Dim Nr As Long Dim TxtErg As String Dim TxtRest As String Dim TxtAusg As String Dim TxtStart As String Dim TxtGanz As String Dim Teil As String ' sämtliche Variablen initialisieren TeilStart = 1 TeilEnd = 1 TxtLen = Len(txtZahl) TxtErg = "" TxtRest = "" TxtAusg = "" TxtStart = TeilStart ' Hauptschleife der Division While TeilEnd <= TxtLen ' ermitteln des zu berechnenden Teilstrings Teil = TxtRest + Mid$(txtZahl, TeilStart, TeilEnd - TeilStart + 1) ' Wenn der Teil größer ist als der Divisor If Val(Teil) >= Divisor Then ' Ergebnis der Teildivision Erg = Val(Teil) \ Divisor Ganz = Erg * Divisor Rest = Val(Teil) - Ganz TxtGanz = Trim(Str(Ganz)) ' Bereich für die Ausgabe in die TextBox If TxtErg <> "" Then TxtAusg = TxtAusg + Space$(TxtStart - Len(Teil)) + Trim(Teil) + vbCrLf TxtGanz = Space$(Len(Teil) - Len(TxtGanz)) + TxtGanz TxtAusg = TxtAusg + Space$(TxtStart - Len(Teil)) + TxtGanz + vbCrLf TxtAusg = TxtAusg + Space$(TxtStart - Len(Teil)) + String(Len(Teil), "-") + vbCrLf Else If Len(TxtErg) > 1 Then TxtAusg = TxtAusg + Space$(TxtStart - Len(Teil)) + Trim(Teil) + vbCrLf End If TxtGanz = Space$(Len(Teil) - Len(TxtGanz)) + TxtGanz TxtAusg = TxtAusg + Space$(TxtStart - 1) + TxtGanz + vbCrLf TxtAusg = TxtAusg + Space$(TxtStart - 1) + String(Len(Teil), "-") + vbCrLf End If ' Berechnete Werte in Variabeln speichern TxtErg = TxtErg + Trim(Str(Erg)) TxtRest = Trim(Str(Rest)) TeilStart = TeilEnd + 1 TeilEnd = TeilStart ' Bereich für die Ausgabe in die Textbox TxtStart = TeilStart Else ' Bereich, wenn der Divisor größer ist als der zu berechnende Teil If TxtErg <> "" Then TxtErg = TxtErg + "0" ' Bereich für die Ausgabe in die TextBox If Rest = 0 And TxtRest <> "" Then TxtAusg = TxtAusg + Space$(TxtStart - Len(Teil)) + Trim(TxtRest) + vbCrLf TxtRest = "" End If TxtStart = TxtStart + 1 End If TeilEnd = TeilEnd + 1 End If Wend ' Bereich für die Ausgabe in die TextBox If TxtRest <> "" Then TxtAusg = TxtAusg + Space$(TeilStart - Len(Teil)) + Trim(TxtRest) + vbCrLf TxtAusg = txtZahl + " :" + Str(Divisor) + " = " + TxtErg + " Rest " + TxtRest + vbCrLf + TxtAusg txtResult.Text = TxtAusg ' Übergabe des Ergebnis an die Funktion Division = TxtErg + " " + TxtRest Exit Function Ende: Close Nr Division = "" End Function
Das Ergebnis der MultiLine-TextBox sieht aus, wie eine auf dem Papier durchgeführte Division.
/ Beispieltext 123123120001212123131400 : 97 = 1269310515476413640529 Rest 87 97 --- 261 194 --- 672 582 --- 903 873 --- 301 291 --- 102 97 --- 500 485 --- 150 97 --- 531 485 --- 462 388 --- 741 679 --- 622 582 --- 401 388 --- 132 97 --- 353 291 --- 621 582 --- 393 388 --- 514 485 --- 290 194 --- 960 873 --- 87 / Ende Beispieltext