Geburtsdatum im Alter berechnen
-
Mal ehrlich: Ich finde es besser, wenn man den Code in einzelne Funktionen aufteilt, da er so übersichtlicher ist und leichter zu pflegen ist.
-
Die obige Schaltjahrprüfung ist unvollständig. Das richtige Vorgehen wurde hier schon mehrmals gebracht, deshalb möchte ich es nicht noch einmal hier schreiben.
-
Komme leider noch immer nicht weiter, bekomme immer die Fehlermeldung:
'localtime' wurde als veraltet deklariert
Glaube, es liegt an der do-Schleife
Kann mir bitte da jemand helfen ? Danke!#include "stdafx.h" #include <iostream> #include <time.h> #include <windows.h> using namespace std; struct datum{ int tag; int monat; int jahr; }; int main(int argc, char* argv[]) { datum werte; int testtag = 0; int testmonat = 0; int testjahr = 0; time_t Zeitstempel; tm *nun; Zeitstempel = time(0); nun = localtime(&Zeitstempel); do{ cout << "Bitte den Tag eingeben: "; cin >> werte.tag; testtag = werte.tag; cout << "Bitte den Monat eingeben: "; cin >> werte.monat; testmonat = werte.monat; cout << "Bitte das Jahr eingeben: "; cin >> werte.jahr; testjahr = werte.jahr; }while(testtag < 32 /*&& werte.tag > 0 && werte.monat < 13 && werte.monat > 0 && werte.jahr <= njahr && werte.jahr > 0*/) // cout << "Sie sind am " << werte.tag << "." << werte.monat << "." << werte.jahr << " geboren.\n\n"; int nmonat = nun->tm_mon+1; int ntag = nun->tm_mday; int njahr = nun->tm_year+1900; short int Monate[12] = { 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; bool schaltjahr = false; if ( werte.jahr % 4 == 0 ) { schaltjahr = true; Monate[1] = 29; } else { schaltjahr = true; Monate[1] = 28; } int x = 0; // //if(werte.tag > 31) //{ // cout << "Dieser Tag existiert nicht.\n"; // x = 1; //} //if(werte.monat > 12) //{ // cout << "Dieses Monat existiert nicht.\n"; // x = 1; //} //if(werte.jahr > njahr) //{ // cout << "Dieses Jahr existiert nicht.\n"; // x = 1; // return 0; //} //if((werte.monat == 1 || werte.monat == 3 || werte.monat == 5 || werte.monat == 7 || werte.monat == 8 || werte.monat == 10 || werte.monat == 12) && werte.tag > Monate[0]) //{ // cout << "Dieses Monat hat 31 Tage. Programm wird beendet!\n"; // x = 1; // system("pause"); // return 0; //} //if((werte.monat == 4 || werte.monat == 6 || werte.monat == 9 || werte.monat == 11) && werte.tag > Monate[3]) //{ // cout << "Dieses Monat hat 30 Tage. Programm wird beendet!\n"; // x = 1; // system("pause"); // return 0; //} //if(x != 1) //{ //if(werte.monat == 2 && werte.tag > Monate[1]) //{ // cout << "Dieses Monat hat " << Monate[1] << " Tage. Programm wird beendet!\n"; // system("pause"); // return 0; //} if(njahr == werte.jahr) { if(nmonat == werte.monat) { if(ntag < werte.tag) { cout << "fehler im code 1"; } else if(ntag > werte.tag) { werte.jahr = njahr - werte.jahr - 1; } else if(ntag == werte.tag) { werte.jahr = njahr - werte.jahr; } } } else if(njahr > werte.jahr) { if(nmonat >= werte.monat) { if(ntag > werte.tag) { werte.jahr = njahr - werte.jahr; cout << "fehler im code 2"; } else if(ntag == werte.tag) { werte.jahr = njahr - werte.jahr; } else { werte.jahr = njahr - werte.jahr - 1; cout << "fehler im code 3"; } } else { werte.jahr = njahr - werte.jahr; cout << "fehler im code 4"; } } /* if(nmonat < werte.monat) { werte.jahr = njahr - werte.jahr; } else if(nmonat == werte.monat && ntag > werte.tag) { werte.jahr = njahr - werte.jahr - 1; } else { werte.jahr = njahr - werte.jahr - 1; } */ cout << "\nSie sind " << werte.jahr << " Jahre " << werte.monat << " Monate und " << werte.tag << " Tage alt"; system("pause"); //} return 0; }
lg
-
hi, alle
wenn ich die Differenz zwischen zwei Datums berechnen muss, nehme ich eine JD-Funktion der Astronomen,
z.B. den ACM Algorithmus 199:#include <iostream> typedef unsigned long int ulint; ulint dateToJulianDay (ulint year, ulint month, ulint day) { ulint nC, nJ; if ( month > 2 ) month -= 3; else { month += 9; year--; } nC = year / 100; nJ = year % 100; return( 146097 * nC ) / 4 + ( 1461 * nJ ) / 4 + ( 153 * month + 2 ) / 5 + day + 1721119; } . . . cout << dateToJulianDay (2007, 5, 13) - dateToJulianDay (1970, 1, 1 ) << " Tage"; // 13646 Tage
Natürlich muss man fast gar nichts mehr eintippen
, wenn man etwas SQL kann:
select datediff(day, '1970.01.01', '2007.05.13' ) as 'Tage'; Tage ----- 13646 Oder wem Sekunden lieber sind: select datediff(second, '1970.01.01', '2007.05.13' ) as 'Sekunde'; Sekunde ---------- 1179014400
viele Grüsse von tesu
-
Danke, die JD-Funktion kenne ich gar nicht. Ich darf leider für die Schule diese Funktion nicht anwenden
Was haben die SQL-Befehle mit C++ zu tun ? Oder gibt es ein Tutorial für C++, womit man eine Verbindung mit der SQL-Datenbank oder auch Access-DB erstellen kann ?
lg
-
Hi Composer,
das tut mir leid, dass du so eine Funktion nicht benutzen darfst. Ich habe dateToJulianDay aus dem ACM 199 Algorithmus selbst geschrieben und verwende sie und die Umkehrfunktion JulianDaytoDate universell für Datumsarithmetik in c++. Du kannst sie vielleicht auch benutzen, um zu überprüfen, ob du richtig gerechnet hast.
Was SQL betrifft, nimmt das nicht so ernst. Ich wollte dir nur zeigen, dass es auf anderen Wegen sogar noch einfacher geht, als mit dateToJulianDay. Natürlich gibt es zu c++ Schnittstellen zu SQL-Datenbanken, z.B. ADO-, ODBC-Schnittstelle. Wenn du aber dateToJulianDay in der Schule nicht benutzen darfst, dann darfst du bestimmt auch nicht eine Lösung präsentieren, die z.T. auf SQL basiert.
Bin heute wieder auf Nachtwache, und werde mir mal dein Programm vornehmen, falls nicht soviel los ist.viele Grüsse von tesu.
-
Hi Composer,
ich hab mich jetzt mal durch dein Programm gearbeitet und folgende Aufgabenstellung erkannt: Benutzer geben ihr Geburtsdatum ein. Aus dem aktuellen Tagesdatum wird berechnet, wie alt die Benutzer in Jahren, Monaten und Tagen sind. Bitte korrigiere mich, wenn ich deine Aufgabenstellung falsch verstanden habe.Zuerst einmal: Was für eine Schule besuchst du? Seit wann programmierst du in c++? Zu welchem Zweck sollst du das Programm schreiben? Gibt es eine betreuende Person, z.B. Lehrer?
Wenn ich nun die Aufgabenstellung vergleiche mit dem, was mir dein Programmcode offenbart, also das, was du programmiert hast (Stil, c++ Gebrauch, Strukturierung, enthaltene Fehler), dann komme ich zum Schluß, dass deine Programmierkenntnisse einfach nicht zu der Schwere der Aufgabenstellung passen. Mit anderen Worten, diese Aufgabenstellung ist für einen c++ Anfänger vollkommen ungeeignet. Entweder liegt das daran, dass du dich als Anfänger an eine besonders schwierige Aufgabe gewagt hast, oder aber, dass du kein so absoluter Anfänger mehr bist, aber vieles, was einfach zur Programmierung und Lösung der Aufgabe gehört, versäumt hast zu lernen, und nun, wo es vom Lehrer eine kompliziertere Aufgabe gibt, vollkommen auf dem Schlauch stehst.
Selbst ein Programmierprofi mit mehreren Jahren Programmiererfahrung wird dir diese Aufgabe nicht sofort lösen können; denn der Aufwand, eine vollständige Lösung zu schaffen, ist (un-)verhältnismässig hoch. Nur so zum Vergleich: In Bayern kann man auch im LK Informatik seine Facharbeit schreiben. Die vollständige Lösung deiner Aufgabenstellung überschreitet jedoch m.E. die Anforderungen an eine bayerische Facharbeit im LK Info nicht unerheblich.
Ich will dir nicht die Illusion nehmen, programmieren zu erlernen. Ganz im Gegenteil, es besteht die Gefahr, dass der Frust, den du dir mit dieser Aufgabe auflädtst, nicht förderlich zum Programmierenlernen sein wird, und davor will ich dich bewahren. Also, fang mit viel, viel einfacheren Aufgaben an, z.B. löse die Aufgabe in einem Programm für verschiedene Eingaben "Schaltjahr zu berechnen" zuerst einmal systematisch und vollständig. Lerne die Sprachelemente von c++ systematisch anzuwenden. Lerne an einfachen Beispielen, wie du komplexere Aufgaben mittels Klassenkonzept strukturieren kannst. Erst dann, wenn das alles sitzt, kehre vielleicht zu dieser Aufgabe zurück.
Viele liebe Grüsse von tesu
Ach ja, für diejenigen, die meinen, ich würde übertreiben: lest euch das Programm durch und versucht, euch in die Lage von Composer zu versetzen.
-
Hallo tesuji,
erstmals besten Dank für die ganzen Tipps. Ich bin im ersten Jahr und wir programmieren jede Woche 4 Stunden. Leider bringt der Prof. uns überhaupt nicht bei, d.h. er sagt uns nur, dass wir die Sturktur und die Datum-Funktion benutzen dürfen und alles andere müssen wir mit If, Else, for, do, while erledigen und das Programm sei in eine Stunde zu lösen. Ich habe schon mehrere Stunden investiert, aber so einfach ist es doch nicht. Bei uns hat nur einer bis jetzt geschafft innerhalb von zwei Stunden den Programm zu vervollständigen und er kennt sich auch mit der Sprache C++ sehr gut aus. Das mit dem Schaltjahr ist ja nicht wirklich großes Problem, aber ich verstehe es nicht, wenn ich es ganz am Anfang überprüfen lassen möchte, ob der Tag größer als 31 oder Monat größer als 13 bzw. JAhr größer als heuriges Jahr ist, macht die do-Schleife ein Problem.
Natürlich habe ich auch anders versucht den Problem zu lösen, also der auskommentierte Quellcode sorgt dafür, dass es auf die Zahlen überprüft wird, aber ich wollte es auf einfachere weise lösen, anstatt so viele If-Abfragen zu machen.
Der Prof. hat gemeint, dass ich nur den Jahr brauche und nicht die Monate bzw. Tage. Die Tage bzw. Monate hab ich nur so genommen, aber habe ja noch keine Überprüfung für denen eingebaut, da ich zuerst mal den Jahr genauer haben wollte. Apropos, das mit dem SQL-DB hat mich nur privat interessiert, weil der Prof. gemeint hat, dass wir bald damit anfangen werden und ich daher schon bisschen vorher mich informieren lassen möchte.
Wie es in C# mit der Access-DB geht kenne ich, aber wie macht man das für C++ ?
Ist es auch für die Konsolenanwendung möglich oder geht es nur bei Windows Formen ?
Danke nochmals!!!!!!!lg
-
Hallo composer,
gut, dann kann ich mir vorstellen, wie s bei euch mit dem programmieren läuft (genauso wie s bei uns gelaufen war).Zu deinem zu programmierenden Alg:
Seien GD(GJ, GM, GT) das Geburtsdatum und HD(HJ, HM, HT) das heutige Datum, dann hast du folgenden Alg zu programmieren (Zu Beginne lautete die Ausgabe deines Programms: Sie sind xx Jahre, yy Monate alt. Zu Schluß lautet sie: Sie sind xx Jahre, yy Monate, zz Tage alt.):1. Im Geburtsjahr:
1.1 Berechne die Tage von GT bis Monatsende(GM) --> Tage1
1.2 Berechne die Monate von GM+1 bis 12 --> Monate1
1.3 Falls GJ Schaltjahr und GM = 2, dann Tage1++2. Zwischen Geburtsjahr GJ+1 und heutiges Jahr HJ-1:
2.1 Berechne die Anzahl der Jahre --> Jahr = HJ-GJ-13. Im heutigen Jahr:
3.1 Berechne die Anzahl der Monate HM-1 --> Monate2
3.2 Berechne die Anzahl der Tage von 1.HM bis HT.HM --> Tage2 = HT
3.3 Falls HJ Schaltjahr und HM = 2, dann Tage2++4. Normalisierung
4.1 Monat = Monat1 + Monat2; Tage = Tage1 + Tage2
4.2 Monat = Monat + ( Tage / 30 ); Tage = Tage % 30
4.3 Jahr = Jahr + (Monat / 12 ); Monat = Monat % 12
4.4 Ausgabe Jahr, Monat, TagUnter Umständen muss der Fall, 29.2 für GD und HD noch untersucht werden.
Wie du siehst, besteht der Alg schon aus einigen Schritten. Zur Lösung brauchst
du einige Funktionen (eventeull das ganze in Klasse packen, falls ihr schon
soweit seit):1. Schaltjahr(Jahr), die hast du
2. TageImMonat(Monat)
3. Normalisierung(Jahr, Monat, Tag)
+++ noch einige mehr.Ich würde auf alle Fälle für jede noch so kleine Teilaufgabe eine Funktion schreiben. Falls heute Nacht nicht viel los ist, werde ich dir auf der Nachtwache den alg programmieren und dir einzelne Zwischenergebnisse schicken. Das hängt aber davon ab, ob es heute Nacht wieder gähnlangweilig ist oder remidemi.
vg. tesuNachtrag: SQL geht selbstverständlich auch mit c++, Konsolanwendung, Forms ... Ein einfacher DB-Zugang mit c++ und Konsolanwendung geht über die ODBC Schnittstelle. Dazu musst du dir zuerst eine ODBC-Datenquelle (DSN) unter Windows anlegen, das ist sehr einfach für Access machbar. Was hast du denn für ne Schnittstelle mit c# und Access verwendet, ADO?
-
Sekunde mal, was war das jetzt mit dem Jahr? Reicht jetzt echt die Jahresanzahl? Also quasi, dass der Benutzer angibt, er sei 1960 geboren, dann ist er 47 Jahre alt? Oder wird irgendwie etwas verlangt: er ist am 13.05.1960 geboren, dann ist er 47 Jahre und 2 Tage alt?
Oder sollt ihr das ganze wirklich auch komplett in Tagen ausdrücken?
Falls mein angenommener Fall stimmen würde wäre es ja nicht sooo schwer, oder? (@Tesuji, ich kenn mich da jetzt nicht aus, darum frag ich)
-
Hi Shinja,
wenns nach dem letzten Programmcode von composer geht, dann jahr, monat, tag. Nur das Jahr ist wirklich trivial, da kann er auch das Schaltjahr vernachlässigen, falls die Schalttage nicht verrechnet werden müssen. Denn dann könnte man ja leicht ein Jahr älter werden.
Aber um ehrlich zu sein, ich weis jetzt auch nicht mehr so ganz richtig, was composer will. im ersten programmposting warens nur jahre und monate, danach halt auch mit tagen.
vg. tesu
-
Hi,
danke dir, dass du für mich so viel Zeit im Anspruch genommen hast.
Also ich muss die Tage, Monate und Jahre berechnen.
Jetzt habe ich es soweit geschafft, dass ich die Jahre ausgeben kann:#include "stdafx.h" #include <iostream> #include <time.h> #include <windows.h> using namespace std; struct datum{ int tag; int monat; int jahr; }; int main(int argc, char* argv[]) { datum werte; time_t Zeitstempel; tm *nun; Zeitstempel = time(0); nun = localtime(&Zeitstempel); int nmonat = nun->tm_mon+1; int ntag = nun->tm_mday; int njahr = nun->tm_year+1900; do{ cout << "Bitte den Tag eingeben: "; cin >> werte.tag; cout << "Bitte den Monat eingeben: "; cin >> werte.monat; cout << "Bitte das Jahr eingeben: "; cin >> werte.jahr; }while(werte.tag > 31 && werte.tag < 1 && werte.monat > 12 && werte.monat <1 && werte.jahr > njahr && werte.jahr < 1); // cout << "Sie sind am " << werte.tag << "." << werte.monat << "." << werte.jahr << " geboren.\n\n"; short int Monate[12] = { 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; bool schaltjahr = false; if ( werte.jahr % 4 == 0 ) { schaltjahr = true; Monate[1] = 29; } else { schaltjahr = true; Monate[1] = 28; } int x = 0; // //if(werte.tag > 31) //{ // cout << "Dieser Tag existiert nicht.\n"; // x = 1; //} //if(werte.monat > 12) //{ // cout << "Dieses Monat existiert nicht.\n"; // x = 1; //} //if(werte.jahr > njahr) //{ // cout << "Dieses Jahr existiert nicht.\n"; // x = 1; // return 0; //} //if((werte.monat == 1 || werte.monat == 3 || werte.monat == 5 || werte.monat == 7 || werte.monat == 8 || werte.monat == 10 || werte.monat == 12) && werte.tag > Monate[0]) //{ // cout << "Dieses Monat hat 31 Tage. Programm wird beendet!\n"; // x = 1; // system("pause"); // return 0; //} //if((werte.monat == 4 || werte.monat == 6 || werte.monat == 9 || werte.monat == 11) && werte.tag > Monate[3]) //{ // cout << "Dieses Monat hat 30 Tage. Programm wird beendet!\n"; // x = 1; // system("pause"); // return 0; //} //if(x != 1) //{ //if(werte.monat == 2 && werte.tag > Monate[1]) //{ // cout << "Dieses Monat hat " << Monate[1] << " Tage. Programm wird beendet!\n"; // system("pause"); // return 0; //} if(njahr == werte.jahr) { if(nmonat == werte.monat) { if(ntag < werte.tag) { werte.jahr = njahr - werte.jahr - 1; cout << "fehlercode 1"; } else if(ntag > werte.tag || ntag == werte.tag) { werte.jahr = njahr - werte.jahr; cout << "fehlercode 2"; } } else if(nmonat > werte.monat) { if(ntag < werte.tag || ntag > werte.tag || ntag == werte.tag) { werte.jahr = njahr - werte.jahr; cout << "fehlercode 4"; } } } else if(njahr > werte.jahr) { if(nmonat >= werte.monat) { if(ntag > werte.tag || ntag == werte.tag) { werte.jahr = njahr - werte.jahr; cout << "fehlercode 7"; } else { werte.jahr = njahr - werte.jahr - 1; cout << "fehlercode 9"; } } else { werte.jahr = njahr - werte.jahr; cout << "fehlercode 10"; } } /* if(nmonat < werte.monat) { werte.jahr = njahr - werte.jahr; } else if(nmonat == werte.monat && ntag > werte.tag) { werte.jahr = njahr - werte.jahr - 1; } else { werte.jahr = njahr - werte.jahr - 1; } */ cout << "\nSie sind " << werte.jahr << " Jahre "/* << werte.monat << " Monate und " << werte.tag << " Tage*/ << "alt"; system("pause"); //} return 0; }
Am Wochenende werde ich versuchen auch noch die TAge und Monate einzubauen.
Wünsch dir einen schönen Abend nochlg
-
Also so wie in meinem 2. Fall? 13.04.1960 geboren, dann soll die Ausgabe
47 Jahre 1 Monat 2 Tage sein? Oder soll das ganze in eine Anzahl aus Tagen umgerechnet werden?Paar kleine comments zum Code (ich bin selbst Anfaenger, es kann also sein, das sich mich in etwas vertue):
1. time.h ist veraltet, das muesste ctime sein.
2. lager mal ein paar Sachen in Funktionen aus.
3. while(werte.tag > 31 && werte.tag < 1 && werte.monat > 12 && werte.monat <1 && werte.jahr > njahr && werte.jahr < 1);
Das garantiert dir kein gueltiges Datum (siehe 31. April o.ae.) Schreibe dir dafuer eine Funktion "pruefeDatum(int jahr,int monat, int tag)" die das ueberprueft am besten. Pruefe in diesem fall am besten auch gleich, ob es VOR dem heutigen Datum liegt. Dann kannst du naemlich einige der nachfolgenden if Anweisungen weglassen.
4. if ( werte.jahr % 4 == 0 )
garantiert dir nicht, dass das Jahr ein Schaltjahr ist. Ein Jahr ist ein Schaltjahr wenn es durch 400 teilbar ist oder wenn es durch 4 aber nicht durch 100 teilbar ist. (siehe Post auf Seite 1 glaub ich diesbezueglich) Am besten auch in eine Funktion auslagern.
5. if(ntag < werte.tag || ntag > werte.tag || ntag == werte.tag)
Oehm, wenn es groeszer, kleiner oder gleich ist? Das kannst du weglassen, ist eh immer richtig.
6. Was die ganzen fehlercodes sollen weisz ich nicht, ich vermute aber, du wolltest damit einfach nur deine if-Bedingungen testen und wirst sie spaeter noch ersetzen.
-
hi shinja,
danke, dass du mir klar gemacht hast. muss das nochmals genauer anschauen, wo die fehler liegen. die ausgabe soll so erscheinen, wie du es gesagt hast (47 Jahre 1 Monat 2 Tage). ja die fehlercodes sind nur zum testen. die überprüfung ist zwar da, aber ich lasse es gar nicht überprüfen. das wollte ich erst später machen, wenn ich mit tagen, monaten und jahren hingekriegt habe.
jetzt wird es schon kompliziert, weil der prof. hat gesagt: "wir sollen das programm mit eine klasse machen".#include "stdafx.h" #include <iostream> #include <ctime> #include <windows.h> using namespace std; class Datum{ public: int tag; int monat; int jahr; void Ausgabe(); }; void Datum::Ausgabe() // Methode { time_t Zeitstempel; tm *nun; Zeitstempel = time(0); nun = localtime(&Zeitstempel); int nmonat = nun->tm_mon+1; int ntag = nun->tm_mday; int njahr = nun->tm_year+1900; if(njahr == jahr) { if(nmonat == monat) { if(ntag < tag) { jahr = njahr - jahr - 1; cout << "fehlercode 1"; } else if(ntag > tag || ntag == tag) { jahr = njahr - jahr; cout << "fehlercode 2"; } } else if(nmonat > monat) { jahr = njahr - jahr; cout << "fehlercode 4"; } } else if(njahr > jahr) { if(nmonat >= monat) { if(ntag > tag || ntag == tag) { jahr = njahr - jahr; cout << "fehlercode 7"; } else { jahr = njahr - jahr - 1; cout << "fehlercode 9"; } } else { jahr = njahr - jahr; cout << "fehlercode 10"; } } } int main(int argc, char* argv[]) { Datum werte; time_t Zeitstempel; tm *nun; Zeitstempel = time(0); nun = localtime(&Zeitstempel); int nnmonat = nun->tm_mon+1; int nntag = nun->tm_mday; int nnjahr = nun->tm_year+1900; do{ cout << "Bitte den Tag eingeben: "; cin >> werte.tag; cout << "Bitte den Monat eingeben: "; cin >> werte.monat; cout << "Bitte das Jahr eingeben: "; cin >> werte.jahr; }while(werte.tag > 31 && werte.tag < 1 && werte.monat > 12 && werte.monat <1 && werte.jahr > nnjahr && werte.jahr < 1); // cout << "Sie sind am " << werte.tag << "." << werte.monat << "." << werte.jahr << " geboren.\n\n"; short int Monate[12] = { 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; bool schaltjahr = false; if ( werte.jahr % 4 == 0 ) { schaltjahr = true; Monate[1] = 29; } else { schaltjahr = true; Monate[1] = 28; } int x = 0; // //if(werte.tag > 31) //{ // cout << "Dieser Tag existiert nicht.\n"; // x = 1; //} //if(werte.monat > 12) //{ // cout << "Dieses Monat existiert nicht.\n"; // x = 1; //} //if(werte.jahr > njahr) //{ // cout << "Dieses Jahr existiert nicht.\n"; // x = 1; // return 0; //} //if((werte.monat == 1 || werte.monat == 3 || werte.monat == 5 || werte.monat == 7 || werte.monat == 8 || werte.monat == 10 || werte.monat == 12) && werte.tag > Monate[0]) //{ // cout << "Dieses Monat hat 31 Tage. Programm wird beendet!\n"; // x = 1; // system("pause"); // return 0; //} //if((werte.monat == 4 || werte.monat == 6 || werte.monat == 9 || werte.monat == 11) && werte.tag > Monate[3]) //{ // cout << "Dieses Monat hat 30 Tage. Programm wird beendet!\n"; // x = 1; // system("pause"); // return 0; //} //if(x != 1) //{ //if(werte.monat == 2 && werte.tag > Monate[1]) //{ // cout << "Dieses Monat hat " << Monate[1] << " Tage. Programm wird beendet!\n"; // system("pause"); // return 0; //} /* if(nmonat < werte.monat) { werte.jahr = njahr - werte.jahr; } else if(nmonat == werte.monat && ntag > werte.tag) { werte.jahr = njahr - werte.jahr - 1; } else { werte.jahr = njahr - werte.jahr - 1; } */ werte.Ausgabe(); cout << "\nSie sind " << werte.jahr << " Jahre "/* << werte.monat << " Monate und " << werte.tag << " Tage*/ << "alt"; system("pause"); //} return 0; }
jetzt verstehe ich nicht, wie ich die datumprueffunktion da hineinstellen soll
lg
-
hi composer,
bin leider erst heute abend dazu gekommen, deine Aufgabe mit g++ zu programmieren.
Es ist noch ohne Klasse. Das Programm ist noch nicht vollständig getestet.
Vor allem ist mir noch unklar, ob es auch funktioniert wenn jemand am 29.2 geboren ist.
Ich habe die Aufgabe in kleine Funktionen zerlegt, so dass diese Lösung
eigentlich leicht zu verstehen sein sollte.#include <cstdlib> #include <iostream> #include <time.h> using namespace std; struct datum { int tag; int monat; int jahr; }; int Schaltjahr ( datum d ) { return (d.jahr % 4 == 0 && d.jahr % 100 != 0) || d.jahr % 400 == 0 ? 1 : 0; } int TageImMonat( datum d ) { switch (d.monat) { case 4 : case 6 : case 9 : case 11 : return 30; case 2 : return 28; default : return 31; } } void GeburtsDatum( datum& d ) { cout << "Geburtsdatum (Tag Monat Jahr, Ende: 0 0 0) eingeben: "; cin >> d.tag >> d.monat >> d.jahr; } void heuteDatum( datum& d ) { time_t s1900 = time(NULL); tm *dd = localtime(&s1900); d.jahr = 1900 + dd->tm_year; d.monat = 1 + dd->tm_mon; d.tag = dd->tm_mday; } void imGebJahr ( datum GD, int& Tage, int& Monate ) { Monate = 12 - GD.monat; Tage = TageImMonat ( GD ) - GD.tag; if ( GD.monat < 3 ) Tage += Schaltjahr ( GD ); } void ZwischenJahre ( datum GD, datum HD, int& jahr ) { jahr = HD.jahr - GD.jahr - 1; } void imHeuteJahr ( datum HD, int& Tage, int& Monate ) { Monate = HD.monat - 1; Tage = HD.tag; if ( HD.monat > 2 ) Tage += Schaltjahr ( HD ); } void normDatum ( datum& d ) { d.monat += d.tag / 30; d.tag %= 30; // Monat hat 30 Tage d.jahr += d.monat / 12; d.monat %= 12; } int main(int argc, char* argv[]) { datum GD, HD, Alter; int Tage1, Tage2, Monat1, Monat2; heuteDatum ( HD ); cout << "Heute ist der " << HD.tag << "." << HD.monat << "." << HD.jahr << endl; GeburtsDatum ( GD ); // erstes Gebdatum einlesen while ( GD.jahr > 0 ) // Programm beenden, wenn 0 0 0 eingegeben wird { imGebJahr ( GD, Tage1, Monat1 ); // Monate und Tage im Geburtsjahr ZwischenJahre ( GD, HD, Alter.jahr ); // Jahre zwischen Gebdatum und heute imHeuteJahr ( HD, Tage2, Monat2 ); // Monate und Tage im aktuellem Jahr Alter.monat = Monat1 + Monat2; Alter.tag = Tage1 + Tage2; normDatum ( Alter ); // Jahre, Monate und Tage verrechnen cout << "Sie sind " << Alter.jahr << " Jahr(e), " << Alter.monat << " Monat(e) und " << Alter.tag << " Tag(e) alt." << endl; GeburtsDatum ( GD ); // neues Datum einlesen } return 0; }
Vielleicht kannst du Teile davon gebrauchen.
viele Grüsse von tesu
(ich denke mal über eine klassenlösung nach)
-
hi tesuji,
danke nochmalsecht super, dass du dir immer wieder zeit für mich investierst.
ich hatte eigentlich gestern schon angefangen den programm weiterzuprogrammieren.
erst heute sah ich den code von dir, mal sehen viel. kann ich es irgendwo einsetzen. bei mir sieht der code leider ur viel aus.
hier ein vorgeschmack:#include "stdafx.h" #include <iostream> #include <time.h> #include <windows.h> using namespace std; class Datum{ public: int tag; int monat; int jahr; void Ausgabe(); }; void Datum::Ausgabe() // Methode { time_t Zeitstempel; tm *nun; Zeitstempel = time(0); nun = localtime(&Zeitstempel); int nmonat = nun->tm_mon+1; int ntag = nun->tm_mday; int njahr = nun->tm_year+1900; if(monat <= nmonat && tag <= ntag) { if(tag == ntag || tag > ntag) { monat = nmonat - monat + 11; jahr = njahr - jahr - 1; if(tag > 0) { tag = ntag - tag; tag = tag * (-1); } else { tag = ntag - tag; } } else { monat = nmonat - monat; jahr = njahr - jahr; tag = ntag - tag; } } else if(monat >= nmonat && tag > ntag) { jahr = njahr - jahr - 1; monat = nmonat - monat; if(monat < 0) { monat = monat * (-1); monat = 12 - monat; } else { monat = monat; } tag = ntag - tag - 1; if(tag < 0) { tag = tag * (-1); tag = ntag + tag; } else { tag = tag; } } else if(monat < nmonat && tag > ntag) { jahr = njahr - jahr; monat = nmonat - monat; tag = ntag - tag; if(tag < 0) { tag = tag * (-1); tag = ntag + tag; } else { tag = tag; } } else if(monat > nmonat || tag < ntag) { jahr = njahr - jahr - 1; monat = nmonat - monat; if(monat < 0) { monat = monat * (-1); monat = 12 - monat; } else { monat = nmonat - monat; } tag = ntag - tag - 1; } } int main(int argc, char* argv[]) { Datum werte; time_t Zeitstempel; tm *nun; Zeitstempel = time(0); nun = localtime(&Zeitstempel); int nnmonat = nun->tm_mon+1; int nntag = nun->tm_mday; int nnjahr = nun->tm_year+1900; short int Monate[12] = { 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; // Geburtsjahrabfrage do{ cout << "Bitte das Jahr eingeben: "; cin >> werte.jahr; }while(werte.jahr > nnjahr || werte.jahr < 1); bool schaltjahr = false; if ( werte.jahr % 4 == 0 ) { if ( werte.jahr % 4 == 0 ) { schaltjahr = true; Monate[1] = 29; } } else { schaltjahr = true; Monate[1] = 28; } // Geburtsmonatabfrage do{ cout << "Bitte den Monat eingeben: "; cin >> werte.monat; }while(werte.monat < 1 || werte.monat > 12); // Geburtstagabfrage do{ cout << "Bitte den Tag eingeben: "; cin >> werte.tag; // überprüfung monat }while(werte.tag < 1 || (werte.monat == 2 && werte.tag > Monate[1]) || ((werte.monat == 1 || werte.monat == 3 || werte.monat == 5 || werte.monat == 7 || werte.monat == 8 || werte.monat == 10 || werte.monat == 12) && werte.tag > Monate[0]) || ((werte.monat == 4 || werte.monat == 6 || werte.monat == 9 || werte.monat == 11) && werte.tag > Monate[3])); werte.Ausgabe(); cout << "\nSie sind " << werte.jahr << " Jahre " << werte.monat << " Monate und " << werte.tag << " Tage alt."; system("pause"); //} return 0; }
lg