Geburtsdatum im Alter berechnen
-
Hi,
ich verstehe es nicht woran es liegt, aber bei mir funkioniert es mit dem Schaltjahr irgendwie nicht ganz
Habt ihr vielleicht eine Idee ?// 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); int feb = 0; if(werte.jahr%400==0 && werte.jahr% 4==0) { feb = 29; } if(werte.jahr%100==0) { feb = 28; } int nmonat = nun->tm_mon+1; int ntag = nun->tm_mday; int njahr = nun->tm_year+1900; // cout << ntag << '.' << nmonat << '.' << njahr << endl; if(werte.monat == 2 && werte.tag > feb || werte.jahr > njahr) { cout << "Falsche Geburtsdatum. 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 alt"; system("pause"); return 0; }
lg
-
Sei gegrüßt !
Wie wäre es denn hiermit:
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üüßßäää
-
Hi proggingmania
geht leider noch immer nicht. Er gibt mir wie zuvor für die variable 0 aus, anstatt 28 oder 29.
Siehe hier:
// 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); int feb = 0; bool schaltjahr = false; if ( werte.jahr % 4 == 0 ) { if ( werte.jahr % 100 == 0 ) { if ( werte.jahr % 400 == 0 ) { schaltjahr = true; feb = 29; } } else { schaltjahr = true; feb = 28; } } cout << feb << "\n"; int nmonat = nun->tm_mon+1; int ntag = nun->tm_mday; int njahr = nun->tm_year+1900; // cout << ntag << '.' << nmonat << '.' << njahr << endl; if(werte.monat == 2 && werte.tag > feb || werte.jahr > njahr) { cout << "Falsche Geburtsdatum. 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 alt"; system("pause"); return 0; }
lg
-
Ja, im else-Zeig zu if(jahr%100==0) wird 'feb' ja auch nicht gesetzt
(und im äußersten Block auf den falschen Wert)
-
Kuckuk Composer
Ich habe eine Variable vom Typ bool benutzt, die kennt nur zwei Werte true und false.
true == 1
false == 0Wenn das Jahr also ein Schaltjahr ist, kommt 1 raus, sonst 0.
Winkää
p.
-
CStoll schrieb:
Ja, im else-Zeig zu if(jahr%100==0) wird 'feb' ja auch nicht gesetzt
(und im äußersten Block auf den falschen Wert)
feb kann überhaupt nicht gesetzt werden, weil feb gar nicht da ist.
-
proggingmania schrieb:
CStoll schrieb:
Ja, im else-Zeig zu if(jahr%100==0) wird 'feb' ja auch nicht gesetzt
(und im äußersten Block auf den falschen Wert)
feb kann überhaupt nicht gesetzt werden, weil feb gar nicht da ist.
Falls dir das entgangen sein sollte, diese Bemerkung bezog sich nicht auf deinen Beitrag, sondern auf Composer's letzten Programmtext
-
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.