Schleife stoppen

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.
Artur
User
Beiträge: 47
Registriert: Freitag 21. Oktober 2011, 10:55

Tag liebe com, ich bins wieder *g*

Ich habe folgendes Problem: ich will bei einer input-Abfrage bei Leerlassen des Abfragefeldes also einem string "" eine Schleife abbrechen.

Code: Alles auswählen

while True:
    Jahr=input("Bitte Jahr eingeben um auf Schaltjahr zu prüfen: ")
    if Jahr=="":
        print "Programm beendet!"
        break
    elif Jahr<=1589 or Jahr>=2101:
        print "Ungültige Eingabe!"
    elif Jahr % 4 ==0:
        print Jahr, "ist ein Schaltjahr!"
    elif Jahr % 4 !=0:
        print Jahr, "ist kein Schaltjahr!"
Wie man sieht, ist mein Problem Zahlen und strings in die Abfrage einzugeben. Mit raw_input funktioniert das eingeben des strings "" und somit das beenden des Programms, jedoch kann ich dann keine Zahlen mehr eingeben. Mit input funktioniert funktioniert die Stringeingabe nicht ^.^. Was kann ich tun? Die leere Stringeingabe vielleicht irgendwie ersetzen? Hab mit variablen rumprobiert, hat bisher aber nichts geklappt.

Beim Enterdrücken wärend der Abfrage kommt folgender Fehler:
Traceback (most recent call last):
File "C:/Users/Artur/Desktop/sasasas.py", line 3, in <module>
Jahr=input("Bitte Jahr eingeben um auf Schaltjahr zu prüfen: ")
File "<string>", line 0

^
SyntaxError: unexpected EOF while parsing

Da steht wohl auch nur, dass kein string bei der input-Abfrage erkannt wird ..? hm

Hier noch die Aufgabe:

Schreiben Sie ein Programm, das feststellt, ob ein von Ihnen frei einzugebendes Jahr,
z.B. 1996, ein Schaltjahr ist / war. Eine Ausgabe, die bestätigt oder verneint ist
vorzusehen. Wiederholtes Prüfen mit einer anderen Jahreszahl soll möglich sein,
verbunden mit der Abfrage, ob eine Wiederholung erfolgen soll. Als Eingabebereich
sind nur die Jahre von 1590 bis 2100 zulässig. Eingaben außerhalb dieses Zeitraums
sind mit einem entsprechenden Ausgabehinweis abzulehnen.
Lagern Sie wesentliche Programmabläufe in Funktionen aus.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Benutze raw_input und wandele den Rückgabewert (ein String) in einen int um.
Artur
User
Beiträge: 47
Registriert: Freitag 21. Oktober 2011, 10:55

Hey, das war ja echt einfach. Hab vorher nur nicht gewusst wie das genau geht aber durch ein bissl rumprobieren hats geklappt.

Code: Alles auswählen

while True:
    Jahr=raw_input("Bitte Jahr eingeben um auf Schaltjahr zu prüfen: ")
    if Jahr=="":
        print "Programm beendet!"
        break
    elif int(Jahr)<=1589 or int(Jahr)>=2101:
        print "Ungültige Eingabe!"
    elif int(Jahr) % 4 ==0:
        print Jahr, "ist ein Schaltjahr!"
    elif int(Jahr) % 4 !=0:
        print Jahr, "ist kein Schaltjahr!"
danke

Wäre nur noch toll int(Jahr) durch ne variable zu ersetzen, kriege es aber irgendwie nicht hin.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@Artur: 1700 war kein Schaltjahr, obwohl 1700 % 4 == 0.
In specifications, Murphy's Law supersedes Ohm's.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Artur hat geschrieben:Wäre nur noch toll int(Jahr) durch ne variable zu ersetzen, kriege es aber irgendwie nicht hin.

Code: Alles auswählen

foo = int(Jahr)
:?:
Artur
User
Beiträge: 47
Registriert: Freitag 21. Oktober 2011, 10:55

au weia, dann ist die aufgabe doch schwerer als ich gedacht habe. ich geh ins bett. morgen gehts weiter
problembär

Artur hat geschrieben:au weia, dann ist die aufgabe doch schwerer als ich gedacht habe.
Schau' Dir mal bitte das "datetime"-Modul an. Damit ist das nicht so schwer. (Klasse Modul übrigens, sehr hilfreich!)
BlackJack

@problembär: Ach, das ist dann jetzt plötzlich kein Modul-Gefrickel was man besser selber noch mal mit den eingebauten Mitteln lösen sollte!? :twisted:

Na immerhin hast Du nicht auf die einfachste Möglichkeit in der Standardbibliothek hingewiesen: Die `isleap()`-Funktion aus dem `calendar`-Modul.
Artur
User
Beiträge: 47
Registriert: Freitag 21. Oktober 2011, 10:55

darf ich anmerken, dass das python tutorial nicht sehr benutzerfreundlich geschrieben ist?
Artur
User
Beiträge: 47
Registriert: Freitag 21. Oktober 2011, 10:55

ALSO MENSCHEN. Das Programm funktioniert. Aber es gibt noch Probleme. Mein derzeitiges Problem ist, dass ich es nicht schaffe python zu sagen "Wenn Eingabe(Jahr) ein String ist:
print ungültige Eingabe
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Artur hat geschrieben:darf ich anmerken, dass das python tutorial nicht sehr benutzerfreundlich geschrieben ist?
Steht dir frei, aber das Python-Tutorial ist auch nicht dazu gedacht jemandem Programmieren beizubringen.

Artur hat geschrieben:ALSO MENSCHEN. Das Programm funktioniert. Aber es gibt noch Probleme. Mein derzeitiges Problem ist, dass ich es nicht schaffe python zu sagen "Wenn Eingabe(Jahr) ein String ist:
print ungültige Eingabe
Das steht sogar 1:1 so im Tutorial: http://docs.python.org/tutorial/errors. ... exceptions
Artur
User
Beiträge: 47
Registriert: Freitag 21. Oktober 2011, 10:55

Wär halt toll zu wissen, dass es sowas gibt. ich schaue mir gerade das tut von bucky auf youtube an, da kam es bisher noch nicht dran. Nunja, danke :-)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Artur hat geschrieben:ich schaue mir gerade das tut von bucky auf youtube an, da kam es bisher noch nicht dran.
Und da ist nun das Python-Tutorial dran schuld, weil es so benutzterunfreundlich ist?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Artur
User
Beiträge: 47
Registriert: Freitag 21. Oktober 2011, 10:55

Hab ich das gesagt :-) ? Ich finde es nur sehr schwer als Anfänger mich dort zurechtzufinden.

Zum Programm:

Code: Alles auswählen

while True:
    try:
        Jahr=raw_input("Bitte Jahr eingeben um auf Schaltjahr zu prüfen: ")
        if int(Jahr)<=1589 or int(Jahr)>=2101:
            print "Ungültige Eingabe!"
        elif int(Jahr) % 4 !=0 or int(Jahr)==(1700 or 1800 or 1900):
            print Jahr, "ist kein Schaltjahr!"
        elif int(Jahr) % 4 ==0:
            print Jahr, "ist ein Schaltjahr!"
    except ValueError:
        print "Bitte eine Zahl eingeben!"
    Exit=raw_input("Möchten Sie den Vorgang wiederholen? (Ja/Nein) ")
    if Exit=="Nein":
        print "Programm beendet!"
        break
    elif Exit=="Ja":
        continue
Das Programm tut jetzt alles was es soll. Nach der Prüfung auf ein Schaltjahr fragt es auf Wiederholung des Vorgangs ab. Bei "Ja" wird der Vorgang wiederholt. Bei "Nein" wird er beendet. Doch wenn man irgendwas anderes eingibt, soll die Abfrage auf Wiederholung des Vorgangs erneut abgefragt werden mit einer Ausgabe 'Nur "Ja" oder "Nein" möglich! '. Lässt sich die try,except Methode auch auf "alles andere als "Ja" oder "Nein" anwenden?
Artur
User
Beiträge: 47
Registriert: Freitag 21. Oktober 2011, 10:55

So, altes Problem gelöst, neues Problem gefunden.

Code: Alles auswählen

while True:
    try:
        Jahr=raw_input("Bitte Jahr eingeben um auf Schaltjahr zu prüfen (1590-2100): ")
        if int(Jahr)<=1589 or int(Jahr)>=2101:
            print "Ungültige Eingabe!"
            continue
        elif int(Jahr) % 4 !=0 or int(Jahr)==(1700 or 1800 or 1900):
            print Jahr, "ist kein Schaltjahr!"
        elif int(Jahr) % 4 ==0:
            print Jahr, "ist ein Schaltjahr!"
    except ValueError:
        print "Bitte eine Zahl eingeben!"
        continue
    while True:
        Exit=raw_input("Möchten Sie den Vorgang wiederholen? (Ja/Nein) ")
        if Exit=="Nein":
            print "Programm beendet!"
            break
        elif Exit!=("Ja" or "Nein"):
            print "Ungültige Eingabe!"
        elif Exit=="Ja":
            break
