You are not logged in.

  • Login

1

Monday, November 27th 2006, 9:20pm

Jahr und Datum berechnen

folgender Auftrag:

Quoted

Schreiben Sie ein Programm, welches die aktuelle Zeit, gegeben in Sekunden, in folgendes Format
konvertiert:
Tag.Monat.Jahr Stunden:Minuten:Sekunden
Das Programm soll dazu einen long-Wert ¨uber die Konsole einlesen. Unsere Zeitrechnung startet
am 1.1.1970 0:00:00 Uhr. Die aktuelle Zeit wird durch den long-Werte, der die Anzahl der
Sekunden nach dem 1.1.1970 0:00:00 Uhr angibt, beschrieben. Abweichungen durch Zeitzonen
sind zu ignorieren.
Hinweis: Beachten Sie die Schaltjahre nach dem gregorianischen Kalender.


mein Quelltext:

C Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <iostream>
using namespace std;
 
int main ()
{
long wert;
long tag=0,monat=0,jahr=0,stunde=0,minute=0,sek=0,schaltjahr=0;
 
// Schaltjahre = alle 4 Jahre, außer Jahr 100, dafür ist Jahr 400 ein Schaltjahr. 
// Da 100 Jahre einen zu großen (Sekunden)-Wert für den Datentyp long erzeugen,
// wird die 100 und 400 Jahre-Regel nicht berücksichtigt.
 
cout << endl;
cout << "Dieses Programm errechnet aus ihren Angaben das aktuelle Datum inklusive Uhrzeit" << endl;
cout << "Startzeitpunkt ist der 1.1.1970 0:00:00 Uhr" << endl;
cout << endl;
cout << "Geben Sie einen Wert ein (in Sekunden): ";
cin >> wert;
 
 
while ((wert/31536000)>=1) // solange wert groesser-gleich 1 Jahr...
{
	wert=wert-31536000;
	jahr++;
    if (((jahr+1)%4)==0)
	{
		schaltjahr++;
	}
}
while ((wert/2628000)>=1) // solange wert groesser-gleich 1 Monat...
{
	wert=wert-2628000;
	monat++;
}
while ((wert/86400)>=1) // solange wert groesser-gleich 1 Tag...
{
	wert=wert-86400;
	tag++;
    if ((schaltjahr>=1)&&(monat>=2)&&(tag>=28))
	{
       tag++;
	}
}
while ((wert/3600)>=1) // solange wert groesser-gleich 1h...
{
    wert=wert-3600;
	stunde++;
}
while ((wert/60)>=1) // solange wert groesser-gleich 1 Minute...
{
	wert=wert-60;
    minute++;
}
while (wert>0)
{
      wert=wert-1;
      sek++;
}
 
jahr=1970+jahr;
monat=1+monat;
tag=1+tag;
stunde=0+stunde;
minute=0+minute;
sek=0+sek;
if (stunde>12)
{ stunde=stunde-12; }
 
cout << endl;
 
if ((minute<10)&&(sek>=10))
{
cout << tag<<"."<<monat<<"."<<jahr<<" "<<stunde<<":0"<<minute<<":"<<sek<<" Uhr" << endl;
}
if ((sek<10)&&(minute>=10))
{
cout << tag<<"."<<monat<<"."<<jahr<<" "<<stunde<<":"<<minute<<":0"<<sek<<" Uhr" << endl;
}
 
if ((sek>=10)&&(minute>=10))
{
cout << tag<<"."<<monat<<"."<<jahr<<" "<<stunde<<":"<<minute<<":"<<sek<<" Uhr" << endl;
}
if ((sek<10)&&(minute<10))
{
cout << tag<<"."<<monat<<"."<<jahr<<" "<<stunde<<":0"<<minute<<":0"<<sek<<" Uhr" << endl;
}
 
cout << endl;
 
system("pause");
return 0;



Das Problem: Das Programm rechnet eben mit 1Jahr/12=Tage pro Monat. Und das ist ja nicht richtig, da die Monate ja unterschiedlich viele Tage haben...

2

Monday, November 27th 2006, 9:34pm

Kennst du denn die Regeln für Schaltjahre?
Ich sag mal 4 Jahre, 100 Jahre, 400 Jahre all diese Zahlen sollten berücksichtigt
werden.

MfG Bcc-fan

3

Monday, November 27th 2006, 9:46pm

Quoted from ""bcc-fan""

Kennst du denn die Regeln für Schaltjahre?
Ich sag mal 4 Jahre, 100 Jahre, 400 Jahre all diese Zahlen sollten berücksichtigt
werden.

MfG Bcc-fan


klar kenne ich die Regeln... stehen ja bei wikipedia 100 Jahre brauch ich nicht zu berücksichtigen, das das zuviel für long sind.

4

Tuesday, November 28th 2006, 8:25am

Theoretisch brauchst du es schon beim Jahr 2000, aber praktisch kommst du,
weil 400 Jahrfaktor, zum gleichen Ergebnis.

Aber warum steht in der Aufgabe Gregorianischer Kalender?

MfG Bcc-fan

5

Tuesday, November 28th 2006, 9:31am

Quoted from ""bcc-fan""

Theoretisch brauchst du es schon beim Jahr 2000, aber praktisch kommst du,
weil 400 Jahrfaktor, zum gleichen Ergebnis.

Aber warum steht in der Aufgabe Gregorianischer Kalender?

MfG Bcc-fan


stimmt beim Jahr 2000 brauch ich es. Da steht gregorianischer Kalender, damit wir alle 4 Jahre einen Tag mehr rechnen und die Aufgabe anspruchsvoller wird

6

Tuesday, November 28th 2006, 12:28pm

Wie in Wiki steht alle 4 Jahre = julianischer Kalender.

Bill Gates kannte ja auch den 29.02.1900. ;)

