Problem bei Altersausgabe

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
fabi09
User
Beiträge: 6
Registriert: Donnerstag 6. Januar 2022, 14:39

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)
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
fabi09
User
Beiträge: 6
Registriert: Donnerstag 6. Januar 2022, 14:39

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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"?
fabi09
User
Beiträge: 6
Registriert: Donnerstag 6. Januar 2022, 14:39

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
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
fabi09
User
Beiträge: 6
Registriert: Donnerstag 6. Januar 2022, 14:39

Genau da hänge ich ich habe nämlich absolut keine Ahnung
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
fabi09
User
Beiträge: 6
Registriert: Donnerstag 6. Januar 2022, 14:39

Könntest du mir evtl. ein Beispiel schreiben mit der Jahreszahl noch, ich tue mich grad ehrlich schwer die Punkte zu kombinieren?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich finde drei Zahlen unter Anwendung der Grundrechenarten zu kombinieren ist zumutbar, und das solltest du alleine schaffen.
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

@__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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

🤦‍♂️ Wo du recht hast… wobei mein Trick ja trotzdem funktionieren würde. Allerdings auch wieder runden etc. Braucht. Also nicht so elegant.
fabi09
User
Beiträge: 6
Registriert: Donnerstag 6. Januar 2022, 14:39

Hab es jetzt hinbekommen. Vielen Dank euch! :)
Antworten