Zum Inhalt springen

Hilfe bei funktionsweise von time.h


Dionysos211

Empfohlene Beiträge

Hallo!

Ich hab da eine Aufgabe bei der ich nicht so recht weiter komme -.-

Da ich die Funktionsweise der Header time.h nicht gänzlich verstehe.

Das hier ist die Vorgabe:

#include <stdio.h>

#include <stdlib.h>

#include <ctime>


int main ( void )

{


int zeitInSekunden = time(0);


// Zahl der Sekunden // seit dem 01.01.1970

printf("Seit dem 01.01.1970 sind %d Sekunden vergangen.\n", zeitInSekunden);


	system ( "Pause" );


	return 0;

}
und DAS soll ich jetzt "pimpen" damit die Ausgabe so auschaut:
Seit dem 01.01.1970 sind vergangen:

              1225267606 Sekunden


Das sind	  20421126 Minuten

oder		      340352 Stunden

oder		        14181 Tage

oder		          2025 Wochen

oder		              38 Jahre


38 Jahre Drücken Sie eine beliebige Taste . . .


Seit dem 01.01.1970 sind vergangen: 38 Jahre, 6 Tage, 8 Stunden, 6 Minuten und 46 Sekunden


Drücken Sie eine beliebige Taste . . .
Meine erste frage: - Das soll oben bestimmt nicht ctime heißen oder ? Mein letzter stand daszu ist time.h = C ctime.h = C++ Oder ? Ich habe dann so bischen unbeholfen losgegelegt und das kam dabei raus:

#include <stdio.h>

#include <stdlib.h>

#include <time.h>


int main (void)

{


	//Variable


	int zeitInSekunden = time(NULL);


	//Ausgabe


	printf ("Wieviel Zeit ist seit dem 01.01.1970 bis Heute vergangen?\n");

	printf ("Seit dem 01.01.1970 sind vergangen:\n");

	printf ("			%10d Sekunden\n", zeitInSekunden);

	printf ("Das sind	%10d Minuten\n", zeitInSekunden/60);

	printf ("oder		%10d Stunden\n", zeitInSekunden/60/60);

	printf ("oder		%10d Tage\n", zeitInSekunden/60/60/24);

	printf ("oder		%10d Wochen\n", zeitInSekunden/60/60/24/7);

	printf ("oder		%10d Jahre\n", zeitInSekunden/60/60/24/365);



	system ("Pause");


	return 0;

}

Nun bekomme ich das soweit wie es sein soll schonmal ausgegeben... auch eingreückt über rechtsbündig mit 10er platzhalter..

Nur... der WEG ist das ZIEL.. und ich hab schon in anderen Foren gelesen das man eigentlich den eleganteren weg über time_t wählen sollte... und strukture tm

aber da sind wir dann auch schon bei der time.h die ich nicht verstehe...

ich frikl das ganze mit xCode also mit GNU CC

Ich möchte hier eigentlich auch kein mach es so und fertig.. sondern ich will es verstehen...

Exakt gesagt:

Wie gebe ich die Systemzeit Time(0) so schön ausgeteilt in Minuten Sekunden eleganter dar und warum funktioniert das so..

Wie gebe ich die Systemzeit Time(0) welches ja bereits die Zeitdifferenz ist welche ich für Ausgabe der vergangenen Zeit brauche, so schön in Jahre Tage usw aus und nun zu meinem Absoluten Brett vor meinem Kopf...

WIE mach ich das unter Berücksichtigung der Schaltjahre -.-

mfg Dio

Link zu diesem Kommentar
Auf anderen Seiten teilen

- Das soll oben bestimmt nicht ctime heißen oder ?

Mein letzter stand daszu ist time.h = C ctime.h = C++ Oder ?

<ctime> ist für C++ schon richtig, das entspricht <time.h> für C. Allerdings müsste man dann konsequenterweise auch <cstdio> und <cstdlib> benutzen., denn <stdio.h> und <stdlib.h> gibt's für C++ nicht.

Mit der Funktion localtime kannst du einen time_t-Wert in eine tm-Struktur umrechnen lassen. Damit hast du dann alles schön aufgeteilt, und Schaltjahre sollte das auch von allein berücksichtigen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstmal danke für die Antwort!

Joa wir solln ja in C Programmieren und deshalb hab ich das ctime auch mal als Schreibfehler abgetan...

Soweit so gut... localtime das mit time_t und der tm-struktur ist leider genau das was ich nicht verstehe..

Ich muss dazu sagen ich bin so gesehn am Anfang meiner "C" Lernphase...

Ich versuch mir sehr viel selbst zu erklären nur mein Wissen langt anscheinend nicht aus um mir den code für time_t mit tm struktur herleiten zu können..

und einfach abschreiben will ich nicht.. das kann ja jeder... :)

Mag mir das wer mit Händen und Füßen zeigen ? :hells:

Link zu diesem Kommentar
Auf anderen Seiten teilen

In den Vorlesungen behandeln wir das Thema Pointer bzw Zeiger erst später.. dazu gehört dann wohl auch das arbeiten mit Strukturen... ^^

Deshalb hab ich wohl auch Verständnisprobleme :)

Nichts desto trotz hab ich mich da schonmal etwas eingelesen...

somit weiß ich jetzt das ich Zeiger in Funktionen verwenden kann ohne die Variable an sich zu benutzen...

In den kleinen Fummel Aufgaben wohl eher nicht relevant weil wir ja keine großen Datenmengen haben... später sicherlich sinnvoll und vor allem nicht schlecht damit bereits jetzt umgehen zu können..

Notiz: Zeiger deuten also auf eine Variable, sie Adressieren sie so zu sagen.. richitg ?

Und Strukturen sind dazu da um mehrere Variablen zu ordnen, dies können auch variablen unterschiedlicher Datentypen sein..

zb.

struct adresse {

	char name[50];

	char strasse[100];

	short hausnummer;

	long plz;

	char stadt[50];

};
Wenn ich jetzt eine Variable dieser Struktur habe, auf einen wert IN der variable zugreifen (ich hab eine Variablen struktur für adresseThomas erstellt):
printf("Name: %s\n", adresseThomas.name);

Dann müsste er mir den Namen bei s% ausspucken richtig ?

Aber wie ich das nun bei time_t anwenden soll ich mir irgendwie schleierhaft...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Notiz: Zeiger deuten also auf eine Variable, sie Adressieren sie so zu sagen.. richitg ?
Richtig. Zeiger sind Variablen, die auf andere Variablen verweisen können (ein Zeiger kann auch auf nichts zeigen).

Wenn ich jetzt eine Variable dieser Struktur habe, auf einen wert IN der variable zugreifen (ich hab eine Variablen struktur für adresseThomas erstellt):

printf("Name: %s\n", adresseThomas.name);
Dann müsste er mir den Namen bei s% ausspucken richtig ?
Wenn du adresseThomas vorher mit einem sinnvollen Wert gefüllt hast, ja. Wenn du einen Zeiger auf eine Struktur hast, greifst du nicht mit Punkt, sondern mit dem Pfeiloperator (->) auf die Elemente zu. Die Funktion localtime gibt laut Dokumentation einen Zeiger auf eine tm-Struktur zurück. Der Zeiger verweist auf eine Struktur, die in gmtime und localtime statisch angelegt ist, d.h. du brauchst dich nicht um das Speichermanagement zu kümmern (was bei Zeigern sonst häufig der Fall ist). Das bedeutet aber auch, dass die Inhalte der Struktur durch einen weiteren Aufruf von gmtime/localtime geändert werden können. Da du das aber sowieso nur einmal aufrufst, macht das nichts. Du brauchst also einen Zeiger auf eine tm-Struktur, und weist dieser den Rückgabewert von localtime zu:
struct tm *mytm;
mytm = localtime(zeitInSekunden);[/code] zeitInSekunden ist dabei deine Variable, die den Rückgabewert von time aufgenommen hat. Du solltest übrigens den Typ von int auf time_t ändern. Nach dem Aufruf von localtime kannst du auf die Elemente der Struktur zugreifen, z.B.
[code]mytm->tm_sec

Welche Typen und Bedeutung die einzelnen Elemente haben, kannst du wiederum der Dokumentation entnehmen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

So hab da eben mal n bischen mit rumgespielt :)

Aber erstmal dickes Dankeschön das du dir die Mühe machst mir das zu erklären!

zb kann ich mir dann so die aktuelle Uhrzeit ausgeben ^^


#include<stdio.h>

#include <stdlib.h>

#include<time.h>


int main() {


	time_t zeitInSekunden; //Variable zeitInSekunden deffinieren (time_t = long)


	time(&zeitInSekunden); //Abspeichern des Rückgabewertes von time (Sekunden Zeit 1.1.1970) in die Variable zeitInSekunden


	struct tm *zeitAnsage; //Erstellen/Benennen meiner Variablen Struktur durch den Zeiger *zeitAnsage (deffinition in time.h)


	zeitAnsage = localtime(&zeitInSekunden); //Abspeicher des Rückgabewertes von localtime (umwandlung der Sekunden aus &zeitInSekunden in das heutige Dateum + Zeit) in die Struktur (zeitAnsage)


	printf("%02d:%02d:%02d Uhr\n", zeitAnsage->tm_hour, zeitAnsage->tm_min, zeitAnsage->tm_sec);


	system("pause");


	return 0;

}

Soweit richtig ? Dann würd ich sagen hab ich das schonmal verstanden ;)

Aber dann kann ich die Ausgabe aus dem 1. Post von wegen Sekunden .... das sind Minuten oder Stunden usw... nur so machen wie ich das oben auch getan habe... richitg ?

denn localtime wandelt mir das ja jetzt für die struktur in einen "verständlichen" Wert/String um und speichert mir diesen anhand der tm struktur der time.h ab..

also danach kann ich ja nicht mehr sagen das so die vergangenen Sekunden so und soviel Minuten sind... oder stunden usw..

und für den Zweiten teil der Ausgabe muss ja jetzt irgendwie dahin kommen das ich die sekunden die da vergangen sind... (was ja dem heutigen Datum entspricht... was ich ja auch wiedergeben kann wenn ich meine so eben gebastelte Funktion erweitere)

so ausgeben das ich nicht sage heute IST sondern bis heute SIND vergangen so und so viele Jahre so und so viele Monate usw..

wie stell ich denn das an ?

Im Voraus vielen dank für deine Geduld ;)

Bearbeitet von Dionysos211
Link zu diesem Kommentar
Auf anderen Seiten teilen

Aber dann kann ich die Ausgabe aus dem 1. Post von wegen Sekunden .... das sind Minuten oder Stunden usw... nur so machen wie ich das oben auch getan habe... richitg ?
Nein, du kannst das auch "von Hand" ausrechnen. Die Funktion localtime kann ja auch nicht zaubern ;)

also danach kann ich ja nicht mehr sagen das so die vergangenen Sekunden so und soviel Minuten sind... oder stunden usw..
Klar kannst du. Deine time_t-Variable bleibt davon doch unberührt.

so ausgeben das ich nicht sage heute IST sondern bis heute SIND vergangen so und so viele Jahre so und so viele Monate usw..
Wo soll denn da der Unterschied sein? Wie sieht die gewünschte Ausgabe aus?
Link zu diesem Kommentar
Auf anderen Seiten teilen

moment ich glaub ich sehe grad wirklich den Wald vor lauter Bäumen nicht.. ^^

ich bastel mal n bischen...

ich seh schonmal das bei jahren sowas hier stehen muss.. da er da ja nicht mit 1970 arbeitet sondern mit 1900 als:

 zeitAnsage->tm_year-70
für die Differenz zu 1970.. oda so. ^^ noch ne andere frage .. dem hier:
struct tm *zeitAnsage;

muss ich dem immer mit localtime kommen oda kann ich auch da die sekunden "reinladen"..

ok ich glaub das klingt jetzt stümpferhaft...

ok anders ich erklär mir das jetzt so das localtime halt meine sekunden aus time() so umbastelt das die tm struktur passend damit gefüttert werden kann..

also muss ich das immer mit localtime angehn ja ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also du meinst das ich mir eine eigene struktur schreibe und nicht die tm aus time.h verwende ?
Wie du die Daten strukturierst, ist egal. Die Berechnung ist der entscheidende Teil, also wie du von einer Anzahl Sekunden auf ein Datum kommst.

