Zahlensysteme umrechnen

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Zahlensysteme umrechnen

    Hi,

    Für eine Projektarbei in der Uni bin ich dabei einen Taschenrechner zu programmieren, der auch mit Hexadezimal und binär rechnen muss. Um mir das ein bisschen einfacher zu machen hab ich das so gemacht, dass ich die Zahlen vorher in Dezimalzahlen umrechne und dann wieder zurück.
    Das Zurückrechnen funktioniert auch, nur von Binär in Dezimal und Hexadezimal in Dezimal funktioniert nicht.

    Im Forum hier habe ich öfters diesen Code gefunden:

    Convert.ToInt32(zahl, BasisDerZahl) 'Die Basis der Zahl, nicht in das zu übertragende Zahlensystem (also 10)!!

    Den hab ich auf meinen Taschenrechner umgewandelt, jedoch gibt er immer die gleiche Zahl raus:
    Code:
    Label1.Text = Convert.ToInt32("B", 16) -> Ergebnis 11
    Label1.Text = Convert.ToInt32(n, 16) -> Ergebnis 0

    unabhängig von der Zahl, die ich in den Taschenrechner eingebe.
    Tut mir leid, wenn die Frage simpel ist, aber ich bekomm es nicht hin.
    @PhilK Willkommen im Forum. :thumbup:
    Wenn das Dein ganzer Code ist, kann natürlich nur 11 rauskommen. Die Eingabe muss halt variabel sein.
    Sieh Dir mal diesen Code an: In einer TextBox gibst Du den Hex-String ein und er wird danach als Dez-String im Label ausgegeben:

    VB.NET-Quellcode

    1. Dim txt = TextBox1.Text
    2. Dim value = Convert.ToInt32(txt, 16)
    3. Label1.Text = value.ToString()
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ein guter Taschenrechner besitzt meistens die Möglichkeit von einer Base zu einer anderen Base umzuwandeln. Ein entsprechender Umrechner wäre nicht mit viel Arbeit verbunden.

    Die einfachste Art so etwas zu bewerkstelligen ist schon der Weg immer über das Dec-System. Wenn eine Zahl vorhanden ist z.B. im Bin-System dann wird es zuerst in das Dec-System umgewandelt, und nachher in das Hex-System.

    Ich denke mit einer Array als Einstiegswert von der StartBasis zu einem numerischen Wert im Dec-System und wieder zu einer Array zur ZielBasissystem wäre ein mögliches vorgehen.

    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    Du musst verstehen: Convert.ToInt32 und Konsorten konvertieren nicht zwischen Basen, sondern zwischen Datentypen.
    Lies Dir das durch: Umrechnung: Zahlensysteme
    Und es sieht so aus, als hättest Du Option Strict Off. Das ist besonders bei dem, was du gerade machen willst, tödlich. Und sowas an einer Uni *verständnislos kopfschüttel*.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Ich könnte wetten, dass du das Horner-Schema implementieren sollst und der Taschenrechner nur der Anschaulichkeit halber drumherum gestrickt ist. In diesem Fall kannst du alle Aufrufe an die Convert-Klasse vergessen - mach es zu Fuß. Und vor allem, auch wenn das hart klingt: Mach es selbst und beiß dich durch. Dieses Problem ist durch Nachlesen von Hintergrundinfos wirklich sehr einfach in 5 Zeilen zu lösen. Warum sage ich das? Nun, was wirst du bei der nächsten Aufgabe machen? Die wird nicht einfacher sein, schon gar nicht in Informatikkursen des KIT :P
    Gruß
    hal2000
    Eine einfache Formel dazu :P

    Und noch ein Beispiel:



    Die Formel entspricht nicht ganz dem eigentlichen Vorgehen. Aber wer's versteht wird mit dem richtige Resultat belohnt.

    Nachtrag: Habe hier einen Artikel dazu geschrieben.
    NSC - Zahlensysteme umrechnen von einer Basis in ein Anderes


    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „exc-jdbi“ ()

    Also ich hab es jetzt hinbekommen.
    Danke an alle Antworten.

    Jetzt hab ich jedoch das Problem, dass ich mein Programm, welches bisher eine Windows Form Application ist so umzugestalten, dass ich einen unit test ausführen muss... Dafür muss ich das Programm jetzt in Funktionen und Klassen abändern. Wie ich die erstelle ist kein Problem, aber ich kann den Code nicht so abändern, dass ich einen erfolgreichen Test hinbekomme :/

    VB.NET-Quellcode

    1. Private Sub Button16_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button16.Click
    2. s = Label1.Text
    3. If op = "+" Then
    4. a = f + s
    5. Label1.Text = a
    6. Label2.Text = ""
    7. ElseIf op = "-" Then
    8. a = f - s
    9. Label1.Text = a
    10. Label2.Text = ""
    11. ElseIf op = "*" Then
    12. a = f * s
    13. Label1.Text = a
    14. Label2.Text = ""
    15. ElseIf op = "/" Then
    16. a = f / s
    17. Label1.Text = a
    18. Label2.Text = ""
    19. End If
    20. End Sub

    Wäre ein Beispielcode für das Drücken der Buttons beim Taschenrechner, aber die Umformung in eine Klasse funktioniert nicht
    @jvbsl

    Quellcode

    1. 10 -> 1010 -> A
    2. 11 -> 1011 -> B
    3. 12 -> 1100 -> C
    4. 13 -> 1101 -> D
    5. 14 -> 1110 -> E
    6. 15 -> 1111 -> F

    11 -> 1011 -> B

    @PhilK
    Ich denke dir kann eher geholfen werden, wenn du zeigst, was du bis jetzt hast. In dem Codeausschnitt aus deinem letzten Beitrag, sieht man die Umformungen und deine Probleme noch nicht.

    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „exc-jdbi“ ()

    @exc-jdbi das ist mir natürlich alles klar. Jedoch hast du bei deiner Konvertierung über die Formel module division und shift und addition. mit einer direkten übersetzung pro nibble hat man eben nur shift um an die nibble zu kommen und array zugriff.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    PhilK schrieb:

    einen unit test ausführen
    Meinst Du eine Test-Applikation, wo jede Deiner Prozeduren mit vorzugebenden Testwerten abgearbeitet wird?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ]@rodfromgermany, genau das mein ich.
    So nen Test, den man quasi wie eine Klasse einfügt,

    Hier mein Code:
    Wie gesagt, hab jetzt nochmal rumprobiert, aber sobald ich es als Funktion probier, funktioniert er nicht mehr :/ Müsst doch eigentlich kein Problem sein oder? Wie macht man das nochmal mit Klassen, wenn man die Funktion mal hat?, also die einzelnen Ausführungen, welche durch das Drücken eines Buttons ausgelöst werden.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim f As Double
    3. Dim s As Double
    4. Dim a As Double
    5. Dim op As String
    6. Dim n As Int32
    7. Private Sub o_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click
    8. End Sub
    9. Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click, Button8.Click, Button7.Click, Button5.Click, Button4.Click, Button3.Click, Button2.Click, Button1.Click, Button9.Click, Button10.Click, Button11.Click, Button25.Click, Button24.Click, Button23.Click, Button22.Click, Button21.Click, Button20.Click
    10. Dim b As Button = sender
    11. If Label1.Text = "0" Then
    12. Label1.Text = b.Text
    13. Else
    14. Label1.Text = Label1.Text + b.Text
    15. End If
    16. End Sub
    17. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    18. End Sub
    19. Private Sub Rechenoperationen(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button12.Click, Button15.Click, Button14.Click, Button13.Click
    20. Dim ops As Button = sender
    21. f = Label1.Text
    22. Label2.Text = Label1.Text
    23. Label1.Text = ""
    24. op = ops.text
    25. Label2.Text = Label2.Text + " " + op
    26. End Sub
    27. Private Sub Button16_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button16.Click
    28. s = Label1.Text
    29. If op = "+" Then
    30. a = f + s
    31. Label1.Text = a
    32. Label2.Text = ""
    33. ElseIf op = "-" Then
    34. a = f - s
    35. Label1.Text = a
    36. Label2.Text = ""
    37. ElseIf op = "*" Then
    38. a = f * s
    39. Label1.Text = a
    40. Label2.Text = ""
    41. ElseIf op = "/" Then
    42. a = f / s
    43. Label1.Text = a
    44. Label2.Text = ""
    45. End If
    46. End Sub
    47. Private Sub Button17_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button17.Click
    48. If Int32.TryParse(Label1.Text, n) Then
    49. Label1.Text = Convert.ToString(n, 2)
    50. Else : Label1.Text = ""
    51. End If
    52. End Sub
    53. Private Sub Button18_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button18.Click
    54. Dim txt = Label1.Text
    55. Dim value = Convert.ToInt32(txt, 2)
    56. Label1.Text = value.ToString()
    57. End Sub
    58. Private Sub Button19_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button19.Click
    59. Label1.Text = Hex(Label1.Text)
    60. End Sub
    61. Private Sub Button26_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button26.Click
    62. Dim txt = Label1.Text
    63. Dim value = Convert.ToInt32(txt, 16)
    64. Label1.Text = value.ToString()
    65. End Sub
    66. End Class
    @PhilK Dazu musst Du zunächst Deiner Projektmappe ein Testprojekt hinzufügen.
    Zum Button-Klicken und Co ein Coded UI Testproject, für Algorithmen ein Komponententestprojekt:
    Dann musst Du damit mal ein wenig rumspielen und rausktiegen, wie das so funktioniert.
    Lesen ist da besser als die Hilfe hier im Forum.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @PhilK Mit welchem Studio arbeitest Du?
    Das Studio erstellt Dir automatisch Testroutinen für jede Prozedur jeder Klasse. Diese Routinen musst Du dann "nur noch" ausfüllen.
    Da musst Du Dich langsam rantasten.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!