Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Lord-archimedes

Treue Seele

  • »Lord-archimedes« ist der Autor dieses Themas

Beiträge: 234

Wohnort: Hannover

  • Private Nachricht senden

1

15.03.2012, 12:39

[C++]Datumabfrage

Hallo zusamme,

ich habe atm ein kleines Problem bei einem Programm, dass ich für einen Freund schreibe: Es geht um einfach Rechnung mit dem Datum, die ich anstellen möchte. Nun möchte ich von einem ganzen Datum jeweils mit dem Tag, dem Monat und dem Jahr einzeln rechnen, es aber als gesamtes eingeben lassen. Sprich der Benutzer gibt sein Geburtsdatum an a la 15.3.1980 und nun möchte ich eine Funktion schreiben die dieses Datum in drei INtegern abspeichert. EInmal als Tag = 15, Monat = 3 und Jahr = 1980. Der Punkt könnte da ja irgendiwe als Trennzeichen gelten, aber wie genau stellt man dieses an?

Meine zweite Frage wäre, wie man das aktuelle Datum wiedergeben kann als Funktion (sagen wir zB vom aktuellen PC)
Wichtig wäre noch, dass das ganze allgemein funktioniert und nicht zB Windoof abhängig ist, da es mein Kumpel noch ins Internet stellen wollte ;)

