Dezimalzahlen in Binärzahlen umwandeln

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
hansjürgen
User
Beiträge: 9
Registriert: Samstag 8. Juli 2017, 14:44

Sonntag 11. März 2018, 14:28

Hallo liebe Forenmitglieder,
Ich habe nach langer Zeit wieder angefangen mir selbst Python beizubringen.
Ich schreibe nun an einem Programm,welches Dezimalzahlen in Binärzahlen umwandeln soll.
Nun habe Ich jedoch das Problem,dass bei der Ausgabe die while Schleife nur einmal durchlaufen wird und somit nur die erste Stelle der Binärzahl angezeigt wird.Meine Frage lautet nun: Wie kann Ich dieses Problem beheben ?



# Funktion,welche Dezimalzahlen in Binärzahlen umwandeln soll
def dezimalzahl_to_binaerzahl(dezimalzahl):
global a
# Schleife,welche dazu da ist die Methode zur Berechnung von Dezimalzahlen in Binärzahlen durchzuführen
while dezimalzahl >= 1:
a = []
b = dezimalzahl%2
a.append(b)
a.reverse()
# Abbruchbedingung,welche dazu da ist,damit die while Schleife nicht endlos iteriert
dezimalzahl = dezimalzahl//2
return a
# dient zur Überprüfung ob die Funktion korrekt Funktioniert
x = dezimalzahl_to_binaerzahl(24)
print(x)
Ausgabe: [1]

Process finished with exit code 0
Sirius3
User
Beiträge: 7776
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 11. März 2018, 14:38

@hansjürgen: vergiß gleich wieder, dass es »global« gibt. Das ist hier unsinnig und sonst eine potentielle Fehlerquelle. Deine while-Schleife wird so oft, wie Du willst, durchlaufen, Du wirfst aber bei jedem Schleifendurchgang das vorherige Ergebnis weg.

Es gibt keine Dezimalzahlen, sondern nur Ganzzahlen, die man in unterschiedlichen Basen darstellen kann.
Astorek
User
Beiträge: 69
Registriert: Samstag 24. Januar 2009, 15:06
Kontaktdaten:

Sonntag 11. März 2018, 14:55

@hansjürgen: Direkt nach Beginn der While-Schleife weist du an, dass die Variable "a" gleich wieder eine leere Liste sein soll. Damit wirfst du logischerweise wieder das Ergebnis, was zuvor Variable "a" hatte, wieder weg. Die Zuweisung gehört *vor* der While-Schleife gemacht.

Ansonsten Zustimmung zu dem, was Sirius3 sagt: "global" ist in eher seltenen Fällen wirklich hilfreich, ansonsten sorgt es erfahrungsgemäß eher dafür, dass später größere Codestellen sehr unübersichtlich und fehleranfällig werden. Als Tipp für später: Die Variablennamen (a, b, x) mögen für solch kurze Schnippsel noch in Ordnung gehen, aber wenn du mal ein mehrere hundert Zeilen langen Quelltext geschrieben hast und ihn dir ein halbes Jahr später nochmal anschaust, wirst du froh sein, dass die Variablen aussagekräftigere Namen als a, b und x haben ;) .
newbie2018
User
Beiträge: 4
Registriert: Samstag 10. März 2018, 18:31

Sonntag 11. März 2018, 21:40

@hansjürgen: Also ich kann meinen Vorschreibern nur beipflichten, damit man den Code später wieder lesen kann ist es sehr sinnvoll sprechende Variablennamen zu verwenden.

Ich hätte deine Anforderung so gelöst:

Code: Alles auswählen

def f_dez2bin (iZahl):
    sBin = ''
    while iZahl > 0 :
        if iZahl % 2 == 0 :
            sBin = str (0) + sBin
        else :
            sBin = str (1) + sBin
        iZahl = int (iZahl / 2)

    print (sBin)

print ('Bitte die Dezimalzahl eingeben: ')
iZahl = int (input ())

f_dez2bin (iZahl)
Wobei ich sagen muss, dass ich auch noch Anfänger bin ... ich möchte von euch lernen! bitte sagt mir einfach ob dies so ordentlich ist oder ob ich da einen Denkfehler habe .... in Python bin ich Newbie aber einige andere Sprachen wie C, C#, Java, ... kann ich eigentlich ganz gut ...

Schönen Abend, Newbie 2018
Sirius3
User
Beiträge: 7776
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 11. März 2018, 21:52

@newbie2018: laß die ganzen Typbezeichner in Deinen Variablennamen weg, das macht nur Probleme, falls sich der Typ mal ändert. Niemand schreibt f_ vor Funktionsnamen. Variablen und Funktionen werden komplett klein geschrieben. Vor der öffnenden Klammer von Funktionsaufrufen kommt kein Leerzeichen. Statt eine konstante Zahl in Strings umzuwandeln, schreib doch gleich einen String. Statt Fließkommadivision und anschließendem umwandeln in int, benutzt Ganzzahldivision //.
Funktionen haben normalerweise einen Rückgabewert, anstatt das Ergebnis mit print auszugeben.

Code: Alles auswählen

def dez2bin(number):
    result = ''
    while number > 0:
        result = str(number % 2) + result
        number //= 2
    return result or '0'

print('Bitte die Dezimalzahl eingeben: ')
number = int(input())
print('Binär:', dez2bin(number))
newbie2018
User
Beiträge: 4
Registriert: Samstag 10. März 2018, 18:31

Sonntag 11. März 2018, 22:04

Danke - echt cool von dir, ich freue mich über konstruktive Kritik, werde mir deine Empfehlungen merken und aneignen ...
Hofei
User
Beiträge: 10
Registriert: Freitag 6. Januar 2017, 20:15

Montag 12. März 2018, 13:04

Nur damit ich es los geworden bin,
das "Projekt" dient nur zur Übung, denn es ist dir/euch bekannt dass es dafür eine fertige Funktion mittels Python gibt?
hansjürgen
User
Beiträge: 9
Registriert: Samstag 8. Juli 2017, 14:44

Dienstag 13. März 2018, 23:40

Wie kann Ich es schaffen,dass bei der Ausgabe nicht die Liste,sondern nur die Binärzahl an sich ausgegeben wird ?

Code: Alles auswählen

[1, 0, 1, 1, 0, 1, 0, 0]
Sirius3
User
Beiträge: 7776
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 14. März 2018, 08:05

@hansjürgen: indem Du die Zahlen in Strings umwandelst und dann per join zusammenfügst.
Antworten