Konsolenfenster schließt sich

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
StevenB99
User
Beiträge: 33
Registriert: Donnerstag 4. Juni 2020, 23:12

Hallo zusammen, ich habe ein Problem. Wenn ich das Programm mit Idle öffne und starte funktioniert es richtig. Wenn ich es aber ganz normal als Programm öffne, also mit einem Konsolenfenster, dann schließt es sich ohne die Lösung anzuzeigen. Wieso?

Code: Alles auswählen

def Zahlenformate():
    zahl=0
    zwischenergebnis = 0
    reste = []
    print("In welches Zahlenformat soll die Umrechnung erfolgen?\nFür Binär drücke[2]\nFür Basis 3,drücke[3]\nFür Basis 4,drücke[4]\nFür Basis 5,drücke[5]\nFür Basis 6,drücke[6]\nFür Basis 7,drücke[7]\nFür Basis 8,drücke[8]\nFür Basis 9,drücke[9]")
    eingabe=input(">>")

    if eingabe=='2':
        zahl=int(input("Gib eine Zahl ein"))
    while zahl != 0:
      reste.append(zahl % 2)
      zahl = zahl // 2
      reste.reverse()
    for bit in reste:
        print(bit,end="")
    if eingabe=='3':
        zahl=int(input("Gib eine Zahl ein"))
    while zahl != 0:
      reste.append(zahl % 3)
      zahl = zahl // 3
      reste.reverse()
    for bit in reste:
        print(bit,end="")
    if eingabe=='4':
         zahl=int(input("Gib eine Zahl ein"))
    while zahl != 0:
      reste.append(zahl % 4)
      zahl = zahl // 4
      reste.reverse()
    for bit in reste:
        print(bit,end="")
    if eingabe=='5':
         zahl=int(input("Gib eine Zahl ein"))
    while zahl != 0:
      reste.append(zahl % 5)
      zahl = zahl //5
      reste.reverse()
    for bit in reste:
        print(bit,end="")
    if eingabe=='6':
         zahl=int(input("Gib eine Zahl ein"))
    while zahl != 0:
      reste.append(zahl % 6)
      zahl = zahl //6
      reste.reverse()
    for bit in reste:
        print(bit,end="")
    if eingabe=='7':
         zahl=int(input("Gib eine Zahl ein"))
    while zahl != 0:
      reste.append(zahl % 7)
      zahl = zahl //7
      reste.reverse()
    for bit in reste:
        print(bit,end="")
    if eingabe=='8':
         zahl=int(input("Gib eine Zahl ein"))
    while zahl != 0:
      reste.append(zahl % 8)
      zahl = zahl //8
      reste.reverse()
    for bit in reste:
        print(bit,end="")
    if eingabe=='9':
         zahl=int(input("Gib eine Zahl ein"))
    while zahl != 0:
      reste.append(zahl % 9)
      zahl = zahl //9
      reste.reverse()
    for bit in reste:
        print(bit,end="")
Zahlenformate()
    
               
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Was heißt denn, du öffnest das Programm "ganz normal"?
Navigiere in der Konsole / auf der Kommandozeile zu dem entsprechenden Verzeichnis und rufe es dort auf:

Code: Alles auswählen

\pfad\zur\python.exe pfad\zu\deinem\Script.py
oder halt mit / statt \ unter Linux.

Das solltest du immer so tun.

Wenn du das mit einem Doopelklick im Explorer versuchst: Du weißt, dass dein Programm nichts tut? Nach der Beendigung schließt sich die Konsolenausgabe natürlich. Und da dein Programm nichts tut, schließt es sich sofort.
StevenB99
User
Beiträge: 33
Registriert: Donnerstag 4. Juni 2020, 23:12

Ich meine, wenn ich mit einem Doppelklick auf das Programm im Desktop mache, dann öffnet sich alles, ich kann auch alles eingeben, bei der Lösung schließt es sich aber sofort, die Lösung wird nichtmal angezeigt. Was kann ich tun, damit das Programm sich nicht schließt , wenn ich es mit einem doppelklick öffne.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@StevenB99: ”Öffne” es nicht mit einem Doppelklick. Das ist ein Konsolenprogramm und Konsolenprogramme startet man in einer bereits offenen Konsole, so wie sparrow das beschrieben hat, und nicht per Doppelklick.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
StevenB99
User
Beiträge: 33
Registriert: Donnerstag 4. Juni 2020, 23:12

Ok,danke.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Anmerkungen zum Code: Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal 2 und mal 4.
Funktionsnamen werden wie Variablen klein geschrieben. Funktionsnamen sollte auch eine Tätigkeit ausdrücken, wie zahlenformat_umrechnen.
Variablen werden erst dann definiert, wenn sie auch gebraucht werden, bei `zahl` ist das 6 Zeilen tiefer, obwohl es seltsam ist, dass eine while-Schleife nie startet, wenn man in den if-Block davor nicht betreten hat; da wäre die while-Schleife im if-Block besser aufgehoben; da sich die if-Blöcke gegenseitig ausschließen, würde man elif benutzen.
`zwischenergebnis` wird nie verwendet.
Der String in print ist zu lang und mit Zeilenumbruch. Zur besseren Lesbarkeit würde man ihn an den Zeilenumbrüchen in mehrere Zeilen schreiben. Die Beschreibung ist sehr umständlich.
Wir kommen also bei sowas raus:

Code: Alles auswählen

