Seite 1 von 2

Schleife stoppen

Verfasst: Sonntag 4. Dezember 2011, 01:46
von Artur
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.

Re: Schleife stoppen

Verfasst: Sonntag 4. Dezember 2011, 01:50
von derdon
Benutze raw_input und wandele den Rückgabewert (ein String) in einen int um.

Re: Schleife stoppen

Verfasst: Sonntag 4. Dezember 2011, 02:25
von Artur
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.

Re: Schleife stoppen

Verfasst: Sonntag 4. Dezember 2011, 02:31
von pillmuncher
@Artur: 1700 war kein Schaltjahr, obwohl 1700 % 4 == 0.

Re: Schleife stoppen

Verfasst: Sonntag 4. Dezember 2011, 02:34
von derdon
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)
:?:

Re: Schleife stoppen

Verfasst: Sonntag 4. Dezember 2011, 02:51
von Artur
au weia, dann ist die aufgabe doch schwerer als ich gedacht habe. ich geh ins bett. morgen gehts weiter

Re: Schleife stoppen

Verfasst: Sonntag 4. Dezember 2011, 06:39
von 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!)

Re: Schleife stoppen

Verfasst: Sonntag 4. Dezember 2011, 09:51
von 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.

Re: Schleife stoppen

Verfasst: Sonntag 4. Dezember 2011, 09:53
von Artur
darf ich anmerken, dass das python tutorial nicht sehr benutzerfreundlich geschrieben ist?

Re: Schleife stoppen

Verfasst: Sonntag 4. Dezember 2011, 09:56
von Artur
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

Re: Schleife stoppen

Verfasst: Sonntag 4. Dezember 2011, 09:57
von Darii
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

Re: Schleife stoppen

Verfasst: Sonntag 4. Dezember 2011, 10:09
von Artur
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 :-)

Re: Schleife stoppen

Verfasst: Sonntag 4. Dezember 2011, 10:26
von Leonidas
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?

Re: Schleife stoppen

Verfasst: Sonntag 4. Dezember 2011, 10:44
von Artur
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?

Re: Schleife stoppen

Verfasst: Sonntag 4. Dezember 2011, 11:02
von Artur
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?

Re: Schleife stoppen

Verfasst: Sonntag 4. Dezember 2011, 11:06
von /me
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.

Re: Schleife stoppen

Verfasst: Sonntag 4. Dezember 2011, 11:20
von pillmuncher
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.

Re: Schleife stoppen

Verfasst: Sonntag 4. Dezember 2011, 11:58
von Artur
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 :-)

Re: Schleife stoppen

Verfasst: Sonntag 4. Dezember 2011, 12:34
von JonasR
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.

Re: Schleife stoppen

Verfasst: Sonntag 4. Dezember 2011, 12:34
von /me
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.