Begrenzung der Werte in der input() Funktion

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
AJ1980
User
Beiträge: 4
Registriert: Dienstag 5. Dezember 2023, 13:28

Hallo zusammen,
bei nachfolgender Aufgabe habe ich gerade eine Denkblockade:
"Erweitern Sie das Programm zum Umrechnen von dezimal- in Dualzahlen aus diesem Studienheft so, dass der Anwender wählen kann, in welches Zahlenformat die Umrechnung erfolgen soll. Damit die Umsetzung nicht zu kompliziert wird, beschränken Sie das Zielsystem für die Umrechnung auf die Basiszahl 2 bis 9 einschließlich."
Allgemein, den Code habe ich soweit erstellt, so dass die eigentlich Berechnung funktioniert (diesen füge ich hier auch noch am Ende ein). Bei mir hat sich jedoch aktuell eine Blockade bzgl. der Begrenzung der Eingabe der Basiszahl ergeben. Meine Idee war es zunächst diese Begrenzung über ein while Schleife zu lösen. Allerdings habe ich dabei schon festgestellt, dass es wohl nicht möglich ist einen Ausdruck "while basiszahl < 2 and > 9:" als Bedingung im Schleifenkopf zu platzieren. Wenn ich dann beide Abfragen als eigene while Schleife code, dann läuft mein Programm nicht mehr richtig:
while basiszahl < 2:
int(input("Bitte geben Sie eine Basiszahl 2 bis 9 ein: "))
while basiszahl > 9:
int(input("Bitte geben Sie eine Basiszahl 2 bis 9 ein: "))
Eine andere Überlegung war zudem noch die try...except...else Konstruktion zu nutzen. Aber auch an der Stelle komme ich irgendwie nicht wirklich weiter wie man diese mit Wertebereiche codieren kann.
Vielleicht kann mir der ein oder andere mit der Fragestellung helfen und mir einen Denkanstoß geben.

Code: Alles auswählen

# den Variablen Werte zuweisen
zahl = 0
basiszahl = 0
# eine Liste für die Reste
reste =[ ]

# die Werte einlesen
zahl = int(input("Bitte geben Sie einen Wert ein der umgerechnet werden soll: "))
basiszahl = int(input("Bitte geben Sie eine Basiszahl zwischen 2 und 9 ein: "))

# die Schleife
while zahl != 0:
    reste.append(zahl % basiszahl)
    zahl = zahl // 2
	
# die Liste umdrehen
reste.reverse()
# und ausgeben
for Ziffer in reste:
    print(reste, end = " ")
Sirius3
User
Beiträge: 17758
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Werte unter dem Kommentar "# den Variablen Werte zuweisen" werden nicht benutzt und können gelöscht werden. Falls das irgendwie eine Deklaration von Variablen sein soll, sowas gibt es in Python nicht.
Variablen werden erst dann eingeführt, wenn sie gebraucht werden. `reste` also direkt vor der while-Schleife.

Variablennamen schreibt man komplett klein. `Ziffer` wird in der for-Schleife gar nicht benutzt.
Mit and verknüpft man ganz Bedingungen, also basiszahl < 2 and basiszahl > 9. Diese Bedingungen kann aber nie erfüllt sein.

Da basiszahl erst innerhalb der while-Schleife definiert wird, brauchst Du eine while-true-Schleife mit break.
bb1898
User
Beiträge: 200
Registriert: Mittwoch 12. Juli 2006, 14:28

Sirius3 hat geschrieben: Dienstag 5. Dezember 2023, 16:25 Variablennamen schreibt man komplett klein. `Ziffer` wird in der for-Schleife gar nicht benutzt.
Der print-Befehl soll ja sicherlich nicht das ausgeben, was er tatsächlich ausgibt.
Mit and verknüpft man ganz Bedingungen, also basiszahl < 2 and basiszahl > 9. Diese Bedingungen kann aber nie erfüllt sein.
Jede dieser beiden Bedingungen würde für sich genügen, die Umrechnung abzubrechen - also mit "or" verbinden und dann bei True abbrechen. Oder die Grenzen richtig setzen: "basiszahl >= 2 and basiszahl <= 9". Oder die nette Python-Eigenart benutzen: "if 2 <= basiszahl <= 9" geht in dieser Sprache auch.

Ach ja, und es müsste natürlich "zahl = zahl // basiszahl" heißen!
AJ1980
User
Beiträge: 4
Registriert: Dienstag 5. Dezember 2023, 13:28