Danke im voraus (:

2

15.03.2012, 14:02

Zeichen für Zeichen durchgehen und wenn ein Punkt erkannt wurde, das dann vor dem Punkt abspeichern.
Die nötigen Funktionen sind hier zu finden.
Zur zweiten Frage: Naja, ohne Windoof könnte es ein bisschen schwer werden. Frag doch ab, über ein #ifdef/#ifndef, welches System dort ist. Innerhalb dieser Bedingungen dann die nötigen Funktion zur Abfragen des Datums die man sehr schnell und einfach über Google finden kann.

MfG
Check

3

15.03.2012, 14:31

Sehr nett sind dafür auch die boost-String Algorithmen. Zum Beispiel Split:
http://www.boost.org/doc/libs/1_49_0/doc….html#id3184031
Lieber dumm fragen, als dumm bleiben!

Lares

1x Contest-Sieger

  • Private Nachricht senden

4

15.03.2012, 18:00

Einfachste Variante die ich kenne ist scanf (ist aber c, kann aber auch in c++ benutzt werden).

Würde dann etwa so aussehen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
#include <stdio>

//...

int tag=0;
int monat=0;
int jahr = 0;

scanf("%d.%d.%d",&tag,&monat,&jahr);

//...

Dann sind die entsprechenden Werte direkt in den Variablen gespeichert. Der Benutzer braucht nur z.B. 12.3.2004 (ka wie ich gerade auf das Datum kam xD).
Gibt vllt auch ne C++ Variante davon.

Edit: Sofern es in der Konsole ist...

Lord-archimedes

Treue Seele

  • »Lord-archimedes« ist der Autor dieses Themas

Beiträge: 234

Wohnort: Hannover

  • Private Nachricht senden

5

15.03.2012, 18:40

Habe das Problem jetzt mit eienr einzeleingabe gelöst. Haben aber irgendwo einen Denkfehler drin haben schon über 2 Stunden danach gesucht und nicht wirklich was beheben können, ahttene s auch schon mit Einzelausgaben probiert etc. SInd mit usnerem Latein am Ende :(
Hier die Aufgabe:
Mancher
möchte gerne wissen, wann die Mitglieder seiner Familie zusammen ein
bestimmtes Alter (z.B. 100 Jahre) erreichen. Dies kann man so berechnen:
Für die Geburt des jüngsten Familienmitglieds das Alter (in Tagen) der
übrigen Familienmitglieder berechnen (Funktion "Fristen") und
zusammenzählen. Die Summe dann von der Zahl 36524 abziehen (für 100
Jahre - sonst statt 36524 ein entsprechendes Vielfaches von 365.2422
nehmen). Das Ergebnis durch die Zahl der Familienmitglieder teilen.
Berechnen, wann das jüngste Familienmitglied diese Anzahl von Tagen alt
wird (mit der Funktion "Termine"). Das ist das gesuchte Datum.

Peter: 04.05.1969 ist am 4.3.2012 genau 15645 Tage alt

Pascal: 05.12.1960 ist am 4.03.2012 genau 18717 Tage alt

Summe: 34362

Differenz zu 36524 ( 100 Jahre in Tagen) = 2162 Tage : 2 = 1081 Tage

Sie werden also in 1081 Tagen zusammen 100 Jahre, aber wann ist das?

C-/C++-Quelltext

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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
// Alter nach 100 Jahren.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//

#include "stdafx.h"
#include <iostream>
#include <string>
#include <ctime>

using namespace std;
int aktDay, aktMonth, aktYear;
int DayA, MonthA, YearA;
int DayB, MonthB, YearB;
int DaysTo100;
int DaysPersonA, DaysPersonB, SumDays;

void DaysToDate (void)
{
    //Hinzufügen von einzelnen Tagen auf das aktuelle Datum, um so Zukunftsdatum zu ermitteln
    while (DaysTo100 > 365)
    {
        aktYear++;
        DaysTo100 = DaysTo100 - 365;
        //cout << DaysTo100 << endl;
    }

    while (DaysTo100 > 31)
    {
        switch (aktMonth)
        {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10: {
            aktMonth++;
            DaysTo100 = DaysTo100 - 31;
            break;
                 }
        case 4:
        case 6:
        case 9:
        case 11:
            {
                aktMonth++;
                DaysTo100 = DaysTo100 - 30;
                break;
            }
        case 2:
            {
                aktMonth++;
                DaysTo100 = DaysTo100 - 28;
                break;
            }
        case 12:
            {
                aktMonth = 1;
                aktYear++;
                DaysTo100 = DaysTo100 - 31;
                break;
            }
        }
        //cout << DaysTo100 << endl;
    }

    while (DaysTo100 > 0)
    {
        if ((aktMonth == 2) && (aktDay == 28))
        {
            aktMonth++;
            aktDay = 1;
            DaysTo100--;
        }
        else if (aktDay == 30)
        {
            switch (aktMonth)
            {
            case 4:
            case 6:
            case 9:
            case 11:
                {
                    aktMonth++;
                    aktDay = 1;
                    DaysTo100--;
                    break;
                }
            }
        }
        else if (aktDay == 31)
        {
            switch (aktMonth)
            {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
                {
                    aktMonth++;
                    aktDay = 1;
                    DaysTo100--;
                    break;
                }
            }
        }
        else if (aktDay == 31)
        {
            if (aktMonth == 12)
            {
                aktYear++;
                aktMonth = 1;
                aktDay = 1;
                DaysTo100--;
            }
        }
        else
        {
            aktDay++;
            DaysTo100--;
        }
        //cout << DaysTo100 << endl;
    }
}

int From0ToDate (int DayF, int MonthF, int YearF)
{
    //cout << ((YearF * 365,2422) + (MonthF * 30,4166) + DayF);
    return ((YearF * 365.2422) + (MonthF * 30.4166) + DayF);
}


int main (void)
{
    //aktuelles Datum holen
    time_t date = time(NULL);
    tm* current_date = gmtime(&date);

    //Datum in Variablen speichern
    aktYear =  current_date->tm_year + 1900;
    aktMonth = current_date->tm_mon + 1;
    aktDay =   current_date->tm_mday;

    cout << "aktuelles Datum: " << aktDay << "." << aktMonth << "." << aktYear << endl;
    cout << "-------------------------------------------------------------------------------" << endl;
    cout << "Geburtstag der Person A eingeben: ";
    cin >> DayA;
    cout << "Geburtsmonat der Person A eingeben: ";
    cin >> MonthA;
    cout << "Geburtsjahr der Person A eingeben: ";
    cin >> YearA;
    cout << "Geburtstag der Person B eingeben: ";
    cin >> DayB;
    cout << "Geburtsmonat der Person B eingeben: ";
    cin >> MonthB;
    cout << "Geburtsjahr der Person B eingeben: ";
    cin >> YearB;
    cout << "-------------------------------------------------------------------------------" << endl;
    cout << "Geburtstag A: " << DayA << "." << MonthA << "." << YearA << endl;
    cout << "Geburtstag B: " << DayB << "." << MonthB << "." << YearB << endl;
    DaysPersonA = From0ToDate (DayA, MonthA, YearA);
    DaysPersonB = From0ToDate (DayB, MonthB, YearB);
    cout << "DaysPErsonA " << DaysPersonA << endl;
    cout << "DaysPErsonB " << DaysPersonB << endl;
    SumDays = DaysPersonA + DaysPersonB;
    cout << "SumDays: " << SumDays << endl;
    SumDays = 36524 - SumDays;
    if (SumDays < 0)
        cout << "Berechnung nicht möglich, Sie sind schon über 100 Jahre zusammen alt." << endl;
    else
    {
        DaysTo100 = SumDays / 2;
        DaysToDate ();
        cout << "Sie werden am " << aktDay << "." << aktMonth << "." << aktYear << " 100 Jahre alt." << endl;
    }
    cin.get ();
    cin.get ();
    return 0;
}

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

15.03.2012, 19:58

Wenn dein Compiler C++11 unterstützt, dann verwend std::get_time

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <iomanip>
#include <ctime>

int main()
{
  std::tm date;
  std::cin >> std::get_time(&date, "%d.%m.%Y");
  return 0;
}


;)

Lord-archimedes

Treue Seele

  • »Lord-archimedes« ist der Autor dieses Themas

Beiträge: 234

Wohnort: Hannover

  • Private Nachricht senden

7

15.03.2012, 20:03

soweit ich weiß unterstützt der Compiler kein C++ 11, ist schon ne ältere Version von Visual Studios,ich bin mir auch ziemlich siche dass das Problem nicht an der Zeit liegt, ist eher eine Frage des Komfort :(

Lord-archimedes

Treue Seele

  • »Lord-archimedes« ist der Autor dieses Themas

Beiträge: 234

Wohnort: Hannover

  • Private Nachricht senden

8

17.03.2012, 13:53

niemand da, der mir weiterhelfen kann? :( Ich finde den Fehler einfach nicht...

Lares

1x Contest-Sieger

  • Private Nachricht senden

9

17.03.2012, 21:07

Ich verstehe ehrlich gesagt nicht genau, was jetzt dein Problem ist: Kommst du mit den Programmcode nicht auf 1081 Tage oder ist das

Zitat

Sie werden also in 1081 Tagen zusammen 100 Jahre, aber wann ist das?
deine eigentliche Frage? Weil im letzteren ists ja eig nur Tage durch 365 teilen...

Bei ersterem wären ein paar Vergleichsrechnungen hilfreich (was soll rauskommen -> was kommt laut Programm raus) so wie ein paar Zwischenergebnisse (mit den Debugger auslesen, damit man zumindestens schonmal weiß, ab wo es falsch wird).
Und ich verstehe ehrlich gesagt auch nicht so ganz, was du da in deinen beiden Switch-Anweisungen machen willst (zuerst prüfst du DaysTo100 auf >31 und dann nochmal auf >0 in einer seperaten switch-Anweisung?) :/ Wenn du herausfinden willst, wie viele Tage bis 100 Jahre vergehen, musst du doch die Monate nicht abziehen, oder?

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

10

17.03.2012, 21:08

Muss es C++ sein? Mit Java hättest du es auch Plattformunabhängig und hast direkt Klassen für Daten etc die dir das alles liefern. Das Programm hätte nur ein paar Zeilen.
edit: Ich denke mal ihm geht es darum, dass Schaltjahre betrachtet werden und dadurch die genaue Rechnung nicht ganz so einfach wird? Gibt es aber einfache Algorithmen zu. Musste einfach bei Google mal gucken.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige