Weihnachtsaufgabe

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
lea.0208
User
Beiträge: 2
Registriert: Samstag 4. November 2017, 11:27

def anzahlTageImMonat(monat, jahr):
if monat in [1, 3, 5, 7, 8, 10, 12]:
anzahl = 31
elif monat in [4, 6, 9, 11]:
anzahl = 30
else:
anzahl = 28
return anzahl

def naechstesDatum(datum):
(tag, monat, jahr) = datum
if tag < anzahlTageImMonat(monat, jahr):
tag = tag + 1
elif monat < 12:
tag = 1
monat = monat + 1
else:
tag = 1
monat = 1
jahr = jahr + 1
return (tag, monat, jahr)

datumStart = (15, 1, 2012)
datumZiel = (25, 12, 2017)

datumAktuell = datumStart
anzahlTage = 0
while datumAktuell != datumZiel:
datumAktuell = naechstesDatum(datumAktuell)
anzahlTage = anzahlTage + 1


print("Startdatum:", datumStart)
print("Zieldatum:", datumZiel)
print("Anzahl der Tage:", anzahlTage) Schreiben Sie das folgende Python 3.6 Programm: Lassen Sie den Nutzer ein Datum
von der Form DDMMYYYY eingeben. Berechnen Sie anhand dieses Datums, wie
viele Tage es von diesem Tag bis zum N¨achsten Weihnachtsfest sind. Schaltjahre
mussen Sie dabei nicht bedenken.
Das ist meine Aufgabe. Ich habe es leider nur geschafft, etwas zu programmieren mit einem festgelegten Startdatum ohne input und nur für 1 festgelegtes Jahr.
Kann mir wer helfen, dass es funktioniert, wenn der Nutzer ein beliebiges Datum mit input selbst eingibt und es die Tag bis Weihnachten für jedes beliebige JAhr berechnet?
Benutzeravatar
noisefloor
User
Beiträge: 4172
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

Python hat das datetime Modul an Bord und das kennt timedelta-Objekt. Damit bekommst du auch die Tage zwischen zwei Daten. Da würden auch Schaltjahre berücksichtigt.

Anm.: Wobei der Aufgabensteller diesen Lösungsweg wahrscheinlich nicht im Kopf hatte - aber so würden man das unter Python machen. Wenn's ein Modul gibt implementiert man das nicht nochmal selber :-)

Gruß, noisefloor
lea.0208
User
Beiträge: 2
Registriert: Samstag 4. November 2017, 11:27

datumStart = input('--> ' )
datumStart = [0,1,2,3]


if datumStart [2:3] == '01':
anzahlTage = 31 - int (datumStart [0:1])
Tage = 25 - anzahlTage
print(Tage)

if datumStart [2:3] == '02':
anzahlTage = 28 - int (datumStart [0:1])

if datumStart [2:3] == '03':
anzahlTage = 31 - int (datumStart [0:1])

if datumStart [2:3] == '04':
anzahlTage = 30 - int (datumStart [0:1])

if datumStart [2:3] == '05':
anzahlTage = 31 - int (datumStart [0:1])

if datumStart [2:3] == '06':
anzahlTage = 30 - int (datumStart [0:1])

if datumStart [2:3] == '07':
anzahlTage = 31 - int (datumStart [0:1])

if datumStart [2:3] == '08':
anzahlTage = 31 - int (datumStart [0:1])

if datumStart [2:3] == '09':
anzahlTage = 30 - int (datumStart [0:1])

if datumStart [2:3] == '10':
anzahlTage = 31 - int (datumStart [0:1])

if datumStart [2:3] == '11':
anzahlTage = 30 - int (datumStart [0:1])

if datumStart [2:3] == '12':
anzahlTage = 31 - int (datumStart [0:1])
mit einer Liste soll es ja auch gehen, aber weiß nicht, wie ich weitermachen soll.
Sirius3
User
Beiträge: 18250
Registriert: Sonntag 21. Oktober 2012, 17:20

@lea.0208: Du hast schon eine Funktion `naechstesDatum`, das ein Tuple (tag, monat, jahr) nimmt und den nächsten Tag berechnet. Für das Weihnachtsfest ist das Jahr egal, also mußt Du nur tag und monat vergleichen.

Jetzt fehlt Dir noch eine Funktion, die einen String "DDMMYYYY" in solch ein Tuple wandelt. `int` und Indexzugriff kennst Du schon, wo ist also noch das Problem?
Benutzeravatar
__blackjack__
User
Beiträge: 13999
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Eine Lösung in Python die Schaltjahre berücksichtigt:

Code: Alles auswählen

#!/usr/bin/env python3
from datetime import date as Date, datetime as DateTime


def ask_date():
    while True:
        answer = input("Bitte ein Datum eingeben (DDMMYYYY): ")
        if len(answer) < 8:
            print("Eingabe zu kurz!")
        elif len(answer) > 8:
            print("Eingabe zu lang!")
        else:
            try:
                return DateTime.strptime(answer, "%d%m%Y").date()
            except ValueError:
                print("Das ist kein gültiges Datum!")


def calculate_days_to_christmas(date):
    next_christmas_date = Date(
        date.year + (date.month == 12 and date.day >= 24), 12, 24
    )
    assert next_christmas_date > date
    return (next_christmas_date - date).days


def main():
    try:
        date = ask_date()
        days = calculate_days_to_christmas(date)
        print(f"Es sind {days} Tage von {date} bis Weihnachten.")
    except KeyboardInterrupt:
        pass


if __name__ == "__main__":
    main()
Und eine in BASIC die keine Schaltjahre berücksichtigt und deshalb den Benutzer auch nicht nach dem Jahr fragt, welches dann ja überhaupt gar nicht benötigt wird:

Code: Alles auswählen

   10 DIM MD(12),D(12):FOR I=1 TO 12:READ MD(I):NEXT
   20 D(12)=24:FOR I=11 TO 1 STEP -1:D(I)=D(I+1)+MD(I):NEXT
   30 PRINT"================================"
   40 PRINT"CALCULATE DAYS TO NEXT CHRISTMAS"
   50 PRINT"================================":PRINT
  100 D$="":INPUT "DATE (DDMM)";D$:IF D$="" THEN END
  110 IF LEN(D$)>4 THEN PRINT"DATE TOO LONG":GOTO 100
  120 IF LEN(D$)<4 THEN PRINT"DATE TOO SHORT":GOTO 100
  130 M=VAL(RIGHT$(D$,2))
  140 IF M<1 OR M>12 THEN PRINT"MONTH OUT OF RANGE":GOTO 100
  150 D=VAL(LEFT$(D$,2))
  160 IF D<1 OR D>MD(M) THEN PRINT"DAY OUT OF RANGE":GOTO 100
  170 :
  180 GOSUB 200:PRINT R;"DAY(S) TO CHRISTMAS.":GOTO 100
  190 :
  200 REM CALCULATE DAYS TO X-MAS
  210 IF M=12 AND D>=24 THEN R=365-(D-25):RETURN
  220 R=D(M)-D:RETURN
  230 :
  300 E=357:REM TEST CODE
  310 FOR M=1 TO 12:FOR D=1 TO MD(M):GOSUB 200:IF R<>E THEN 340
  320 E=E-1:IF E<1 THEN E=366
  330 NEXT:PRINT M,:NEXT:PRINT"PASSED":END
  340 PRINT:PRINT"FAILED DAY";D;"MONTH";M
  350 PRINT"EXPECTED";E;"GOT";R:END
  360 :
  980 REM DAYS PER MONTH
  990 DATA 31,28,31,30,31,30,31,31,30,31,30,31
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Antworten