Sirius3 hat geschrieben: Dienstag 5. Dezember 2023, 16:25 Die Werte unter dem Kommentar "# den Variablen Werte zuweisen" werden nicht benutzt und können gelöscht werden. Falls das irgendwie eine Deklaration von Variablen sein soll, sowas gibt es in Python nicht.
Variablen werden erst dann eingeführt, wenn sie gebraucht werden. `reste` also direkt vor der while-Schleife.

Variablennamen schreibt man komplett klein. `Ziffer` wird in der for-Schleife gar nicht benutzt.
Mit and verknüpft man ganz Bedingungen, also basiszahl < 2 and basiszahl > 9. Diese Bedingungen kann aber nie erfüllt sein.

Da basiszahl erst innerhalb der while-Schleife definiert wird, brauchst Du eine while-true-Schleife mit break.
Danke dir für deine Antwort :-). Ich bin gerade neu in dem Studium und aktuell sehen die Codes in den Studienheften genauso aus, aber es ist gut zu wissen, dass es eigentlich anders gehändelt wird. Das werde ich für mich nochmal umschreiben und testen. Und ja das mit der "Kleinschreibung" ist mir bewusst. Da dies mein erster Post war habe ich den Code händisch komplett eingetippt bis ich verstanden habe wie es eigenlich funktioniert und dabei sind mir leider Fehler passiert :roll:.
Aber dank deinem Input hat sich die Blockade gelöst und jetzt scheint mein Code zu funktionieren wie ich es gerne hätte. Tatsächlich beim drüber nachdenken ist es klar das es kein and sein kann sondern ein or sein muss.
AJ1980
User
Beiträge: 4
Registriert: Dienstag 5. Dezember 2023, 13:28

Ach ja, und es müsste natürlich "zahl = zahl // basiszahl" heißen!
Danke auch dir für deine Antworten, ja in meinem Code steht es auch so, aber ich haben den hier händisch eingetippt und den Part wohl irgendwie beim Blick aufs Studienheft falsch übernommen. Aber jetzt habe ich verstanden wie das einfügen von Codes hier funktioniert, so dass mir solche Fehler hoffentlich in der Zukunft nicht mehr passieren :geek:.
Sirius3
User
Beiträge: 17758
Registriert: Sonntag 21. Oktober 2012, 17:20

Das sieht bei Dir jetzt also so aus:

Code: Alles auswählen

def main():
    zahl = int(input("Bitte geben Sie einen Wert ein der umgerechnet werden soll: "))
    while True:
        basiszahl = int(input("Bitte geben Sie eine Basiszahl zwischen 2 und 9 ein: "))
        if 2 <= basiszahl <= 9:
            break

    reste = []
    while zahl != 0:
        zahl, rest = divmod(zahl, basiszahl)
        reste.append(rest)

    for ziffer in reversed(reste):
        print(ziffer, end="")
    print()

if __name__ == "__main__":
    main()
Der Code hat noch weitere Probleme: wenn man keine Zahl eingibt, kommt es zu einem Abbruch und wenn man als Zahl 0 eingibt, ist das Ergebnis falsch und bei negativen Zahlen landet man in einer Endlosschleife.
AJ1980
User
Beiträge: 4
Registriert: Dienstag 5. Dezember 2023, 13:28

Sirius3 hat geschrieben: Mittwoch 6. Dezember 2023, 10:14 Das sieht bei Dir jetzt also so aus:

Code: Alles auswählen

def main():
    zahl = int(input("Bitte geben Sie einen Wert ein der umgerechnet werden soll: "))
    while True:
        basiszahl = int(input("Bitte geben Sie eine Basiszahl zwischen 2 und 9 ein: "))
        if 2 <= basiszahl <= 9:
            break

    reste = []
    while zahl != 0:
        zahl, rest = divmod(zahl, basiszahl)
        reste.append(rest)

    for ziffer in reversed(reste):
        print(ziffer, end="")
    print()

if __name__ == "__main__":
    main()
Der Code hat noch weitere Probleme: wenn man keine Zahl eingibt, kommt es zu einem Abbruch und wenn man als Zahl 0 eingibt, ist das Ergebnis falsch und bei negativen Zahlen landet man in einer Endlosschleife.
Nein so sieht es bei mir tatsächlich nicht aus, was aber daran liegt dass ich noch ziemlich am Anfang bin und einiges von dir in dem Code noch nicht durchgenommen wurde.
Ein Teil der von dir genannten Probleme sind mit tatsächlich auch schon aufgefallen. Allerdings sollten wir den Code nur dahingehend verändern das von Umrechnung Dezimal- in Dualzahl die Umrechnung in die Zahlensystem 2 bis 9 möglich wird. Die Eingabe von "zahl" habe ich dementsprechend gelassen, da sie im Ursprungscode auch nur so definiert gewesen ist.
Antworten