prüfen, ob eine Dualzahl eingegeben wurde

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
kingsven
User
Beiträge: 1
Registriert: Mittwoch 22. Dezember 2021, 06:05

Hallo zusammen,

ich muss ein Programm schreiben, dass Dualzahl in Dezimalzahl umrechnet. Jetzt will ich nach der Eingabe prüfen, ob auch wirklich eine Dualzahl (also nur 0 und/oder 1) eingegeben wurde.
Mein Plan war, es über try, except, else zu lösen. Funktioniert aber noch nicht. Die Schleifenbedingung ist wohl falsch.
Hat jemand eine Idee wie es funktionieren könnte.
Meine Suche im Forum brachte erst mal nichts.
Gruß Sven

eingabe = False

while eingabe == 0 or 1:
try:
# den Wert einlesen
eingabe = int(input("Bitte geben Sie eine Dualzahl ein, die umgerechnet werden soll: "))
except ValueError:
print("Die Eingabe war nicht gültig. Es dürfen nur die 0 und 1 eingegeben werden!")
else:
eingabe = True
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Du hast da mehrere Fehler. `eingabe = 0 or 1` ist immer wahr.

Code: Alles auswählen

>>> False or 1
1
>>> bool(False or 1)
True
Die Prüfung ist hier nicht, ob die Eingabe 0 oder 1 ist, sondern ob eingabe gleich 0 ist oder ob 1 wahr ist. Nun sind für Python alle Zahlen außer 0 wahr. Analoges gilt auch für diverse andere Datentypen. Siehe dazu "Boolean operations" in der Dokumentation.

Die Abfrage müsste also lauten: `while eingabe == 1 or eingabe == 0` oder einfacher `while eingabe in {0, 1}`. Jetzt stehst du aber vor dem nächsten Problem. `False == 0` ist nämlich auch wahr, da `False` nicht nur ein boolean sondern auch ein Integer mit dem Wert 0 ist.

Code: Alles auswählen

>>> False == 0
True
>>> isinstance(False, int)
True
Die beste Lösung ist es, eine Endlosschleife zu verwenden die mit `break` verlassen wird, sobald die Prüfung erfolgreich war.

Code: Alles auswählen

while True:
    try:
        # den Wert einlesen
        eingabe = int(input("Bitte geben Sie eine Dualzahl ein, die umgerechnet werden soll: "))
        if eingabe in {0, 1}:
            break
    except ValueError:
        print("Die Eingabe war nicht gültig. Es dürfen nur die 0 und 1 eingegeben werden!")
    
Das setzt jetzt voraus, dass du wirklich nur eine einzige Ziffer prüfen willst. Möchtest du eine Eingabe wie 101010 prüfen, dann ist ohnehin eine andere Prüfung erforderlich.
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

@kingsven: wenn die Aufgabe lautet, eine Dualzahl in eine Dezimalzahl umzuwandeln, dann sind wohl str und int nicht erlaubt, denn damit ist die Aufgabe trivial:

Code: Alles auswählen

dezimalzahl = str(int(dualzahl, 2))
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

Die Prüfung ist sogar recht einfach. Du testest, wie von /me gezeigt, auf einen ValueError, verwendest aber den gesamten Eingabestring:

Code: Alles auswählen

>>> i = input("Dualzahl eingeben:")
Dualzahl eingeben:1100101
>>> i
'1100101'
>>> int(i, 2)
101
>>> i = input("Dualzahl eingeben:")
Dualzahl eingeben:100201
>>> int(i, 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 2: '100201'
> <stdin>(1)<module>()
Antworten