Datum erhöhen



  • void init_day(Date& dd,int y,int m,int d) 
    { 
        if(y < 1900 || y > 2200) {error("Falsches Jahr");} 
        else if(m < 1 || m > 12) {error("Falscher Monat");} 
        else if(d < 1 || d > 31) {error("Falscher Tag");}
        else
        {
            dd.d = d;
            dd.m = m;
            dd.y = y;
        }
    }
    


  • Ok so geht es, aber jetzt mit einem negativen wert fangt es nicht ab.

    Date non;           
    init_day(non,789,56,-9);
    cout << non.d << endl;
    


  • Das was du machst ist wtf! schau nochmal bei mir ich habe es sekunden vorher editiert... Müdigkeit wins :p



  • 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;
    }
    

Anmelden zum Antworten