[C++] Zeitfunktion tm_hour

moayenrai

DearS
ID: 277599
L
11 März 2007
156
15
Moin,

wir sollen als Infohausaufgabe eine Uhr die über ein Java applet läuft programmieren.

Um die Uhrzeit herauszubekommen habe ich folgende Funktion

PHP:
time_t Zeitstempel;
tm *nun;
Zeitstempel = time(0);
nun = localtime(&Zeitstempel);

Die Ausgabe per

cout << nun->tm_hour << ':' << nun->tm_min << ':' << nun->tm_sec << endl;

funktioniert auch perfekt.

Jetzt muss ich aber die Zeiten in das Bogenmaß umrechen, was auch bei den Minuten und Sekunden klappt.

Aber sobald ich mit den Stunden rechnen will kommt immer -3 raus >.<

ha=(2*M_PI/60)*(nun->tm_hour/24*60-15);

bei den Minuten kommt das richtige raus

ma=(2*M_PI/60)*(nun->tm_min-15);

Kann mir jemand sagen, wie ich das richtige Ergebnis herausbekomme?
 
Zuletzt bearbeitet:
Jetzt muss ich aber die Zeiten in das Bogenmaß umrechen, was auch bei den Minuten und Sekunden klappt.

Aber sobald ich mit den Stunden rechnen will kommt immer -3 raus >.<

ha=(2*M_PI/60)*(nun->tm_hour/24*60-15);

bei den Minuten kommt es richtig raus

ma=(2*M_PI/60)*(nun->tm_min-15);
Schaut aus, als ob die (ohnehin nicht sinnvolle) Umrechnung in Minuten nicht funktioniert. KA, ich hab's jetzt nicht ausprobiert, aber ich würde es mal mit
Code:
ha=(2.0*M_PI/12.0)*static_cast<double>(nun->tm_hour%12-3);
versuchen. Eine normale Uhr zeigt halt nur 12 Stunden an und nicht 24, daher die Normierung auf 12 und auch der Modolu.

(Ansonsten solltest du dir auch darüber klar sein, welche Teile der Formel in Integer- bzw. Fließkomma-Arithmetik gerechnet werden.)

MfG
Sven
 
Aaahhh.. Es funktioniert ^^

Danke dir

Jetzt muss ich nur noch schaun wie du es ausgerechet hast. Also mit den 12 Stunden verstehe ich schon ma, war ein Denkfehler von mir.

Aber kann es sein, dass die Struktur von der Zeit in Int ist :think: (Wegen den letzten Satz)
 
Aber kann es sein, dass die Struktur von der Zeit in Int ist :think: (Wegen den letzten Satz)
Richtig [1], aber eigentlich wollte ich darauf hinweisen, dass deine Formel eine etwas fehleranfällige Mischung aus Integer und Fließkomma Datentypen enthält.

Bei 2*M_PI/60 ist M_PI ein double, d.h. der Compiler wandelt die 2, bevor er sie mit M_PI verechnen kann, auch ins double-Format. Das Ergebnis ist wiederum vom Typ double... Daher funktioniert diese Schreibweise.
Wenn du die Formel z.B. als (2/60*M_PI)*(nun->tm_min-15) schreibst, würde sie nicht mehr funktionieren. 2/60 ist für den Compiler eine Division zweier Integer, die als Ergebnis immer den Interger 0 ergibt.
Um zu verdeutlichen, dass der erste Fall gewollt ist, sollte man dort besser (2.0*M_PI/60.0) schreiben.

Da der Zähler für die Stunden (laut Dokumentation) ein Integer ist und auch der %-Operator nur für Integer definiert ist, wird der zweite Teil der Formel im Ganzzahlformat gerechnet und dann mittels static_cast<double>() ins double-Format umgewandelt. Die Typumwandlung würde der Compiler zwar auch automatisch machen, aber die explizite Typumwandlung ist IMO etwas deutlicher.

Der Modulo % entspricht dabei dem Teilungsrest. 18 % 12 = 6; 18 / 12 = 1 Rest 6; Es ist 18:00 Uhr und der Zeiger steht auf der Ziffer 6.

MfG
Sven

[1] https://www.willemer.de/informatik/cpp/timelib.htm
 
Ok, ich danke dir SvenF311.

Das mit den Fließkomma Datentypen muss ich mir nochmal genauer ansehen.

Das mit den % Operator wusste ich schon, nur das die Struktur im Datentyp Integer ausgegeben wird, war mir nicht klar. Dachte es wäre double (Also bei mir sind immer alle Zahlen in double, auch wenn sie dadurch doppelt soviel Speicher benötigen).

Unser Prof hat nur gesagt, wie sollen die Zeitfunktion aus der Compiler Hilfedatei nehmen (Was bei DEV++ schwierig ist, denn er hat keine).

Egal, jetzt funktioniert es und nochmals danke


MFG
Moayenrai