def zahlenformate_umrechnen():
    print("In welches Zahlenformat soll die Umrechnung erfolgen?\n"
          "Für Binär drücke[2]\n"
          "Für Basis 3,drücke[3]\n"
          "Für Basis 4,drücke[4]\n"
          "Für Basis 5,drücke[5]\n"
          "Für Basis 6,drücke[6]\n"
          "Für Basis 7,drücke[7]\n"
          "Für Basis 8,drücke[8]\n"
          "Für Basis 9,drücke[9]")
    eingabe = input(">>")

    if eingabe == '2':
        zahl = int(input("Gib eine Zahl ein"))
        reste = []
        while zahl != 0:
            reste.append(zahl % 2)
            zahl = zahl // 2
            reste.reverse()
        for bit in reste:
            print(bit,end="")
    elif eingabe == '3':
        zahl=int(input("Gib eine Zahl ein"))
        reste = []
        while zahl != 0:
            reste.append(zahl % 3)
            zahl = zahl // 3
            reste.reverse()
        for bit in reste:
            print(bit,end="")
        #usw.

zahlenformate_umrechnen()
Jetzt ist der Code in jedem if-Block fast identisch. Das schreit ja geradezu nach einer Funktion:

Code: Alles auswählen

def rechne_zahlenformat_um(zahl, basis):
    reste = []
    while zahl != 0:
        reste.append(zahl % basis)
        zahl = zahl // basis
        reste.reverse()
    for bit in reste:
        print(bit,end="")

def zahlenformate_umrechnen():
    print("In welches Zahlenformat soll die Umrechnung erfolgen?\n"
          "Für Binär drücke[2]\n"
          "Für Basis 3,drücke[3]\n"
          "Für Basis 4,drücke[4]\n"
          "Für Basis 5,drücke[5]\n"
          "Für Basis 6,drücke[6]\n"
          "Für Basis 7,drücke[7]\n"
          "Für Basis 8,drücke[8]\n"
          "Für Basis 9,drücke[9]")
    eingabe = input(">>")

    if eingabe == '2':
        zahl = int(input("Gib eine Zahl ein"))
        rechne_zahlenformat_um(zahl, 2)
    elif eingabe == '3':
        zahl = int(input("Gib eine Zahl ein"))
        rechne_zahlenformat_um(zahl, 3)
        #usw.
Jetzt steht in jedem if-Block fast das selbe, man kann also das zusammenfassen:

Code: Alles auswählen

def rechne_zahlenformat_um(zahl, basis):
    reste = []
    while zahl != 0:
        reste.append(zahl % basis)
        zahl = zahl // basis
        reste.reverse()
    for bit in reste:
        print(bit,end="")

def zahlenformate_umrechnen():
    print("In welches Zahlenformat soll die Umrechnung erfolgen?\n"
          "Für Binär drücke[2]\n"
          "Für Basis 3,drücke[3]\n"
          "Für Basis 4,drücke[4]\n"
          "Für Basis 5,drücke[5]\n"
          "Für Basis 6,drücke[6]\n"
          "Für Basis 7,drücke[7]\n"
          "Für Basis 8,drücke[8]\n"
          "Für Basis 9,drücke[9]")
    basis = input(">>")
    if "2" <= basis <= "9":
        zahl = int(input("Gib eine Zahl ein"))
        rechne_zahlenformat_um(zahl, int(basis))

zahlenformate_umrechnen()
Jetzt sollte das Programm noch funktionieren, wenn man wirklich 0 als Zahl eingibt. Nach der Ausgabe wäre eine neue Zeile noch schön, und bei Falscheingabe der Basis eine sinnvolle Meldung, statt einfach nichts zu machen.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@StevenB99: Anmerkungen zum Quelltext:

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

Eingerückt wird mit vier Leerzeichen pro Ebene.

Nach Kommas, um binäre Operatoren, und Gleichheitszeichen ausserhalb von Aufruflisten setzt man jeweils ein Leerzeichen um die Lesbarkeit zu erhöhen.

`zahl` wird mit einer 0 initialisiert die nirgends verwendet wird. Und `zwischenergebnis` wird definiert und überhaupt nicht verwendet.

`reste` wird etwas zu früh definiert. Man definiert nicht am Anfang einer Funktion alle Variablen sondern dann wenn sie auch tatsächlich benötigt werden.

Das ”funktioniert” auch in IDLE nicht richtig, denn das Programm macht nicht so ganz was es soll weil die Schleifen semantisch falsch eingerückt sind, beziehungsweise weil es so viele fast gleiche davon gibt. Immer wenn Du Code kopierst und die Kopien leicht anpasst, solltest Du innehalten und überlegen was Du da gerade falsch machst. Das ist ja immer der gleiche Code, der sich nur durch die Zahlenbasis unterscheidet. Den sollte man also nicht zig mal kopieren, sondern einfach die Zahlenbasis als Variable definieren und den Code *einmal* hin schreiben.

Das Umdrehen der Divisionsreste steht auch an einer falschen Stelle im Code.

Und `bit` ist als Name nur für den Fall Basis=2 sinnvoll und in allen anderen Fällen falsch.

Zwischenstand (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3


def main():
    print(
        "In welches Zahlenformat soll die Umrechnung erfolgen?\n"
        "Gib eine Basis von 2 bis 9 ein."
    )
    basis = int(input(">>"))
    if 2 <= basis <= 9:
        zahl = int(input("Gib eine Zahl ein"))

        reste = list()
        while zahl != 0:
            reste.append(zahl % basis)
            zahl //= basis

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


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
StevenB99
User
Beiträge: 33
Registriert: Donnerstag 4. Juni 2020, 23:12

Danke Leute.
Antworten