Hilfe

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
hm-94
User
Beiträge: 8
Registriert: Dienstag 27. Oktober 2015, 14:17

Servurs,

ich habe folgende Aufgabe zu lösen:

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.

Nun habe ich versucht dies zu lösen:

Code: Alles auswählen

jahr=int(raw_input("Geben sie eine Jahreszahl ein: "))


if jahr>= 1590:
    def Schaltjahr(jahr):
        if jahr % 400 == 0:
            print "Es ist ein Schaltjahr"
        elif jahr % 100 == 0:
            print "Es ist kein Schaltjahr"
        elif jahr % 4 == 0:
            print "Es ist ein Schaltjahr"
        else:
            print "Es ist kein Schaltjahr"
Schaltjahr(jahr)
wie bekomme ich es hin das ich den Zeitraum zwischen 1590 und 2100 eingrenzen kann?

schon mal vielen dank für die Antworten.
Zuletzt geändert von Anonymous am Donnerstag 10. Dezember 2015, 21:13, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17745
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo hm-94,

es gibt die logische Operationen »and« und »or« mit denen man mehrere Vergleiche verknüpfen kann. Damit läßt sich auch die Schaltjahresprüfung auf ein »if« reduzieren.

Die Funktion Schaltjahr wird nur definiert, wenn das Jahr >= 1590 ist, sonst gibt es einen NameError, das sollte nicht sein.
BlackJack

@hm-94: Na in dem Du prüfst ob die Jahreszahl grösser oder gleich 1590 und kleiner oder gleich 2100 ist. Man kann (Teil)Bedingungen mit dem entsprechenden Schlüsselwort verknüpfen, man kann aber auch Vergleichsoperatoren verketten und damit die beiden Teilbedingungen so ausdrücken wie man das aus der Mathematik gewohnt ist.

Die Funktionsdefinition in dem ``if``-Block macht keinen Sinn, insbesondere wenn Du nach dem Block die Funktion bedingungslos aufrufst, was ja nicht funktionieren kann wenn die Bedingung beim ``if`` unwahr war und folglich die Funktion überhaupt nicht definiert wurde.

Funktionsnamen sind üblicherweise Tätigkeiten die beschreiben was die Funktion tut. Damit kann man sie leichter von ”passiven” Werten unterscheiden. Testfunktionen heissen konventionell `ist_irgendwas()` oder `hat_irgendwas()` (und normalerweise auf englisch (`is_something()`, `has_something()`). Ausserdem werden sie klein geschrieben. Siehe auch den Style Guide for Python Code.

Es werden sicherlich mehr Funktionen erwartet. Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht normalerweise in einer Funktion die `main()` heisst. Die Eingabe der Jahreszahl könnte beispielsweise in einer Funktion stehen die solange fragt bis eine Zahl eingegeben wurde und die in dem vorgegebenen Bereich liegt.

Sowohl Code als auch Daten sollte man nicht wiederholen. Wenn man etwas anpassen oder ändern will oder muss, dann muss man das bei Code- oder Datenwiederholungen an mehreren Stellen machen, darf keine Vergessen, und muss auch darauf achten das man die Änderung konsequent überall gleich macht. Das ist fehleranfällig Du solltest also *einen* Ausdruck schreiben der entscheidet ob es sich um ein Schaltjahr handelt oder nicht und die Testfunktion sollte einen Wahrheitswert an den Aufrufer zurückgeben und keinen Text ausgeben. Das kann dann der Aufrufer machen und dort muss man den Text für die beiden möglichen Antworten dann jeweils auch nur *einmal* in den Quelltext schreiben.
hm-94
User
Beiträge: 8
Registriert: Dienstag 27. Oktober 2015, 14:17

vielen dank für die Antworten. Ich habe es jetzt so gelöst und es hat funktioniert :D

Code: Alles auswählen

jahreszahl=2015
while 1589<jahreszahl<2101:
    jahreszahl=raw_input("Geben Sie die Jahreszahl ein:")
    jahreszahl=int(jahreszahl)
    
    if 1589<jahreszahl<2101:
               
        if jahreszahl%4==0:
            schaltjahr=True
            print "Das Jahr", jahreszahl, "ist ein Schaltjahr."
            abfrage=raw_input("Möchten Sie erneut eine Jahreszahl prüfen?")
            abfrage=str(abfrage)
            
            if abfrage=="ja":
                continue
            
            else:
                print ("Sie haben das Programm abgebrochen!") 
                break    
                              
        else:
            print "Das Jahr", jahreszahl, "ist kein Schaltjahr."
            abfrage=raw_input("Möchten Sie erneut eine Jahreszahl prüfen?")
            abfrage=str(abfrage)
            if abfrage=="ja":
                continue
            
            else:
                print ("Sie haben das Programm abgebrochen!")
                break
    
    else:
        print "Das eingegebene Jahr liegt außerhalb des festgelegten Zeitraumes."
Zuletzt geändert von Anonymous am Donnerstag 10. Dezember 2015, 22:59, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@hm-94: Das ist aber keine Lösung der Aufgabe in der ziemlich deutlich etwas von Funktionen (Mehrzahl) steht. Siehe auch meine Anmerkungen dazu in meinem letzten Beitrag. Auch was die Code- und Datenwiederholungen angeht. ``continue`` ist ein Schlüsselwort das man meistens vermeiden kann. Wenn man es verwendet hat man in der Regel nicht gründlich genug über die Programmstruktur in der Schleife nachgedacht wenn man diese unübersichtliche ”Abkürzung” benötigt. Die äussere Schleife sollte einfach eine ``while True:``-Schleife sein die wenn die entsprechende Bedingung eintritt mit ``break`` verlassen wird. Dann muss man die Jahreszahl nicht am Anfang ohne einen anderen sinnvollen Grund an irgendeinen Wert binden der die Schleifenbedingung erfüllt. Das ``break`` in der Schleife hast Du ja sogar schon und die Schleifenbedingung sollte eigentlich immer wahr sein und ist damit sinnfrei.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Da es laut obiger Aufgabenstellung nicht ausgeschlossen wird, kann man auch ein Bordmittel nutzen:

Code: Alles auswählen

import calendar

calendar.isleap(1986)
> False

calendar.isleap(1987)
> False

calendar.isleap(1988)
> True
:mrgreen:

Im übrigen ist das Regelwerk für Schaltjahre keineswegs so simpel, wie in der bisherigen Lösung...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten