Eingegebene Sekunden in Jahr/tag/Stunden

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
soujar
User
Beiträge: 5
Registriert: Montag 20. November 2023, 18:50

Hallo zusammen,

mein Name ist Klaus, ich bin 53 Jahre alt und neu hier. Ich versuche mich zurzeit an Programmiersprachen, genauer gesagt an C und Python. Leider ist C und Python doch sehr unterschiedlich und deshalb würde ich euch gerne um Hilfe bitten.

Ich versuche in Python ein Programm zu schreiben das meine eingegebene Sekundenanzahl in Jahr-Monat-Tage-Minute-Sekunde rausgibt.

Beispiel: ich gebe 7464643 Sekunden ein und es soll mir anzeigen das es 0 Jahre, 86 Tage, 9 Stunden, 30 Minuten und 42 Sekunden sind.

In C hätte ich das ganze über Modulo gemacht. Leider verstehe ich nicht wie ich das in Python machen kann.

So habe ich angefangen aber das ist leider falsch:


seconds = int(input("Gebe die anzahl der Sekunden : "))

jahr = round(seconds/31540000)
tag = round(seconds/86400)
stunde = round(seconds/3600)
minute = round(seconds/60)
sekunde = round(seconds)

print(""+str (sekunde)+" Sekunden sind "+str (jahr)+" Jahr(e), "+str (tag)+" Tage, "+str (stunde)+" Stunde(n), "+str (minute)+" Minute(n) und "+str (sekunde)+" Sekunden")


Ich wäre euch dankbar wenn Ihr mir helfen könntet und freue mich ein Teil von diesem Forum zu sein.

Liebe Grüße

Klaus
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hallo Klaus,

Modulo geht in Python mit dem %-operator. Wie auch in C. Das fehlende Puzzlestück ist denke ich eher die ganzzahlige Division, die du mit // bekommst. Python hat das vor einigen Jahren eingeführt, weil mehr Leuten die Nachkommastellen gefehlt haben.

Die Ausgabe macht sich übrigens DEUTLICH leichter mit Format-strings:

Code: Alles auswählen

print(f"{sekunde} sind {jahr} Jahre, …")
Würde ich dir ans Herz legen, die zu verwenden.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei ich dafür statt so grosser Sekundenzahlen wohl eher die `divmod()`-Funktion verwendet hätte um die Zahl(en) immer weiter herunter zu brechen. Ist IMHO verständlicher beim lesen und deshalb auch weniger fehleranfällig.

Die `divmod()`-Funktion gibt es auch in Python und C, aber in Python ist es praktisch, dass man ein iterierbares Objekt gleich bei der Zuweisung schon an mehrere Namen zuweisen/aufteilen kann.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
soujar
User
Beiträge: 5
Registriert: Montag 20. November 2023, 18:50

Hallo Deets,

danke für deine so schnelle Antwort und dein Hilfreichen Tipp. Ich werde mich nochmal ran versuchen und würde falls es nicht klappt oder falls es klappt, gerne nochmal hier melden, wenn das für euch in Ordnung ist. Bitte nimmt es mir nicht übel wenn ich doch sehr langsam bin oder die Sachen nicht ganz verstehe. Programmiersprachen sind sehr neu für mich.


Liebe Grüße

Klaus
soujar
User
Beiträge: 5
Registriert: Montag 20. November 2023, 18:50

Hallo Blackjack,

danke für deine Antwort. Müsste ich dann das divmod () so einsetzen: divmod(jahr = round(seconds//31540000))?
Wenn es dir keine Umstände macht, könntest du mir kurz erläutern wie das aussieht? Ich bedanke mich für eure Unterstützung!

LG

Klaus
Benutzeravatar
DeaD_EyE
User
Beiträge: 1021
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Code: Alles auswählen

sekunden = 3661

stunden, sekunden = divmod(sekunden, 3600)
minuten, sekunden = divmod(sekunden, 60)
Iterierbare endliche Objekte können Namen zugewiesen werden.
Auf der linken Seite vor dem Gleichheitszeichen befinden sich Namen, denen das iterierbare Objekt auf der rechten Seite zugewiesen werden soll.

Die Funktion divmod gibt eine Tuple mit zwei integer/float aus.
Ach, die Hilfe spricht doch für sich selbst:

Code: Alles auswählen

help(divmod)

Help on built-in function divmod in module builtins:

divmod(x, y, /)
    Return the tuple (x//y, x%y).  Invariant: div*y + mod == x.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Man würde von Sekunden hin zu immer größeren Zeiteinheiten gehen:

Code: Alles auswählen

rest_in_minuten, sekunden = divmod(gesamtzeit_in_sekunden, 60)
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Du meinst aber doch sicherlich

Code: Alles auswählen

minuten, rest_in_sekunden = divmod(gesamtzeit_in_sekunden, 60)
und dann weiter

Code: Alles auswählen

stunden, rest_in_minuten = divmod(minuten, 60)
tage, rest_in_stunden = divmod(stunden, 24)
jahre , rest_in_tage = divmod(tage, 365)
print(jahre, rest_in_tage, rest_in_stunden, rest_in_minuten, rest_in_sekunden)
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie Du die Variablennamen nennst, ist ja zweitrangig. Mit Rest habe ich gemeint, dass das der Teil ist, der noch nicht Aufgeteilt worden ist.
soujar
User
Beiträge: 5
Registriert: Montag 20. November 2023, 18:50

Hallo zusammen,

vielen lieben Dank für die Hilfreichen Antworten! Ich habe versucht das meiste umzusetzen jedoch kommt bei mir ein falsches Ergebnis dabei raus.

Code: Alles auswählen

sekunden = int(input("Gebe die anzahl der Sekunden : "))

minuten, rest_in_sekunden = divmod(sekunden, 60)
stunden, rest_in_minuten = divmod(minuten, 360)
tage, rest_in_stunden = divmod(stunden, 24)
jahre , rest_in_tage = divmod(tage, 365)


print(f"{sekunden} Sekunde(n) sind {jahre} Jahr(e), {rest_in_tage} Tag(e), {rest_in_stunden} Stunde(n), {rest_in_minuten} Minute(n) und {rest_in_sekunden} Sekunde(n)")
das Ergebnis davon ist das :
Gebe die anzahl der Sekunden:
7464643
7464643 Sekunde(n) sind 0 Jahr(e), 14 Tag(e), 9 Stunde(n), 210 Minute(n) und 43 Sekunde(n)

Das scheint mir leider etwas falsch zu sein :(

LG

Klaus
soujar
User
Beiträge: 5
Registriert: Montag 20. November 2023, 18:50

Hallo Zusammen,

ich bedanke mich bei euch allen für eure Hilfe! Ich habe soeben mein Fehler entdeckt und freue mich auf das nächste mal. Ich hoffe Ich werde einmal so gut wie Ihr!

LG

Klaus
Antworten