Dualzahlen in beliebige andere Zahlensysteme umrechnen

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
LauseJunge
User
Beiträge: 6
Registriert: Dienstag 8. November 2022, 17:07

Hallo Allerseits.
Wie wahrscheinlich schon oft gehört:
Ich bin neu hier, im Thema Python auch erst ein paar Tage und nehme gerade an einem Online-Kurs für die Programmierung mit Python teil.
Das ist auch mein 1. Beitrag. Vergebt mir also, wenn ich noch nicht dem Gusto des Forums entsprechen sollte.
Auch habe ich bisher nichts finden können, was mir bei der Problematik hilft!
KEINE ANGST!
Ich möchte meine Hausaufgaben nicht von euch gemacht bekommen.
Ich möchte nicht verstehen, wie ich Menschen dirigiere, sondern wie Python funktioniert.
Trotzdem geht es um eine "Hausaufgabe".
Das Programm, so wie ich es geschrieben habe, funktioniert zumindest schonmal.
Ob es schön ist?! Das kann ich leider noch nicht beantworten da mir die Erfahrung fehlt.
Aber es erfüllt die Kriterien.
Genug geschwafelt! Ich freue mich über eure Unterstützung!

Die Aufgabe die gestellt wurde:
Erstelle ein Programm das Dezimalzahlen in beliebige andere Zahlensysteme umrechnen kann.
(Es sollte sich aber auf die Zahlen von Einschließlich 2 bis Einschließlich 9 beschränkt werden.)

Code: Alles auswählen

"""*******************************************************
Dualzahl in beliebige Zahlensysteme 
*******************************************************"""
# Initialisierung
wert = 0
faktor = 0
gelungen = False
# leere Liste erstellen
reste = []
# Schleife 1 - Umrechnungswert einlesen und prüfen
while gelungen is False:
    try:
        wert = int(input("Bitte geben Sie den Wert ein der umgerechnet werden soll: "))
    except ValueError:
        print("Die Eingabe war ungültig.")
    else:
        gelungen = True

# Schleife 2 und 3 Umrechnungsfaktor einlesen und prüfen
while faktor < 2:
    faktor = int(input("Bitte geben Sie einen Faktor ein mit dem umgerechnet werden soll"))
while faktor > 9:
    faktor = int(input("Bitte geben Sie einen Faktor ein mit dem umgerechnet werden soll"))

# Berechnung
while wert != 0:
    reste.append(wert % faktor)
    wert = wert // faktor

# Ausgabe
reste.reverse()
for bit in reste:
    print(bit, end="")
Wie gesagt, der Code funktioniert (nach meinem Verständnis).
Trotzdem habe ich noch andere Lösungsideen die ich aber nicht umgesetzt bekomme.
Und zwar nerven mich die 2. und 3. Schleife.
Die würde ich gerne zusammenfassen.
Mein Denkansatz war zum einen, eine while-Schleife zu konstruieren die die beide Bedingungen also faktor < 2 und faktor > 9 zusammenführt.
In etwa so:

Code: Alles auswählen

while faktor < 2 and faktor > 9:
    faktor = int(input("Bitte geben Sie einen Faktor ein mit dem umgerechnet werden soll"))
Das funktioniert aber nicht.
Warum nicht?
Gibt es einen ähnlichen Ansatz der funktioniert?

Zum anderen wäre meine Idee, für die Zahlen 2-9, eine Liste zu erstellen.
Dann wird ein Faktor eingegeben und anschließend überprüft, ob dieser in der Liste vorkommt.
Wenn ja: wird die Berechnung gestartet,
wenn nein: kommt eine Fehlermeldung und man muss den Faktor erneut eingeben.
Ähnlich wie bei der 1. Schleife, nur auf die Liste bezogen.
Und das bekomm ich überhaupt nicht umgesetzt.

Ich freue mich über Rat und Denkanstöße, da ich langsam verzweifele.
Sirius3
User
Beiträge: 18276
Registriert: Sonntag 21. Oktober 2012, 17:20

Eine Zahl kann nicht gleichzeitig kleiner als 2 und größer als 9 sein. Die Verknüpfung der beiden Bedingungen ist falsch.

Man initialisiert Werte erst, wenn man sie wirklich braucht. Sonst verliert man leicht die Übersicht. `faktor` wird dreizehn Zeilen vor es gebraucht wird, initialisiert, `reste` gar siebzehn Zeilen! `wert` wird mit 0 initialisiert, dieser Wert wird aber nie benutzt.

`is` benutzt man außer bei `is None` äußerst selten, hier `not gelungen`. While-Schleifen mit Flag benutzt man aber eigentlich gar nicht, weil man genausogut eine Endlosschleife benutzen könnte, die man per `break` verläßt.

Code: Alles auswählen

while True:
    try:
        wert = int(input("Bitte geben Sie den Wert ein der umgerechnet werden soll: "))
        break
    except ValueError:
        print("Die Eingabe war ungültig.")

while True:
    try:
        faktor = int(input("Bitte geben Sie einen Faktor zwischen 2 und 9 ein mit dem umgerechnet werden soll"))
        if 2 <= faktor <= 9:
            break
    except ValueError:
        print("Die Eingabe war ungültig.")

reste = []
while wert != 0:
    reste.append(wert % faktor)
    wert //= faktor
reste.reverse()

for ziffer in reste:
    print(ziffer, end="")
Dein Code hat noch zwei Fehler, denn es funktioniert nicht für alle Werte.
Benutzeravatar
__blackjack__
User
Beiträge: 14069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@LauseJunge: Zwei Anmerkungen zu Begriffen:

1. In der Aufgabenbeschreibung steht noch korrekt „Dezimalzahlen“, im Betreff des Beitrags und im Docstring des Moduls steht dann fälschlicherweise „Dualzahlen“. Wobei man sich auch klarmachen sollte, dass `wert` im Programm einfach nur eine Zahl ist, also weder Dezimal noch Dual. Diese Begriffe werden erst dann interessant wenn es um die Darstellung von `wert` als Zeichenkette in Form von Ziffern geht.

2. Was im Programm `faktor` heisst, nennt man im Zusammenhang mit den verschiedenen Zahlendarstellungen üblicherweise „Basis“.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
LauseJunge
User
Beiträge: 6
Registriert: Dienstag 8. November 2022, 17:07

Super! Ich muss das erstmal verinnerlichen, da mir leider noch nicht alles, von dem was geschrieben wurde klar ist.
Danke schonmal an der Stelle
Ich werde mein Kursbuch jetzt erst nochmal durcharbeiten, da ich merke, dass ich viele Dinge einfach noch irgendwie mache und sie noch nicht richtig verstanden habe.
Ich melde mich dann nochmal, wenn mir irgendwelche Teilthemen nicht klar erscheinen.
Sonst bekomm ich das glaube ich alles nicht so geordnet, dass ich es mir am Selbst erklären kann.
Und das sollte ja Voraussetzung sein!
Vielen Lieben Dank. @Sirius3 und @_blackjack_
Antworten