Knifflig ist dabei, dass durch Schaltjahre die Anzahl der Tage pro Jahr nicht konstant ist, und durch Schaltsekunden die Anzahl der Sekunden pro Tag. Die Frage ist allerdings, ob du das für diese Aufgabe überhaupt berücksichtigen sollst.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok :/

Dann bin ich aber irgendwie wieder mit meinem Latein am Ende..

In meinem kopf schwirrt jetzt ne idee aber ich weiß nicht wie ich die genau umsetzen soll..

1. eine variable mit time_t deklarieren

2. dieser variable den wert von Time(0) zuweisen

3. den Wert (sekunden seit 1.1.1970) der variable dann an eine struktur geben

4. die Sruktur soll dann zb variablem für sekunden an sich und dann minuten stunden usw haben...

- Sprich ich pack die sekunden in die Struktur (und zwar an jede stelle der struktur also jeweils den kompletten sekunden wert)und in der Struktur werden die Sekunden dann jeweils in den wert umgerechnet, anzahlSekunden=anzahlMonate-

5. den wert der variablen die den wert time(0) hat so aufdröseln das diese den summenwert an sekunden in Jahre Monate Tage wieder gibt..

also das sind so viele jahre .. rest = so viele monate rest gleich so viele tage..

das am besten auch über ne eine andere struktur abgreifen..

so das ich mir einmal eine ausgabe basteln kann die mir sagt

das die der Wert der Sekunden in etwa diesen wert an monaten hat...

(da kommt ja ne kommazahl raus)

und halt auch für zb jahre: anzahlSekunden=anzahlJahre

halt so wie 1000g = 1Kg

und für den zweiten teil der ausgabe halt erst den gößten wert und dann das was übrig bleibt immer in den kleineren...

so wie 1043,5g sind 1Kg und 43g und 5 mg

Mein programmieren know-how ist leider so was von am Anfang das ich es mir zwar schön vorstellen kann aber an der Umsetzung scheiter..

Link zu diesem Kommentar
Auf anderen Seiten teilen

3. den Wert (sekunden seit 1.1.1970) der variable dann an eine struktur geben
Erstens brauchst du nicht unbedingt eine Struktur, und zweitens lässt du hier den entscheidenden Teil unter den Tisch fallen: Die Berechnung. Die hat nichts damit zu tun, ob du die Ergebnisse in einer Struktur hast oder in einem Satz int-Variablen.

Mein programmieren know-how ist leider so was von am Anfang das ich es mir zwar schön vorstellen kann aber an der Umsetzung scheiter..

Mach's doch erst mal ohne Schaltjahre und Schaltsekunden.

Ein Jahr hat 365 * 24 * 60 * 60 = 31.536.000 Sekunden.

Du teilst also deine Gesamtsekundenzahl durch 31536000, dann hast du die Anzahl der Jahre. Diesen Wert, multipliziert mit 31536000, ziehst du dann von deiner Gesamtsekundenzahl ab. Übrig bleiben die Sekunden, die kein vollständiges Jahr ergeben. Und damit machst du mit der nächstkleineren Einheit (Tag) genauso weiter.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Genau das hatte ich mir gestern mal in Excel gebastelt um zu überprüfen ob in der "So soll es mal aussehen" Ausgabe der Aufgabe die Schaltsekunden/Schaltjahre berücksichtigt wurden.

also hab das so ausgerechnet als hätte mir time(0) den wert:

1225267606 Sekunden ausgespuckt...

und hab dann genau das gemacht wie du es beschrieben hast...

bis auf Jahre runtergebrochen... die zahl vor dem Komma dann wieder in Sekunden und das vom time(0) wert abgezogen... den rest dann wieder bis auf Wochen hoch.. und das vorm Komma wieder in Sekunden... usw..

nur als ich dann bei tagen angekommen bin, stand vorm Komma eine 3 und keine 6 wie laut Beispielaufgabe aber hätte der Fall sein müssen.. :/

Link zu diesem Kommentar
Auf anderen Seiten teilen

hab das ganze jetzt mal so gebastelt :/

aber ich glaub das ist halt nicht richitg weil ich keine rüsicht auf schaltjahre genommen habe... -.-

