Geburtsdatum im Alter berechnen
-
ooooops, ich habe deinen Quellcode vorhin gar nicht gesehen... hüstel..also,
Wenn du feb mit feb = 28 initialisierst, dann sollte das klappen.
-
proggingmania schrieb:
...
main() { bool schaltjahr = false; int jahr; cin >> jahr; if ( jahr % 4 == 0 ) { if ( jahr % 100 == 0 ) { if ( jahr % 400 == 0 ) { schaltjahr = true; } } else { schaltjahr = true; } } cout << schaltjahr; }
Grüüßßäää
Oder auch:
http://de.wikipedia.org/wiki/Schaltjahr schrieb:
boolean istSchaltjahr = ((jahr % 4 == 0 && jahr % 100 != 0) || jahr % 400 == 0);
=>
bool istSchaltjahr(int jahr) { return ((jahr % 4 == 0 && jahr % 100 != 0) || jahr % 400 == 0); }
@Composer: Die Philosophie hier ist eine andere - und wie ich finde, sinnvollere:
Die Frage ist nicht, wieviele Tage der Februar hat, sondern ob ein Jahr ein Schaltjahr ist. Davon kann man z.B. auch die Tageszahl eines Jahres oder sonst etwas abhängig machen, was nicht direkt etwsa mit dem Februar zu tun hat.Gruß,
Simon2.
-
CStoll schrieb:
Falls dir das entgangen sein sollte, diese Bemerkung bezog sich nicht auf deinen Beitrag, sondern auf Composer's letzten Programmtext
Ja, sorry.
-
... int jahr = 1980; int februar = 28+(!(jahr%4)&&(jahr%100)||!(jahr%400)); ...
-
danke leute, habs anders gelöst. ist es auch möglich, dass ich alle fehlermeldungen aufeinmal ausgeben kann? z.b. der user gibt als tag 32, als monat 13 und als jahr 2008.
// geburtstag.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // //#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; cout << "Bitte den Tag eingeben: "; cin >> werte.tag; cout << "Bitte den Monat eingeben: "; cin >> werte.monat; cout << "Bitte den Jahr eingeben: "; cin >> werte.jahr; // cout << "Sie sind am " << werte.tag << "." << werte.monat << "." << werte.jahr << " geboren.\n\n"; //Zeit in Sekunden ab 1.1.1970 time_t Zeitstempel; tm *nun; Zeitstempel = time(0); nun = localtime(&Zeitstempel); 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 nmonat = nun->tm_mon+1; int ntag = nun->tm_mday; int njahr = nun->tm_year+1900; if(werte.jahr > njahr) { cout << "Dieses Jahr existiert nicht. Programm wird beendet!\n"; system("pause"); return 0; } else if(werte.monat > 12) { cout << "Dieses Monat existiert nicht. Programm wird beendet!\n"; system("pause"); return 0; } else 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"; system("pause"); return 0; } else 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"; system("pause"); return 0; } else if(werte.monat == 2 && werte.tag > Monate[1]) { cout << "Dieses Monat hat " << Monate[1] << " Tage. Programm wird beendet!\n"; system("pause"); return 0; } else if(nmonat >= werte.monat && ntag >= werte.tag) { werte.jahr = njahr - werte.jahr; } 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; }
-
Ja, indem du die "return 0;" Anweisungen bei den Fehlerauswertungen weglässt.
-
Ne, es liegt nicht daran.
Habe es editiert, aber Fehler bleibt noch immer dort, wo es früher war.
-
Composer schrieb:
Ne, es liegt nicht daran. ...
Stimmt !
Bloß weil Du nicht mit return rausgehst, "geht er" trotzdem nicht in den else-Zweig.Vorschlag (sowieso lesbarer):
Lass die ganzen else's weg - dann werden alle Prüfungen gemacht.
Wenn Du dann später nach der ersten "erfolgreichen" Prüfung aussteigen willst, kannst Du das mit return oder throw einfacher erreichen.Gruß,
Simon2.
-
Stimmt, du hattest recht. Habe trotzdem nicht alle returns weggelassen, weil er auch aus dem Programm rausspringen muss. Nur leider gibt er mir noch immer am Ende falsche Daten raus, wenn ich die Werte von Tag, Monat und Jahr erhöhe.
Es muss irgendwas mit der letzten Zeile gemacht werden. Vielleicht eine If-Abfrage am Anfang ?
// geburtstag.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #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; cout << "Bitte den Tag eingeben: "; cin >> werte.tag; cout << "Bitte den Monat eingeben: "; cin >> werte.monat; cout << "Bitte das Jahr eingeben: "; cin >> werte.jahr; // cout << "Sie sind am " << werte.tag << "." << werte.monat << "." << werte.jahr << " geboren.\n\n"; //Zeit in Sekunden ab 1.1.1970 time_t Zeitstempel; tm *nun; Zeitstempel = time(0); nun = localtime(&Zeitstempel); 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 nmonat = nun->tm_mon+1; int ntag = nun->tm_mday; int njahr = nun->tm_year+1900; if(werte.tag > 31) { cout << "Dieser Tag existiert nicht.\n"; } if(werte.monat > 12) { cout << "Dieses Monat existiert nicht.\n"; //return 0; } if(werte.jahr > njahr) { cout << "Dieses Jahr existiert nicht.\n"; //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"; 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"; system("pause"); return 0; } 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 && ntag >= werte.tag) { werte.jahr = njahr - werte.jahr; } 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; }
-
Composer schrieb:
cout << "Bitte den Jahr eingeben: ";
Sorry, dass ich dir nicht helfen kann, aber ich seh Rechtschreibfehler sofort und hasse sie
.
Wie unser Mathelehrer: "Jetzt konstruieren wir ein rechter Winkel"<----Wo steckt in diesem Satz der Fehler?
-
Gamer4 schrieb:
...
Wie unser Mathelehrer: "Jetzt konstruieren wir ein rechter Winkel"<----Wo steckt in diesem Satz der Fehler?Jau !! Allerdings ist diese "Akkusativverkürzung" heutzutage schon so verbreitet, dass es immer weniger auffällt und vermutlich in ein paar Jahren im Duden erlaubt sein wird.
Klingt immer ein wenig nach "Türk-Slang": "Ey, gib ma ein Döner rüber !"Gruß,
Simon2.
-
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?