http://www.pronix.de -> Forum -> C-Programmieren

Unterseiten

Forum: C-Programmieren

Moderatoren: juergen, Martin Conrad

Thema: Anfängerfrage zur Zeitangabe

  • (nur registrierte Mitglieder)

Anfängerfrage zur Zeitangabe

sonja1893 am 01.04.2004 um 13:02

Hallo zusammen!
Ich bin absoluter Anfänger beim C-Programmieren. Ich soll für die Schule eine Aufgabe lösen und ich weiß nicht, wie ich das machen soll. Grafik: Smilie Traurig Wir hatten bis jetzt nur sehr wenige Befehle und damit soll ich nun diese Aufgabe lösen:

"Die Time-Bibliotheksfunktion time(int *) speichert durch einen Aufruf wie
int zeit;
time(&zeit);
in der Variablen zeit die Anzahl der vergangenen Sekunden seit 1970-01-01, 00:00 Uhr.
Entwickeln Sie ein Programm, das darauf aufbauend die Uhrzeit im Format hh:mm:ss am Bildschirm ausgibt.
Anmerkung: Wird beim printf-Kommando der Platzhalter %02d verwendet, so wird die übergebene Integerzahl zweistellig mit führenden Nullen ausgegeben."

So, das ist sie. Ich hoffe, ihr könnt mir helfen.

Sonja
 

Anfängerfrage zur Zeitangabe

cyntia am 01.04.2004 um 13:37

Hallo Sonja,

damit sollte es gehen (bei mir tuts das jedenfalls).

Gruß
cyntia

#include <stdio.h>
#include <conio.h>
#include <time.h>

/* ---- globale Variablen ---- */

/* ---- Prototypen ---- */
time_t time(time_t *timer);
char *ctime(const time_t *time);
struct tm *localtime(const time_t *timer);
struct tm *gmtime(const time_t *timer);
/* ---- START main ---- */
int main() {

/* ---- lokale Variablen ---- */
time_t jetzt;
struct tm DZStruktur;
char DZString[26];
/* ---- Anweisungen ---- */
clrscr();
jetzt = time(NULL);
DZStruktur=*localtime(&jetzt);
strcpy(DZString,asctime(&DZStruktur));
printf("\n\n\n\t\t %02d",DZStruktur.tm_hour);
printf(".%02d",DZStruktur.tm_min);
printf(".%02d",DZStruktur.tm_sec);

fflush(stdin);
getch();
return 0;
}
 

Anfängerfrage zur Zeitangabe

tankard am 01.04.2004 um 15:56

Das geht aber auch einfacher (sprich: weniger C, aber ein bissel mehr Mathe...)

#include <stdio.h>
#include <time.h>

int main(void) {
  time_t zeit;
  int stunde, minute, sekunde;

  time(&zeit);

  sekunde = zeit % 60;
  minute = (zeit % 3600)/60;
  stunde = (zeit % 86400)/3600;

  printf("%02d:%02d:%02d\n", stunde+2, minute, sekunde);

  return 0;
}

Bei den Stunden braucht man +2, weil die Funktion time() die Zeit von Greenwich (also GMT) verwendet. GMT hat zu "unserer" Zeit eine Stunde Unterschied. Ausserdem muss man noch die Sommerzeit ausgleichen (noch eine Stunde Unterschied).

Du kannst Dir ja mal selbst überlegen, warum das klappt. Ich will Dir ja nicht den ganzen Spass an den Hausaufgaben verderben Grafik: Smilie Zwinker.
Ansonsten frag einfach nochmal Grafik: Smilie Gluecklich.


tankard

--
C++ is an octopus made by nailing extra legs onto a dog!

 

Anfängerfrage zur Zeitangabe

sonja1893 am 02.04.2004 um 13:14

@ tankard:
Vielen Dank! Genau das war es, was ich gebraucht habe.
Die ganzen Befehle aus cyntias Beitrag hatten wir alle noch nicht. Es war also schon so gedacht, dass wir dafür mehr Mathe können müssen als C. Grafik: Smilie Zwinker

Könntest du die Rechnungen mal kurz erläutern? Ich will nur sicher sein, dass ich das Richtige sage, wenn ich danach gefragt werde. Grafik: Smilie Lachend
 

Anfängerfrage zur Zeitangabe

tankard am 02.04.2004 um 15:57

Ich versuch's mal:
Zunächst zu

sekunde = zeit % 60;

Der %-Operator liefert den Rest bei einer ganzzahligen Division. Wenn ich also "zeit%60" Rechne, dann unterteile ich "zeit" im Prinzip in 60er-Packs (also Minuten) und bekomme als Ergebnis die Sekunden, die zu keiner vollen Minute mehr gehören (oder wenn's aufgeht eben 0). Z.B. sind 150 Sekunden 2 Minuten und 30 Sekunden (also 60+60+30 Sekunden). Deshalb ist 150%60=30. Und das war ja gesucht.
Und bei

minute = (zeit % 3600)/60;

macht man es zunächst mal genauso. Allerdings schneidet man sich hier die Sekunden ab, die nicht mehr in eine volle Stunde passen. Da eine Stunde 3600 Sekunden hat (60*60) rechnet man also "zeit%3600". Jetzt hat man schon das Gesuchte, allerdings in der Einheit Sekunden. Man muss das nur noch in Minuten umrechnen, also nochmal durch 60 Teilen. Hier nutzt man aus, dass der /-Operator nur das ganzzahlige Ergebnis der Division zurückliefert (also die vollen 60er-Packs). Z.B. ist 150%3600=150 und 150/60=2 (der Rest wird einfach abgeschnitten).
Mit der Zeile

stunde = (zeit % 86400)/3600;

geht es dann analog. Nur werden jetzt die Sekunden abgeschnitten, die nicht mehr in einen vollen Tag gepasst haben (ein Tag hat 60*60*24=86400 Sekunden). Das ergebnis wird dann aber diesmal nicht in Minuten sonder in Stunden umgerechnet. Z.B. 150%86400=150 und 150/3600=0.
Wenn man das Programm also 150 Sekunden nach Beginn des 1.1.1970 laufen lässt, bekommt man die Uhrzeit 00:02:30. Und so sollte es ja auch sein.
Ich hoffe, Du kannst mit den Erklärungen was anfangen Grafik: Smilie Gluecklich.

tankard

--
C++ is an octopus made by nailing extra legs onto a dog!

 
  • (nur registrierte Mitglieder)