Dionysos211 Geschrieben 3. November 2010 Geschrieben 3. November 2010 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 Zitieren
Klotzkopp Geschrieben 4. November 2010 Geschrieben 4. November 2010 - 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. Zitieren
Dionysos211 Geschrieben 4. November 2010 Autor Geschrieben 4. November 2010 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: Zitieren
Klotzkopp Geschrieben 4. November 2010 Geschrieben 4. November 2010 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..Weißt du denn, was Zeiger und Strukturen sind? Zitieren
Dionysos211 Geschrieben 4. November 2010 Autor Geschrieben 4. November 2010 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... Zitieren
Klotzkopp Geschrieben 4. November 2010 Geschrieben 4. November 2010 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. Zitieren
Dionysos211 Geschrieben 4. November 2010 Autor Geschrieben 4. November 2010 (bearbeitet) 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 4. November 2010 von Dionysos211 Zitieren
Dionysos211 Geschrieben 4. November 2010 Autor Geschrieben 4. November 2010 P.S Hab da noch was über ctime gefunden, diese Funktion gibt es ja irgendwie auch in der time.h und wandelt die Sekunden aus time(&zeitInSekunden) in einen lesbaren String um welchen man dann direkt ausgeben kann und da spukt er dann das komplette Datum aus.. mit wochentag usw.. Zitieren
Klotzkopp Geschrieben 4. November 2010 Geschrieben 4. November 2010 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? Zitieren
Dionysos211 Geschrieben 4. November 2010 Autor Geschrieben 4. November 2010 Naja der zweite teil der Ausgabe soll ja so sein: Seit dem 01.01.1970 sind vergangen: 38 Jahre, 6 Tage, 8 Stunden, 6 Minuten und 46 Sekunden und nicht welcher Tag heute ist :/ oda seh ich da grad den Wald vor lauter Bäumen nicht ? Zitieren
Klotzkopp Geschrieben 4. November 2010 Geschrieben 4. November 2010 Ich verstehe das Problem nicht. Hast du dir die Dokumentation der tm-Struktur angesehen? Da stehen doch genau diese Werte drin. Zitieren
Dionysos211 Geschrieben 4. November 2010 Autor Geschrieben 4. November 2010 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 ? Zitieren
Klotzkopp Geschrieben 5. November 2010 Geschrieben 5. November 2010 also muss ich das immer mit localtime angehn ja ?Nein, wie ich schon sagte, du kannst das auch selbst machen. Du kannst das, was die Funktion localtime macht, auch in deinem eigenen Code umsetzen. Ich vermute übrigens, dass genau das bei dieser Aufgabe beabsichtigt ist, nicht die Verwendung von localtime. Zitieren
Dionysos211 Geschrieben 5. November 2010 Autor Geschrieben 5. November 2010 Also du meinst das ich mir eine eigene struktur schreibe und nicht die tm aus time.h verwende ? Zitieren
Klotzkopp Geschrieben 5. November 2010 Geschrieben 5. November 2010 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. Zitieren
Dionysos211 Geschrieben 5. November 2010 Autor Geschrieben 5. November 2010 genau wegen den Schaltjahren und den Schaltsekunden dachte ich mir das mein Ansatz falsch ist... ich denke schon das dies relevant ist... und das bekomm ich ja nur über die Funktionen in time.h geregelt oder ? Zitieren
Klotzkopp Geschrieben 5. November 2010 Geschrieben 5. November 2010 und das bekomm ich ja nur über die Funktionen in time.h geregelt oder ?Und zum dritten Mal: Nein. In diesen Funktionen passiert nichts, das du nicht auch selbst programmieren könntest. Es mag aufwändig sein, aber du brauchst diese Funktionen nicht zwangsläufig. Zitieren
Dionysos211 Geschrieben 5. November 2010 Autor Geschrieben 5. November 2010 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.. Zitieren
Dionysos211 Geschrieben 5. November 2010 Autor Geschrieben 5. November 2010 und natürlich bei 5. dabei schaltjahre berücksichtigen.. irgendwie.. :/ *mir dröhnt der kopf* Zitieren
Klotzkopp Geschrieben 5. November 2010 Geschrieben 5. November 2010 3. den Wert (sekunden seit 1.1.1970) der variable dann an eine struktur gebenErstens 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. Zitieren
Dionysos211 Geschrieben 5. November 2010 Autor Geschrieben 5. November 2010 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.. :/ Zitieren
Dionysos211 Geschrieben 5. November 2010 Autor Geschrieben 5. November 2010 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; } Zitieren
Dionysos211 Geschrieben 5. November 2010 Autor Geschrieben 5. November 2010 und irgendwie haut das auch nicht hin wenn ich zeitInSekunden mal auf den Wert der Beispielausgabe der Aufgabe setze.. also auf 1225267606 Sekunden... das wären dann 38 Jahre und 311 vergangene Tage anstatt 38 Jahre und 6 vergangene Tage.. -.- Zitieren
Klotzkopp Geschrieben 5. November 2010 Geschrieben 5. November 2010 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. Zitieren
Dionysos211 Geschrieben 5. November 2010 Autor Geschrieben 5. November 2010 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... Zitieren
Empfohlene Beiträge
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.