Seite 1 von 1

Wo hakts?

Verfasst: Sonntag 7. November 2021, 13:30
von Drunken
Moin,
Falls dies das falsche Unterbrett ist bitte verschienben, hab keins gefunden das explizit für Hilfe gedacht ist.

Zu meinem Problem:

Ich lerne derzeit noch, und sitze nun an einem Binär <-> Dezimal Rechner, dieser soll mit for bzw. while Schleifen realisiert werden, also bitte keine Kommentare durch welche netten import Funktionen man das ganze einfacher bewerkstelligen kann, das ist nicht Teil der Aufgabe.

Zunächst mal mein Code bisher:

Code: Alles auswählen

Entscheidung = str(input("[1]Binär oder [2]Dezimal? "))
if Entscheidung == 1:
    Binär()
elif Entscheidung == 2:
    Dezimal()
#________________________

def Dezimal():
    Gültigkeit = False
    while Gültigkeit == False:
        try:
            Eingabe_Zahl = int(input("Umzurechnende Zahl eingeben: "))
        except ValueError:
            print("Ungültige Eingabe!")
        else:
            Gültigkeit = True
    Zahl = 0
    Zwischenergebnis = 0
    Zahl = Eingabe_Zahl
    while Zahl != 0:
        Zwischenergebnis = Zahl//2
        print(Zahl%2, end = "")
        Zahl = Zwischenergebnis
#_______________________________________

def Binär():
    Gültigkeit = False
    while Gültigkeit == False:
        try:
            Eingabe_Zahl = int(input("Binärfolge eingeben: "))
        except ValueError:
            print("Ungültige Eingabe!")
        else:
            Gültigkeit = True
    while True:
        Zahlenfolge = input(Eingabe_Zahl)
        Binärfolge = len (Zahlenfolge) - 1
        Dezimal = 0
 
    for i in range (0, Binärfolge + 1):
        if int (Zahlenfolge[Binärfolge - i]) == 1:   
            Dezimal += (int (Zahlenfolge[Binärfolge - i])) * (2 ** i)
             
    print (Dezimal)
    print ()

#_______________________________________
Dezimal()
Binär()
Die einzelnen Proghrammabschnitte an sich funtkionieren, zusammengenommen verhaken sie sich aber, hier mal 2 Terminalausgaben:

Code: Alles auswählen

[1]Binär oder [2]Dezimal? 2
Umzurechnende Zahl eingeben: 4
001Binärfolge eingeben: 001
1
1
1
1
Das Programm endet in einer Endlosschelife und spukt mir zeilenweise Einsen aus.

Entscheide ich mich für die Binäre Umrechnung, lande ich allerdings erst wieder in der Funktion zur Dezimalen Umrechnung:

Code: Alles auswählen

[1]Binär oder [2]Dezimal? 1
Umzurechnende Zahl eingeben: 4
001Binärfolge eingeben: 001
1
1
1
1
1
Das Programm endet ebenfalls in besagter Endlosschleife.

Ich habe das ganze erst auf die Funktionen geschoben, und bereits unten ab Zeile 49 Versucht etwas zu ändern, indem ich bspw. aus der "Entscheidung" eine Funktion gemacht habe, das resultiert allerdings im selben Ergebnis.
Ist mein Vorgehen so überhaupt möglich? Ich dachte jetzt schon daran eine enorm verzweigte if-Funktion zu bauen, aber vielleicht gibt es auch einen klügeren Weg. Kopfzerbrechen bereitet mir eigentlich nur die Entscheidung: Will ich Binär oder Dezimal umrechnen, im selben Programm. Lade ich die Programmteile unabhängig voneinander in ein extra Programm, erledigen sie ihre Aufgabe fürs Erste so wie sie sollen.

Danke schonmal für jeden guten Ratschlag, und einen Schönen Sonntag euch.
Beste Grüße

Re: Wo hakts?