MfG Bcc-fan

7

Tuesday, November 28th 2006, 1:38pm

Mit der Funktion

C Quellcode

1
struct tm *  localtime ( const time_t * timer );

kannst du aus der Anzahl Sekunden seit 1970 eine Struktur machen und diese dann auslesen.
Beispiel:

C Quellcode

1
2
time_t l = 1234567;
struct tm* pTime = localtime (&l);


hth

8

Tuesday, November 28th 2006, 3:07pm

Quoted from ""phax""

Mit der Funktion

C Quellcode

1
struct tm *  localtime ( const time_t * timer );

kannst du aus der Anzahl Sekunden seit 1970 eine Struktur machen und diese dann auslesen.
Beispiel:

C Quellcode

1
2
time_t l = 1234567;
struct tm* pTime = localtime (&l);


hth


ja das weiß ich auch, aber ich soll ja aus Sekunden das Datum berechnen, nicht umgekehrt

9

Tuesday, November 28th 2006, 3:45pm

Aber das ist doch genau das was localtime macht.
Oder hab ich da einen groben Denkfehler drin?

10

Tuesday, November 28th 2006, 5:22pm

Such mal mit deiner bevorzugten Suchmasche nach:
willemer localtime c++

MfG Bcc-fan

11

Wednesday, November 29th 2006, 1:13am

Quoted from ""phax""

Aber das ist doch genau das was localtime macht.
Oder hab ich da einen groben Denkfehler drin?


localtime berechnet aus den vergangenen Sekunden seit 1970 das aktuelle Datum+Uhrzeit. Ich möchte aber das der Nutzer einen Sekundenwert eingibt, ich verstehe nicht wie man das mit localtome umsetzen soll? Habs eh schon abgegeben, wäre trotzdem interessant

12

Wednesday, November 29th 2006, 9:45am

C Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <ctime>
#include <cstdio>
using namespace std;
 
int main ()
{
  time_t wert;
 
  // Schaltjahre = alle 4 Jahre, auáer Jahr 100, dafr ist Jahr 400 ein Schaltjahr.
  // Da 100 Jahre einen zu groáen (Sekunden)-Wert fr den Datentyp long erzeugen,
  // wird die 100 und 400 Jahre-Regel nicht bercksichtigt.
 
  cout << endl;
  cout << "Dieses Programm errechnet aus ihren Angaben das aktuelle Datum inklusive Uhrzeit" << endl;
  cout << "Startzeitpunkt ist der 1.1.1970 0:00:00 Uhr" << endl;
  cout << endl;
  cout << "Geben Sie einen Wert ein (in Sekunden): ";
  cin >> wert;
 
  struct tm* ptm = localtime (&wert);
  printf ("%02d.%02d.%04d %02d:%02d:%02d\n",
          ptm->tm_mday,
          ptm->tm_mon + 1,
          ptm->tm_year + 1900,
          ptm->tm_hour,
          ptm->tm_min,
          ptm->tm_sec);
 
  system("pause");
  return 0;
}

Similar threads

Social bookmarks