Datum erhöhen



  • 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 bei std::cout aufgerufen.



  • So die Übung ist gelöst, danke an alle für die Hilfe.



  • winux schrieb:

    So die Übung ist gelöst, danke an alle für die Hilfe.

    Finde ich nicht, wenn ich deine add_day-Funktion anschaue.



  • Ja da hast du recht, aber laut der Übung muss ich mich um add_Day nicht kümmern. Sondern nur um die Prüfung mit dem Jahr, Monat und Tag das es die richtigen werte bekommen.



  • winux schrieb:

    Ja da hast du recht, aber laut der Übung muss ich mich um add_Day nicht kümmern. Sondern nur um die Prüfung mit dem Jahr, Monat und Tag das es die richtigen werte bekommen.

    Dann Übe es doch einfach selbst! Erweitere die Übung um Funktionen. Umso mehr du jetzt macht um so weniger musst du später nachholen.



  • Da hast du recht, das werde ich jetzt machen.



  • Das ist eine Vorstellung von der Lösung, ob das korrekt ist weiß ich nicht, denke das Ergebnis von dd.d + n nicht grösser als 31 werden soll. Aber das Programm funktioniert aber ohne das Ausgabe in add_day.

    void add_day(Date& dd,int n) 
    {
    	if(dd.d + n == 32) { cout << "Falscher Wert" << endl;}
    	else {dd.d = dd.d + n;}
    }
    
    void day_prog()
    {
    	Date today;
    	init_day(today,1978,6,25);
    //	cout << today.d << endl;
    	ostream *strm = &cout;
    	*strm << today.d << endl;
    
    	Date tomorrow;
    	tomorrow.d = today.d;
    	add_day(tomorrow,1);    erhöhe Tag mit n
    //	cout << tomorrow.d << endl;
    	*strm << tomorrow.d << endl;
    
    	Date non;           // zum testen des konstruktors 
    	init_day(non,789,56,-9);
    //	cout << non.d << endl;
    	*strm << non.d << endl;
    	non.d = today.d;
    	add_day(today,12);
    	*strm << non.d << endl;
    }
    


  • Was passiert, wenn dd.d + n 33 oder größer ist? Warum wird dann nicht der Monat erhöht? Was passiert, wenn der Monat über 12 ist? Warum wird dann nicht das Jahr erhöht? Wie sieht es eigentlich mit den Monaten aus? Wieviele Tage hat denn der aktuelle Monat der Strukt indem die tage erhöht werden sollen?

    Auf was ich dich aufmerksam machen will ist: Sei Gründlich und überlege alle Möglichkeiten. Schreibe sauber und komplette Programme!



  • Nicht Monat sondern es geht nur für den Tag. Der Tag sollte erhöht werden. Aber wenn das Ergebnis grösser ist als 31 soll das Programm die Berechnung nicht machen. Der Monat muss nicht erhöht werden. Vielleicht kommt das was du sagst mit dem Monats Erhöhung in der nächsten Aufgabe. Da es 6 Übung mit diesem Date gibt.



  • Naja ich kenne dein Buch nicht, aber ich würde das von der Funktion erwarten. Wenn ich 60Tage hinzufüge, dann soll es mir halt den richtigen Tag des übernächsten/nächsten Monats berechnen.



  • Das Buch ist: Einführung in die Programmierung mit C++ von Bjarne Stroustrup.



  • Das ist bestimmt ein gutes Buch. Der Autor ist über jeden Zweifel erhaben 😃


Anmelden zum Antworten