Verfasst: Sonntag 7. November 2021, 14:10
von Sirius3
Dass Du eine Endlosschleife hast, ist ziemlich klar, weil in `Binär` `while True` steht, ohne dass es eine Abbruchbedingung geben würde.

Die Probleme fangen aber schon ganz oben an. `input` liefert einen String, den in einen String per `str` umzuwandeln ist unnötig. Dann versuchst Du den Wert mit Zahlen zu vergleichen, was niemals klappt. Würde es klappen, wäre zu diesem Zeitpunkt die Funktionen `Binär` oder `Dezimal` noch nicht definiert.

Sowohl Variablennamen als auch Funktionen werden komplett klein geschrieben.
Ein Kommentar sollte beschreiben, warum man etwas macht, ein Kommentar, der nur aus _ besteht kann ich nichts herauslesen, kann also weg.
Wenn man dafür, dass eine while-Schleife startet einer Variable einen Dummywert geben muß, dann ist das eigentlich eine while-True Schleife, die man an der passenden Stelle per break verläßt.
In `Dezimal` benutzt Du bereits `int`, was ja die Umwandlung von einer Dezimalzahl in die interne Computerdarstellung schon erledigt. Ist das der Sinn der Aufgabe?
`Zahl` wird mit 0 initialisiert, aber nie benutzt. Das Mischen von Eingabe, Ausgabe und Umrechnung in einer Funktion ist schlecht, weil man die einzelnen Teile nicht testen kann, das sollte man in drei Teile teilen.
Bei `Binär` wird sogar eine Binärzeichenfolge wie eine Dezimalzahl behandelt. Das ist sicher nicht Sinn der Aufgabe.

Der erste Schritt sollte also sein, eine Funktion zu schreiben, die einen String mit Dezimalzeichen nimmt und einen String mit Binärzeichen zurückgibt, oder umgekehrt. Darin sollten, wie Du ja selbst schreibst, nicht schon Funktionen wie int verwendet werden, die das ja praktisch schon zur Hälfte erledigen.

Schreibe dazu ausführliche Tests. Das ganz sieht dann so aus:

Code: Alles auswählen

def convert_decimal_to_binary(decimal):
    ....
    return binary

# Tests:
assert convert_decimal_to_binary("0") == "0"
assert convert_decimal_to_binary("1") == "1"
assert convert_decimal_to_binary("2") == "10"
assert convert_decimal_to_binary("123") == "1111011"
Wenn Du die Funktionen ausgiebig mit Tests getestet hast, kannst Du noch Funktionen für die Eingabe und Ausgabe schreiben.

Re: Wo hakts?

Verfasst: Sonntag 7. November 2021, 14:59
von __blackjack__
Vielleicht noch als Hinweis um Codewiederholungen zu vermeiden: Du brauchst zwei bis drei Hilfsfunktionen: Eine für die Umwandlung einer Zeichenkette + Angabe der Basis in eine Zahl, und eine zur Umwandlung einer Zahl + Angabe der Basis in eine Zeichenkette. Denn beide Schritte sind letztlich gleich, egal ob man als Basis 2 oder 10 verwenden will (oder irgendeine andere Basis). Und dann kann man noch eine kleine triviale dritte Hilfsfunktion schreiben, die von einer beliebigen Basis in eine beliebige andere Basis wandelt.

Code: Alles auswählen

def convert_string_to_integer(base, string):
    return int(string, base)  # TODO Durch eigenen Code ersetzen.


def convert_integer_to_string(base, number):
    #
    # TODO Durch eigenen Code ersetzen.
    #
    format_string = {2: "b", 8: "o" 10: "d"}.get(base)
    if not format_string:
        raise NotImplementedError(f"for base {base!r}")
    return format(number, format_string)


def convert_bases(from_base, to_base, string):
    return convert_integer_to_string(
        to_base, convert_string_to_integer(from_base, string)
    )


def convert_decimal_to_binary(string):
    return convert_bases(10, 2, string)


def convert_binary_to_decimal(string):
    return convert_bases(2, 10, string)