wie könnte man das jetzt noch weiter verbessern ?

#include <stdio.h>

#include <stdlib.h>

#include <time.h>


int main (void)

{

	int zeitInSekunden = time(0);

	int zeitInMinuten = zeitInSekunden/60;

	int zeitInStunden = zeitInMinuten/60;

	int zeitInTagen = zeitInStunden/24;

	int zeitInWochen = zeitInTagen/7;

	int zeitInJahren = zeitInTagen/365;


	printf("\nSeit dem 01.01.1970 sind %d Sekunden vergangen.\n\n", zeitInSekunden);


	printf("Das sind %d Minuten\n", zeitInMinuten);

	printf("oder\t   %d Stunden\n", zeitInStunden);

	printf("oder\t    %d Tage\n", zeitInTagen);

	printf("oder\t     %d Wochen\n", zeitInWochen);

	printf("oder\t       %d Jahre\n\n", zeitInJahren);


	int vergangeneJahre = zeitInJahren;

	int vergangeneTage = zeitInTagen%365;

	int vergangeneStunden = zeitInStunden%24;

	int vergangeneMinuten = zeitInMinuten%60;

	int vergangeneSekunden = zeitInSekunden%60;


	printf ("Seit dem 01.01.1970 sind vergangen:\n%d Jahre,\n%d Tage,\n%d Stunden,\n%d Minuten\nund %d Sekunden\n\n", vergangeneJahre, vergangeneTage, vergangeneStunden, vergangeneMinuten, vergangeneSekunden);


	return 0;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mach doch bitte die Berechnung so, wie ich sie vorgeschlagen habe. Nicht mit Modulo.

Nachtrag: 6 ist definitiv falsch. Ich weiß nicht, was das Beispielprogramm da gerechnet hat, aber laut localtime entspricht diese Zeit dem 303. Tag des Jahres. Die 311 klingt da gar nicht so schlecht und ist vermutlich durch das Ignorieren der Schaltjahre entstanden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

ne das meinte ich nicht... ist mir klar das wenn ich mit der funktion time arbeite er immer die aktuelle systemzeit nimmt...

deshalb hatte ich die auch raus genommen und für den "gegenversuch halt einfach geschrieben

zeitInSekunden = 1225267606

also hätte ich da sogar auch die time.h rausschmeißen könn..

weil es ja stumpfes rechnen ist... er musste ja nix auslesen.. also keine systemzeit... und ich bin auf 311 tage gekommen.. :/

habs jetzt mal so gemacht...


int main (void)

{

	time_t zeitInSekunden;

	time(&zeitInSekunden);

	struct tm *zeitVergangen;

	zeitVergangen = localtime(&zeitInSekunden);

	int zeitInMinuten = zeitInSekunden/60;

	int zeitInStunden = zeitInMinuten/60;

	int zeitInTagen = zeitInStunden/24;

	int zeitInWochen = zeitInTagen/7;

	int zeitInJahren = zeitInTagen/365;


	printf("Seit dem 01.01.1970 sind %d Sekunden vergangen.\n\n", zeitInSekunden);


	printf("Das sind %d Minuten\n", zeitInMinuten);

	printf("oder   %d Stunden\n", zeitInStunden);

	printf("oder    %d Tage\n", zeitInTagen);

	printf("oder     %d Wochen\n", zeitInWochen);

	printf("oder       %d Jahre\n\n", zeitInJahren);



	printf ("Seit dem 01.01.1970 sind vergangen:\n%d Jahre,\n%d Tage,\n%d Stunden,\n%d Minuten\nund %d Sekunden\n\n", zeitVergangen->tm_year-70, zeitVergangen->tm_yday, zeitVergangen->tm_hour, zeitVergangen->tm_min, zeitVergangen->tm_sec);


	return 0;

}

und dazu gleich die frage:

der haut mir da jetzt ne warnung raus.. von wegen ich hab das ja als time_t deklariert.. und würde da jetzt %d nutzen was falsch wäre denn das ist für int...

funktioniert trotzdem... und vorher hatte er beim dem was ich da mit der zeitansage geschreiben hab auf seite 1 dieses Threads hier ja auch nicht rumgemeckert...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...