Datum erhöhen
-
Die werte die nicht stimmen werden nicht ausgegeben. Die erste und zweite wert wird ausgegeben weil sie war sind der dritte sollte nicht ausgegeben werden doch ich erhalte eine lange zahl.
struct Date{ int y; // year int m; // month int d; // day }; void init_day(Date& dd,int y,int m,int d) // die richtigen werte prüfen { if(y<1900 || y>2200) { y = 0;} else if(m<1 || m>12) { m = 0;} else if(d<1 || d>31) { d = 0;} else { dd.y = y; dd.m = m; dd.d = d; } } void add_day(Date& dd,int n) // erhöhe um einen Tag { n = 1; dd.d = dd.d + n; } void day_prog() { Date today; init_day(today,1978,6,25); cout << today.d << endl; Date tomorrow; tomorrow.d = today.d; add_day(tomorrow,1); cout << tomorrow.d << endl; Date non; // falsche werte init_day(non,789,56,-9); cout << non.d << endl; } int main() { day_prog(); keep_window_open(); return 0; }Ich will das die falschen werte nicht ausgegeben werden soll. Mit dem error gab es ein Programm Absturz.
-
klar bekommst du bei non falsche Werte, WEIL diese struct noch nie initiliaisert wurde und jeden beliebigen Wert enthalten kann... Weshalb rückgabewerte für Erfolg/Misserfolg sinnvoll wären.
void init_day(Date& dd,int y,int m,int d) // die richtigen werte prüfen { if(y<1900 || y>2200 || m<1 || m>12 || d<1 || d>31) { dd.y = 0; dd.m = 0; dd.d = 0; } else { dd.y = y; dd.m = m; dd.d = d; } }
-
Du meinst do etwas wie:
Date():y(0),m(0),d(0){}
-
winux schrieb:
Du meinst do etwas wie:
Date():y(0),m(0),d(0){}Ein Konstruktor wäre natürlich sehr hilfreich.
-
Jetzt bekomme ich drei werte 0,1,0.
-
Was hast du denn nun gemacht?
-
So geschrieben wie du es gesagt hast.
-
du bekommst die Eins weil du immernoch den Fehler aus 10 posts mitschleppst... In Add_day steht n = 1, welches dort nicht stehen darf. darum auch die 1 in der zweiten Ausgabe.
Edit: Ich hatte einen Tippfehler bei der Datumsabfrage muss natürlich anstelle d>3 -> d>31 lauten. Dann sollte auch alles gehen. sry
-
Danke für den tipp genau da war der Fehler. Aber dort gibt es jetzt einen neuen Fehler wenn man Tag initialisiert und mit n addiert ( so etwas 29 + 3 = 32) dann erhaltet man einen ungültigen Tag wert.
-
Das ist dann deine nächste Aufgabe, wie muss Add-day aussehen, damit beim hinzufügen von Tagen die Tage/Monate/Jahre Monatsenden immer richtig angezeigt werden inklusive Schaltjahr versteht sich.
Leiste erstmal was und wenn nichts klappt dann frage erneut.
-
Offtop: Heute scheint der Tag der bekloppten Aufgaben zu sein ... erfind mal wer nen TÜV für c++ Profs...
-
Pisastudie macht auch vor Professoren keinen Halt!
-
Jetzt soll ich die Werte nicht mit cout sondern mit dem ostream& operator ausgeben. Doch der Compiler sagt das: error C2601: 'operator<<': Lokale Funktionsdefinitionen sind unzulässig.
void day_prog() { Date today; init_day(today,1978,6,25); // cout << today.d << endl; Date tomorrow; tomorrow.d = today.d; add_day(tomorrow,1); // cout << tomorrow.d << endl; Date non; init_day(non,789,56,-9); // cout << non.d << endl; ostream& operator<<(ostream& os,const Date& today) { return os << '(' << today.d << ')'; } } int main() { day_prog(); keep_window_open(); return 0; }
-
Die Fehlermeldung triffts auf den Punkt. Du kannst keine Funktionen innerhalb anderer Funktionen definieren.
-
Jetzt habe ich es außerhalb der Funktion geschrieben, das Programm startet aber die Konsole zeigt nichts an.
-
Deine Ausgaben sind sicher noch auskommentiert oder gar nicht erst geschrieben...
Falls nicht: Zeig den aktuellen Code (aber überleg bitte kurz, um offensichtliche Fehler zu vermeiden).
-
Das cout ist absichtlich auskommentiert weil die Übung sagt das es mit dem ostream& operator ausgeben werden soll.
#include "stdafx.h" #include "std_lib_facilities.h" using namespace std; struct Date{ int y; // Jahr int m; // Monat int d; // Tag }; void init_day(Date& dd,int y,int m,int d) // absichtlich falsche werte { if(y<1900 || y>2200 || m<1 || m>12 || d<1 || d>31) { dd.y = 0; dd.m = 0; dd.d = 0; } else { dd.y = y; dd.m = m; dd.d = d; } } void add_day(Date& dd,int n) // erhöhe Tag mit n { dd.d = dd.d + n; } void day_prog() { Date today; init_day(today,1978,6,25); // cout << today.d << endl; Date tomorrow; tomorrow.d = today.d; add_day(tomorrow,1); // cout << tomorrow.d << endl; Date non; // zum testen des konstruktors init_day(non,789,56,-9); // cout << non.d << endl; } ostream& operator<<(ostream& os,const Date& today) { return os << '(' << today.d << ')'; } int main() { // irgendwo sollte etwas stehen damit ostream ausgegeben werde soll keep_window_open(); return 0; }
-
Date date; init_day(date, 1955, 5, 15); ostream *strm = &cout; *strm << "Jahr: " << date.y << " Monat: " << date.m << " Tag: " << date.d << endl;
-
Danke für den Tipp aber geht das nicht mit dem ostream& operator. Mit diesem operator:
ostream& operator<<(ostream& os,const Date& today) { return os << '(' << today.d << ')'; }
-
winux, du rufst den
operator<<nirgends auf. Erwartest du, dass er sich von Zauberhand selbstständig macht und doch etwas ausgibt?Zu deinem letzten Post: Doch, das ist ja gerade was HighLigerBiMBam tut! Ich hab das Gefühl, du solltest noch einiges in deinem C++-Buch nachlesen.
P.S. Der
ostream-Zeiger ist eine unnötige Indirektion. Der Operator wird auch direkt beistd::coutaufgerufen.