Ich habe eine zweite while True Schleife erstellt. Nun möchte ich bei Eingabe von "Nein" beide Schleifen verlassen, also das Programm beenden. Kann man irgendwie aus 2 while-Schleifen ausbrechen?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Artur hat geschrieben:Das Programm tut jetzt alles was es soll.
Da war wohl der Wunsch der Vater des Gedankens. Für das Jahr 1800 kommt ein falsches Ergebnis heraus.

Ich würde übrigens nicht bei jedem Vergleich ein Casting auf int durchführen, sondern nur einmalig. Du brauchst dann das try-except auch nicht so weit ausdehnen.

Code: Alles auswählen

while True:
    try:
        value = int(raw_input('Integer: '))
        break
    except ValueError:
        pass
Artur hat geschrieben:Lässt sich die try,except Methode auch auf "alles andere als "Ja" oder "Nein" anwenden?
Exception-Handling wäre der falsche Ansatz dafür. Wenn du eine Liste möglicher Eingabewerte hast (hier z.B. "Ja" und "Nein") dann solltest du die Eingabe auch mit dieser Liste der Eingabewerte vergleichen. Sollte die Eingabe nicht in der Liste vorkommen, dann kannst du die Eingabe wiederholen lassen.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Artur hat geschrieben:

Code: Alles auswählen

int(Jahr)==(1700 or 1800 or 1900)
Das bedeutet nicht, was du glaubst, dass es bedeutet. Es bedeutet nicht: int(Jahr) ist gleich einem der Werte 1700 oder 1800 oder 1900, sondern: int(Jahr) ist gleich der Auswertung des Ausdrucks (1700 or 1800 or 1900), und der Wert dieses Ausdrucks ist die Konstante True, da a or b genau dann True ergibt, wenn nicht beide, a und b, False (oder äquivalent dazu, zB.: None oder "" oder 0 oder [] oder ...) sind.

Außerdem hast du vergessen, dass auch 2100 kein Schaltjahr ist. Ich hatte dir einen Link genannt, wo die Berechnungsregel steht. Es ist völlig sinnfrei, das über eine Aufzählung zu lösen, wenn die Regel bekannt ist.
In specifications, Murphy's Law supersedes Ohm's.
Artur
User
Beiträge: 47
Registriert: Freitag 21. Oktober 2011, 10:55

Danke, hab die 2100 fast vergessen. Mein code sieht jetzt so aus:

Code: Alles auswählen

keeplooping=True
while keeplooping:
    try:
        Jahr=raw_input("Bitte Jahr eingeben um auf Schaltjahr zu prüfen (1590-2100): ")
        if int(Jahr)<=1589 or int(Jahr)>=2101:
            print "Ungültige Eingabe!"
            continue
        elif int(Jahr) % 4 !=0 or int(Jahr)==1700 or int(Jahr)==1800 or int(Jahr)==1900 or int(Jahr)==2100:
            print Jahr, "ist kein Schaltjahr!"
        elif int(Jahr) % 4 ==0:
            print Jahr, "ist ein Schaltjahr!"
    except ValueError:
        print "Bitte eine Zahl eingeben!"
        continue
    while keeplooping:
        Exit=raw_input("Möchten Sie den Vorgang wiederholen? (Ja/Nein) ")
        if Exit=="Nein":
            print "Programm beendet!"
            keeplooping=False
        elif Exit!=("Ja" or "Nein"):
            print "Ungültige Eingabe!"
        elif Exit=="Ja":
            break
Ist jetzt halt ein bissl viel code, durch die ganzen or's. Könnte man sicher in eine Funktion einlagern, weiß aber grad nicht wie. Aus den beiden while-Schleifen auszubrechen ging mit keeplooping=True, while keeplooping:..... und am ende keeplooping=False. Vielleicht nicht die eleganteste Lösung, doch für mich die einfachste. Danke für die Hilfe :-)
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Nimm doch einfach eine Liste schreib da die Jahre rein also [1700, 1800, 1900, 2100] dann schreibst du die if-abfrage um das geschaut wird ob der input 'in' der Liste ist.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Artur hat geschrieben:Ist jetzt halt ein bissl viel code, durch die ganzen or's.

Code: Alles auswählen

if value in ['yes', 'no']:
    # do something
Zudem ist gerade bei den Jahreszahlen die Verwendung von or absolut überflüssig. Verwende einfach die korrekte Formel für die Berechnung und du musst keine Ausnahmenliste pflegen.
Antworten