Umrechnung von Dezimalsystem in beliebiges Zahlenformat (mit Basiszahlen 2-9)

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
Newbie22
User
Beiträge: 2
Registriert: Samstag 24. September 2022, 09:41

Hallo zusammen,
ich muss ein Programm schreiben, in dem der Anwender wählen kann, in welches Zahlenformat (vom Dezimalsystem) die Umrechnung erfolgen soll. Das Zielsystem für die Umrechnung soll sich auf die Basiszahlen 1-9 beschränken. Teilweise funktioniert die Umrechnung bei meinem Code, aber leider nicht bei allen Basiszahlen. Kann mir jemand sagen, wo mein Fehler liegt?

Code: Alles auswählen

""" ********************************************************
Umrechnung vom Dezimal- in ein beliebiges Zahlensystem 
*********************************************************"""
# Initialisierung der Variablen
zahl = 0
basiszahl = 0
zwischenergebnis = 0
# eine Liste für die Reste
reste = []
# die Basiszahl einlesen
basiszahl = int(input("Geben Sie den Wert ein, in welches Zahlenformat die Umrechnung erfolgen soll (2-9): "))
# den Wert einlesen
zahl = int(input("Geben Sie den Wert ein, der umgerechnet werden soll: "))
# die Schleife
while zahl != 0:
    # den Rest der Division durch die Basisizahl ablegen
    reste.append(zahl % basiszahl)
    # durch die Baisizahl teilen und das ganzzahlige Ergebnis wieder zuweisen
    zahl = zahl // basiszahl
    # die Liste umdrehen
    reste.reverse()
    # und ausgeben
for werte in reste:
    print(werte, end = "")
narpfel
User
Beiträge: 644
Registriert: Freitag 20. Oktober 2017, 16:10

Geh doch mal das Programm per Hand durch, Zeile für Zeile, zum Beispiel für 27 und Basis 4. Dann solltest du deinen Fehler gut finden können.
Newbie22
User
Beiträge: 2
Registriert: Samstag 24. September 2022, 09:41

Super, vielen Dank für den Tipp. Ich musste lediglich den Einzug bei "reste.reverse()" entfernen.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Variablen "initialisiert" man in Python nicht, sondern weist ihnen einfach gleich den richtigen Wert zu. Einrückungen sind wichtig, alles was bei Dir eingerückt ist, gehört zur Schleife.
Benutzeravatar
__blackjack__
User
Beiträge: 13063
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Newbie22: Ergänzende Anmerkungen: Kommentare werden mit ``#`` eingeleitet und nur damit. Falls das am Anfang hingegen der Docstring für das Modul sein sollte, dann müssen die Anzahlen der "*" vor und nach der Überschrift gleich sein, sonst wird das in reStructuredText nicht korrekt als Überschrift erkannt. Am besten setzt man die ``"""`` bei Docstrings in jeweils eine eigene Zeile für sich, wenn man so etwas machen will, damit das nicht falsch aussieht wenn man es richtig macht.

Kommentare sollen dem Leser einen Mehrwert über den Code geben. Faustregel: Kommentare beschreiben nicht *was* der Code macht, denn das steht da bereits als Code, sondern warum er das macht. Sofern das nicht offensichtlich ist. Offensichtlich ist in aller Regel auch was in der Dokumentation von Python und den verwendeten Bibliotheken steht.

`werte` ist als Name falsch, weil das immer nur an *einen* Wert gebunden wird. Und warum `wert` und nicht `rest`? Oder vielleicht sogar besser `ziffer`, denn das ist ja letztlich die Bedeutung von den einzelnen Restwerten.

Wenn Du die Ziffern so ausgibst, mit ``end=""`` dann wird nach der letzten Ziffer keine neue Zeile angefangen. Das würde ich als Fehler sehen.

Zwischenstand, mit immer noch einem Fehler (siehe Kommentar im Quelltext):

Code: Alles auswählen

#!/usr/bin/env python3
"""
********************************************************
 Umrechnung vom Dezimal- in ein beliebiges Zahlensystem 
********************************************************
"""


def main():
    basiszahl = int(
        input(
            "Geben Sie den Wert ein, in welches Zahlenformat die Umrechnung"
            " erfolgen soll (2-9): "
        )
    )
    zahl = int(input("Geben Sie den Wert ein, der umgerechnet werden soll: "))
    #
    # FIXME Wenn `zahl` 0 ist, dann ist das Ergebnis falsch.
    #
    reste = []
    while zahl != 0:
        reste.append(zahl % basiszahl)
        zahl //= basiszahl

    for ziffer in reversed(reste):
        print(ziffer, end="")
    print()
    #
    # oder statt der letzten drei Zeilen einfach:
    #
    # print("".join(reversed(reste))
    #


if __name__ == "__main__":
    main()
Mögliche sinnvolle Erweiterungen: Die Zahleneingaben gegen falsche Werte absichern. Also mindestens wenn der Benutzer aus versehen oder mit Absicht keine gültigen ganzen Zahlen eingibt. Noch besser wenn auch eine positive Zahl und der Wertebereich der Basis sichergestellt wird. Oder falls auch negative Zahlen eingegeben werden können sollen, die Umrechnung entsprechend anpassen, dass die auch negative Zahlen korrekt verarbeitet.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten