Seite 1 von 1

Problem bei Altersausgabe

Verfasst: Donnerstag 6. Januar 2022, 14:57
von fabi09
Hallo zusammen, ich muss für die Uni einen Code erstellen und habe ein Problem. Ich muss als letzten Schritt das Alter ausgeben, doch mir zeigt es egal wie ich es probiere einen/ verschiedene Fehler an. Ich hab Gefühlt schon alles probiert aber nichts klappt.

Die Eingabe soll als Datum gelesen werden und mit dem zweiten Datum berechnet werden.
Bsp.: 28 02 2005 und 29 02 2004 Alter wäre dann 0 Jahre.

Ich hänge bei wish_date, date, age --> Es ist egal wie es geschrieben ist oder wie viele str es sind, hat da einer für mich eine Idee?

Danke schonmal im Voraus! :)

Code: Alles auswählen

T = int(input())

for x in range(T):
    leer = input()
    wish = input()
    bday = input()
    element_wish  = wish.split()
    element_bday = bday.split()

    wish_dd = int(element_wish[0])
    wish_mm = int(element_wish[1])
    wish_year = int(element_wish[2])   

    dd = int(element_bday[0])
    mm = int(element_bday[1])
    year = int(element_bday[2])

    wish_date = 
    date = 
    age = 

    i = 0 + x
    i += 1

    if  dd > wish_dd and mm > wish_mm:
        print("Person #",i, ": Ungueltiges Geburtsdatum")
    elif  wish_year - year > 130:
        print("Person #",i, ": Zu alt")
    else:
        print("Person #",i, ":", age)

Re: Problem bei Altersausgabe

Verfasst: Donnerstag 6. Januar 2022, 16:06
von __blackjack__
@fabi09: Namen in Grossbuchstaben sind per Konvention für Konstanten, `T` sollte also anders heissen. Aber auch nicht `t`, denn einbuchstabige Namen sind in aller Regel keine guten Namen. Und auch kryptische Abkürzungen wie `bday` oder `dd` und `mm` sollte man nicht verwenden.

Für Datums- und Zeitangaben und zum Rechnen damit, gibt es in der Standardbibliothek das `datetime`-Modul.

Es ist verwirrend beim `input()` keinen Prompt anzugeben. Woher soll der Benutzer denn wissen wann er was eingeben muss? Und was soll `leer`? Das wird nirgends verwendet.

Wenn man zwei Datumseingaben erfragen muss und die irgendwie zum Rechnen umwandeln muss, dann sollte man das nicht zweimal in den Code schreiben, sondern eine Funktion dafür schreiben die man dann zweimal aufruft.

Selbst wenn man nicht `datetime` verwendet, könnte man sich alternativ überlegen wie man die Komponenten eines Datums in einem Objekt zusammenfassen kann, in einer Art, dass man ganz einfach die Vergleichsoperatoren verwenden kann um zwei Datumsangaben auf grösser/kleiner/gleich/grösser-gleich/kleiner-gleich vergleichen kann. Es gibt da was in den Grunddatentypen. Eigentlich sogar zwei, aber Listen würde man da eher nicht verwenden, weil dort in der Regel die Bedeutung des Wertes nicht von seinem Index abhängen sollte.

Null (0) zu einem Wert addieren ist irgendwie unsinnig. Und statt aus `x` ein `i` zu berechnen das immer um 1 grösser als `x` ist, sollte man die Schleife gleich über die richtigen Werte laufen lassen. Das `x` wird ja sonst für nichts anderes verwendet.

Das berechnen der Differenz von zwei Datumsangaben in Jahren würde ich in eine eigene Funktion auslagern.

Re: Problem bei Altersausgabe

Verfasst: Donnerstag 6. Januar 2022, 16:13
von Sirius3
Als erstes solltest Du sinnvolle Variablennamen vergeben, `T` hält sich zudem nicht an die Namenskonvention. bday? `mm` statt `month`!
Zu `x` wird 0 addiert? Warum? Und warum läuft die Schleife nicht gleich über `i`?
Warum muß man was in `leer` eingeben, ohne dass es gebraucht wird?

Mit `map` kann man einiges kompakter schreiben:

Code: Alles auswählen

amount = int(input())

for nr in range(1, amount + 1):
    wish = input()
    birthday = input()
    wish_day, wish_month, wish_year = map(int, wish.split())
    day, month, year = map(int, birthday.split())

    wish_date = 
    date = 
    age = 
    if  day > wish_day and month > wish_month:
        print("Person #{nr}: Ungueltiges Geburtsdatum")
    elif  wish_year - year > 130:
        print("Person #{nr}: Zu alt")
    else:
        print("Person #{nr}:", age)
Das Datumsformat ist sehr seltsam, normalerweise würde man ja "29.02.2004" eingeben.

Beschreib doch mal in Worten, wie Du das Alter einer Person berechnen würdest.

Re: Problem bei Altersausgabe

Verfasst: Donnerstag 6. Januar 2022, 16:26
von fabi09
Das Datumsformat wurde uns so vorgegeben, deswegen sind da keine Satzzeichen dazwischen.

Bei der Berechnung hatte ich überlegt das man die Liste evtl in ein Datum umändern kann und die dann einfach mit einander verrechnet, aber mit datetime hat es bei mir nicht ganz funktioniert und ich bin mir auch nicht sicher, ob wir das überhaupt verwenden dürfen

Re: Problem bei Altersausgabe

Verfasst: Donnerstag 6. Januar 2022, 16:29
von __deets__
Eine Datumsberechnung *ohne* datetime wird schon ganz schoen kompliziert. Schliesslich haengt das ja vom Monat und Schaltjahr ab, wieviele Tage zwischen zwei Datumsangaben liegen. Ich kann mir nicht vorstellen, dass ihr das alles selbst programmieren sollt. Oder was du da ausrechnest ist halt sehr ungenau.

Und was ausser datetime waere denn fuer dich "in ein Datum umaendern"?

Re: Problem bei Altersausgabe

Verfasst: Donnerstag 6. Januar 2022, 16:34
von fabi09
ich dachte eig das man die Liste irgendwie in ein int verwandeln kann und dann die zwei Daten von einander abziehen kann, aber dort wurde mir immer nur angezeigt das man den Operator "-" nicht verwenden darf

Re: Problem bei Altersausgabe

Verfasst: Donnerstag 6. Januar 2022, 16:52
von __blackjack__
Wenn `datetime` nicht verwendet werden soll/darf, vermute ich mal es soll wirklich einfach nur die Anzahl der Jahre berechnet werden. Für volle Punktzahl mit Berücksichtigung ob der Tag im Jahr von der zweiten Angabe schon am Geburtstags-Tag vorbei ist oder nicht.

``-`` darf man auf `int`-Werte anwenden. Also hast Du offensichtlich Dein Ziel die Liste in einen `int`-Wert umzuwandeln offenbar nicht umgesetzt.

Wie sollte das denn Deiner Meinung nach passieren, diese Umwandlung einer Liste mit den Teilen des Datums in *eine* ganze Zahl? Was bedeutet die? In welcher Einheit wäre die?

Re: Problem bei Altersausgabe

Verfasst: Donnerstag 6. Januar 2022, 16:55
von fabi09
Genau da hänge ich ich habe nämlich absolut keine Ahnung

Re: Problem bei Altersausgabe

Verfasst: Donnerstag 6. Januar 2022, 17:09
von __deets__
Es gibt zwei Möglichkeiten: in ein datetime-Objekt wandeln, wie gezeigt. Das ist der einfach weg. Oder die Werte normalisieren bezüglich eines Jahres. Das heißt einfach, dass die Monate mit einem zwölftel und die Tage mit einem 356stel eingehen in eine Berechnung. Da bekommst du dann zwei zahlen, und kannst die verrechnen.

Re: Problem bei Altersausgabe

Verfasst: Donnerstag 6. Januar 2022, 17:17
von fabi09
Könntest du mir evtl. ein Beispiel schreiben mit der Jahreszahl noch, ich tue mich grad ehrlich schwer die Punkte zu kombinieren?

Re: Problem bei Altersausgabe

Verfasst: Donnerstag 6. Januar 2022, 17:22
von __deets__
Ich finde drei Zahlen unter Anwendung der Grundrechenarten zu kombinieren ist zumutbar, und das solltest du alleine schaffen.

Re: Problem bei Altersausgabe

Verfasst: Donnerstag 6. Januar 2022, 17:23
von Sirius3
@__deets__: ich glaube Du bist irgendwo falsch abgebogen. Um das Alter zu berechnen muß man nur Jahre verrechnen und Monate und Tage vergleichen. Das geht auch in einem einfachen Einzeiler.

Re: Problem bei Altersausgabe

Verfasst: Donnerstag 6. Januar 2022, 17:29
von __deets__
🤦‍♂️ Wo du recht hast… wobei mein Trick ja trotzdem funktionieren würde. Allerdings auch wieder runden etc. Braucht. Also nicht so elegant.

Re: Problem bei Altersausgabe

Verfasst: Donnerstag 6. Januar 2022, 17:34
von fabi09
Hab es jetzt hinbekommen. Vielen Dank euch! :)