# VB Programm zur Dualdarstellung von pos./neg. Dezimalzahlen



## gibbs (24. Januar 2010)

Hallo und schon mal ein großes Dankeschön an alle die mir weiterhelfen,

folgendes Problem: 
Es soll ein VB-Programm erstellt werden, mit dem eine eingegebene Dezimalzahl in die zugehörige positive und negative Dualdarstellung umgewandelt wird. Eingabe mit Textfeld 1, Ausgabe positive Dualzahl in Textfeld 2, Ausgabe negative Dualzahl in Textfeld3. Zunächst soll die positive Dualzahl berechnet werden und als einzelne Bits in einer Reihung (Array) abgespeichert werden. Anschließend soll die neg. Dualzahl berechnet werden. Außer der "Val"-Funktion keine VB-Standardfunktionen erlaubt. Möglichst einfach ohne Unterprogramme.

Wie man prinzipiell Dez. in Dual umwandelt weiß ich schon, bloß haperts bei mir mit der Umsetzung im Algorithmus.

Kann mir jemand weiterhelfen?


----------



## Yaslaw (25. Januar 2010)

gibbs hat gesagt.:


> Wie man prinzipiell Dez. in Dual umwandelt weiß ich schon, bloß haperts bei mir mit der Umsetzung im Algorithmus.
> 
> Kann mir jemand weiterhelfen?



VB kann ich gut. Doch Dualzahl? Meine letzte Mathematikstunde ist 10 Jahre her und solches Zeug ist mir nicht mehr geläufig...


----------



## gibbs (25. Januar 2010)

z.B. 334  -->  334:2 = 167 Rest 0 --> 0         
                       167:2 = 83 Rest 0,5 --> 1
                       83:2 = 41 Rest 0,5 --> 1
                       41:2 = 20 Rest 0,5 --> 1
                       20:2 = 10 Rest 0 --> 0
                       10 : 2 = 5 Rest 0 --> 0
                       5 : 2 = 2 Rest 0,5 --> 1
                       2 : 2 = 1 Rest 0 --> 0
                       1 : 2 = 0 Rest 0,5 --> 1

--> da 16 Bit Dualzahl = 0000000101001110 (Schweibweise hier von unten nach oben bzw. li nach re)

zugehörige negative Dualzahl durch Bildung des Zweierkomplements, d.h. zunächst Einserkomplement (indem jeweils 0 und 1 der pos. Dualzahl vertauscht werden) und anschließend Addition von 1.

--> 1111111010110011


----------



## Yaslaw (25. Januar 2010)

Hab da mal auf die schnelle was zusammengeklotzt. Nicht das es grad die schönste Version ist, jedoch hast du verschiedene Dinge drin die du brauchen kannst.

Das plus 1 beim negativen Wert hab ich nicht verstanden. Das musst du selber noch einbauen


```
Public Sub testDual(myNumber As Long)
    Debug.Print dual(myNumber)
    Debug.Print negativeDual(myNumber)
End Sub

Private Function dual(ByVal myNumber As Long) As String
    Dim rest As String
    
    'Rest bei Division durch 2 berechnen
    rest = CStr(myNumber Mod 2)
    'Abgerundete division durch 2
    myNumber = Fix(myNumber / 2)
    'Falls die nummer grösser als 0 ist, das selbe nochmals und das resultat vor den rest setzen
    If myNumber > 0 Then rest = CStr(dual(myNumber)) & rest
    'Ausgabe auf 16 Stellen formatieren
    dual = Format(rest, "000000000000000")
End Function

Private Function negativeDual(myNumber As Long) As String
    Dim duals As String
    
    'dual berechnen
    duals = dual(myNumber)
    'die einzelnen Stellen wechslen: abs(1-1) => 0, abs(0-1) => 1
    For i = 1 To Len(duals)
        Mid(duals, i, 1) = Abs(Mid(duals, i, 1) - 1)
    Next
    'TODO: irgendwo noch das komische +1 das ich nicht verstanden habe einabauen
    negativeDual = duals
End Function
```


----------



## gibbs (25. Januar 2010)

Wow, sieht echt professionel aus, Danke erstmal

Bloß sagen mir leider einige Funktionen bzw. Ausdrücke gar nichts. Hab ich auch nie eklärt bekommen und ist somit für Problem irrelevant. Laut Problemstellung darf außer der Val-Funktion (gibt numerischen Wert in einer Zeichenfolge am Anfang enthaltener Zahlen zurück) auch nichts verwendet werden.

PS: + 1 muss man noch von re nach li dazurechnen, wie einfache Addition, bloß binär halt


----------



## Yaslaw (25. Januar 2010)

Nur mit val lösen? Wow, das wird lustig:
http://www.vbarchiv.net/commands/Val.php

Nachtrag:

Hab noch eine andere Lösung gefunden
http://www.vbarchiv.net/tipps/tipp_539-zahl-dual-darstellen-binaer.html


----------



## gibbs (25. Januar 2010)

... und soweit bin ich in den letzen paar Minuten gekommen

Option Explicit

Private Sub Command1_Click()

Dim dez As Integer
Dim erg As Integer
Dim i As Integer
Dim bin_pos, bin_neg As Integer

dez = Val(Text1.Text)

If dez >= 2 ^ 16 Then
   MsgBox ("Zahl ist größer als 16 Bit")
Exit Sub
End If

Do
_(hier müsste doch der eigtl. Algorithmus rein)_
Loop Until

Text2.Text = bin_pos
Text2.Text = bin_neg

End Sub


----------



## Yaslaw (25. Januar 2010)

Kannst den do-while Teil aus dem mir gepostetet weiteren Besipiel nehmen

http://www.vbarchiv.net/tipps/tipp_539-zahl-dual-darstellen-binaer.html

Deine Integer solltest du durch Long ersetzen. Sonst wird nix mit 16 Ziffern.
Die Ausgabe Formatieren, damit es auch führende 0 gibt.


```
Private Sub Command1_Click()

	Dim dez As Long
	Dim i As Integer
	Dim bin_pos, bin_neg As Long
	
	dez = Val(Text1.Text)
	
	If dez >= 2 ^ 16 Then
	MsgBox ("Zahl ist größer als 16 Bit")
	Exit Sub
	End If
	
	Do
	    If dez Mod 2 = 0 Then
			bin_pos = "0" & bin_pos
			bin_neg = "1" & bin_neg
	    Else
			bin_pos = "1" & bin_pos
			bin_neg = "0" & bin_neg
	    End If
	    dez = dez \ 2
	Loop Until
	'TODO: irgendwie noch das +1
	Text2.Text = Format(bin_pos, "0000000000000000")
	Text2.Text = Format(bin_neg, "0000000000000000")

End Sub
```

Nachtrag: Das Format kann man ggf auch im Formularfeld machen


----------

