Datum erhöhen



  • Danke für deine Hilfe, habe wieder etwas dazugelernt. Aber laut der Übung muss es aber so gemacht werden:

    void add_day(Date& dd,int n)
    

    Für das brauche ich die Lösung.


  • Mod

    winux schrieb:

    Danke für deine Hilfe, habe wieder etwas dazugelernt. Aber laut der Übung muss es aber so gemacht werden:

    void add_day(Date& dd,int n)
    

    Für das brauche ich die Lösung.

    Da ist aber sicherlich gemeint, dass man dd um n erhöhen soll. Guck dir das mal an:

    void add_day(Date& dd,int n) 
    {
        dd.d = dd.d + n;
    }
    
    void day_prog()
    {
        Date today;
        today.y = 1978;
        today.m = 6;
        today.d = 25;
        cout << today.d << endl;
    
        add_day(today,1);
        cout << today.d << endl;
    
    }
    

    ⚠ Denke genau darüber nach, was an deiner Lösung falsch war. Hier steckt eine wichtige Lektion über C++! Und damit meine ich nicht nur die Nutzung des n sondern vor allem die Nutzung der add_day-Funktion an sich.



  • Genau das brauch ich, so musste es gemacht werden. So jetzt kann ich weiter machen mit der Prüfung. Es muss eine Prüfung geschrieben werden die darauf kontrolliert das die Daten stimmen, Nicht das Monat ein 15 wird oder Tag ein -7.

    void init_day(Date& dd,int y,int m,int d)
    


  • Jetzt gibt es Probleme mit der Prüfung, wieso bekomme ich nicht die werte die ich erwate?

    #include "stdafx.h"
    #include "std_lib_facilities.h"
    
    struct Date{
    	int y;  // Jahr
    	int m;  // Monat
    	int d;  // Tag
    };
    
    void init_day(Date& dd,int y,int m,int d) //soll prüfen ob das Datum korrekt ist
    {
    	if(y<1900 || y>2200) error("Falsches Jahr");
    	if(m<1 || m>12) error("Falsches Monat");
    	if(d<1 || d>31) error("Falsches Tag");
    }
    
    void add_day(Date& dd,int n) // soll denn Tag um 1 erhöhen
    {
    	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;
    	init_day(non,12,24,2006);
    	cout << non.d << endl; 
    }
    
    int main()
    {
        day_prog();
    
        keep_window_open();
        return 0;
    }
    


  • DAnn schau doch mal nach was Date today; macht ... als tipp ... es ist der Date() Konstruktor .. was du hast keinen Konstruktor? und die Variabeln werden nicht initialisiert? Tjaaa ....... bloss weil du das Ding today nennst, steht da nicht das Datum von heute drin! Achso .. vielleicht solltest du in init_day auch mal das Date initialisieren ... 😉

    Vielleicht hilft das ja:

    struct Date{
        int year;  // Jahr
        int month;  // Monat
        int day;  // Tag
    
        Date() : year(0),month(0), day(0) {} // default alle auf 0 ... vieleicht besser alle auf heute?
    
        void setDate(int y, int m, int d) { setYear(y); setMonth(m); setDay(d);}
    
        void setYear(int y)  { if (y>1900 && y<2200) year = y; }
        void setMonth(int m) { if (m>00 && m<13) month=m; }
        void setDay(int d)   { if (d>0 && d<32) day=d; } // mhhh ... 30/31,28/29 Tage usw. egal
    };
    


  • Das mit dem Konstruktor ist gut gemeint, nur darf ich jetzt in dieser Übung keine Konstruktor nutzen. Ich muss mit dem drei werten der Struktur und mit void add_day und void init_day arbeiten.

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

    Doch es kommen nicht die Ergebnisse die man erwartet.



  • 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...


Anmelden zum Antworten