Ergebnis 1 bis 5 von 5

Thema: C++ Frage

  1. #1
    Registriert seit
    01.03.2017
    Alter
    37
    Beiträge
    3

    Standard C++ Frage

    Hallo habe gerade bei der a) von dieser Aufgabe :

    https://www.pic-upload.de/view-32762232/bild.png.html

    Die Rumpf implementierungen sehen so aus.

    Code:
    #ifndef MYCODE_CJULIANDATE_H_ 
    #define MYCODE_CJULIANDATE_H_ 
    
    #include <string> 
      
    /** 
     * Diese Klasse repräsentiert ein Julianisches Datum ohne Uhrzeit. 
     */ 
    class CJulianDate { 
    private: 
        long m_days; 
      
        /** 
         * Formatiert die übergebene Tagesnummer (1-31) wie folgt: Ist die Zahl 
         * einstellig, wird ein Leerzeichen vorangestellt (3 --> " 3"). Stimmt 
         * die Zahl mit dem Tag des von diesem Objekt repräsentierten 
         * gregorianischen Datums überein, wird das Ergebnis mit eckigen 
         * Klammern umgeben ("10" --> "[10]"), sonst werden am Anfang und 
         * am Ende je ein Leerzeichen ergänzt ("10" --> " 10 "). 
         */ 
        std::string formatDayNumber (short day) const; 
      
    public: 
        /** 
         * Erzeugt ein neues Objekt mit dem angegebenen Julianischen Datum. 
         */ 
        CJulianDate(long date = 0); 
      
        /** 
         * Erzeugt ein neues Objekt, dessen Wert aus dem angegebene Gregorianische Datum 
         * berechnet wird. 
         * 
         * - year: das Jahr 
         * - month: der Monat (Januar = 1) 
         * - day: der Tag (erster Tag eines Monats: 1) 
         */ 
        CJulianDate(int year, short month, short day); 
      
        /** 
         * Liefert das Julianische Datum (Tage seit dem 1. Januar -4712 (4713 v. Chr)). 
         */ 
        long getJulianDate() const; 
      
        /** 
         * Übernimmt das angegebene Julianische Datum. 
         */ 
        void setJulianDate(long date); 
      
        /** 
         * Liefert den aktuallen Wert als Gregorianisches Datum. 
         * 
         * - year: das Jahr 
         * - month: der Monat (Januar = 1) 
         * - day: der Tag (erster Tag eines Monats: 1) 
         */ 
        void toGregorianDate(int& year, short& month, short& day) const; 
      
        /** 
         * Konvertiert und übernimmt das angegebene Gregorianische Datum. 
         * 
         * - year: das Jahr 
         * - month: der Monat (Januar = 1) 
         * - day: der Tag (erster Tag eines Monats: 1) 
         */ 
        void fromGregorianDate(int year, short month, short day); 
      
        /** 
         * Liefert den Wochentag zu dem aktuellen Datum (Montag = 1). 
         */ 
        int dayOfWeek() const; 
      
        /** 
         * Liefert den Namen des Wochentags zu dem aktuellen Datum (Montag = 1). 
         */ 
        std::string dayOfWeekAsName() const; 
      
        /** 
         * Addiert die angegebene Anzahl Tage zu diesem Julianischen Datum hinzu. 
         */ 
        CJulianDate& operator+= (long days) { 
            m_days += days; 
            return *this; 
        } 
      
        /** 
         * Vergleicht zwei Julianische Daten und liefert true, wenn das als 
         * linker Operand angegebene Datum vor dem als rechter Operand 
         * angegebenen liegt. 
         */ 
        bool operator< (const CJulianDate& rhs) const; 
      
    }; 
    
    #endif /* MYCODE_CJULIANDATE_H_ */


    Code:
      #include "CJulianDate.h" 
    #include <cstdio> 
      
    //=============================================== 
    // Ergänzen Sie Ihren Code am Ende dieser Datei! 
    //=============================================== 
      
    CJulianDate::CJulianDate(long date) { 
        m_days = date; 
    } 
      
    CJulianDate::CJulianDate(int year, short month, short day) { 
        fromGregorianDate(year, month, day); 
    } 
      
    long CJulianDate::getJulianDate() const { 
        return m_days; 
    } 
      
    void CJulianDate::setJulianDate(long date) { 
        m_days = date; 
    } 
      
    void CJulianDate::toGregorianDate(int& year, short & month, short & day) const { 
        long i, j, k, l, n; 
      
        l = m_days + 68569; 
        n = 4 * l / 146097; 
        l = l - (146097 * n + 3) / 4; 
        i = 4000 * (l + 1) / 1461001; 
        l = l - 1461 * i / 4 + 31; 
        j = 80 * l / 2447; 
        k = l - 2447 * j / 80; 
        l = j / 11; 
        j = j + 2 - 12 * l; 
        i = 100 * (n - 49) + i + l; 
      
        year = i; 
        month = j; 
        day = k; 
    } 
      
    void CJulianDate::fromGregorianDate(int year, short month, short day) { 
        m_days = day - 32075 + 1461 * (year + 4800 + (month - 14) / 12) / 4 
                + 367 * (month - 2 - (month - 14) / 12 * 12) / 12 
                - 3 * ((year + 4900 + (month - 14) / 12) / 100) / 4; 
    } 
      
    int CJulianDate::dayOfWeek() const { 
        return (m_days % 7) + 1; 
    } 
      
    std::string CJulianDate::dayOfWeekAsName() const { 
        switch (dayOfWeek()) { 
        case 1: 
            return "Montag"; 
        case 2: 
            return "Dienstag"; 
        case 3: 
            return "Mittwoch"; 
        case 4: 
            return "Donnerstag"; 
        case 5: 
            return "Freitag"; 
        case 6: 
            return "Samstag"; 
        case 7: 
            return "Sonntag"; 
        default: 
            return "(Fehler)"; 
        } 
    } 
      
    std::string CJulianDate::formatDayNumber(short day) const { 
        char buffer[5]; 
        int year; 
        short month; 
        short refDay; 
      
        toGregorianDate(year, month, refDay); 
        sprintf(buffer, day == refDay ? "[%2d]" : " %2d ", day); 
        return std::string(buffer); 
    } 
      
    bool CJulianDate::operator <(const CJulianDate& rhs) const { 
        return m_days < rhs.m_days; 
    } 
      
    //===================================================== 
    // Ergänzen Sie Ihren Code unterhalb dieses Kommentars 
    //=====================================================

    Habe das Im Header implementiert für die a)



    Code:
    ostream& operator << (ostream& lop, const CJulianDate& rhs); 
      
    };

    in der cpp

    Code:
    ostream& operator << (ostream& lop, const CJulianDate& rhs){ 
        
        lop<< rhs.dayOfWeek() << " , " << rhs.formatDayNumber(short day) << " ." endl; 
        
    }
    Welche Funktion rufe ich für Tag ,monat und Jahr auf ?

    Es gibt ja viele ?

  2. #2
    vstm ist offline Fortgeschrittener Benutzer
    Registriert seit
    28.12.2008
    Ort
    Züri Oberland
    Alter
    33
    Beiträge
    123

    Standard AW: C++ Frage

    Ja,anscheinend gibt es viele Methoden, aber nur eine welche dir die Werte für Tag, Monat und Jahr zurück geben.

    Hinweis 1: Du erhälst die Werte als Referenz zurück
    Hinweis 2: Es ist nicht die "formatDayNumber" Methode (welche eh private ist), aber diese Methode enthält die Methode welche Du benötigst.

    Ah ja, äh deklarierst du den operator << in der Klasse? Falls ja musst du die Deklaration aus der Klasse heraus nehmen. Das überladen des Streaming-Operators funktioniert AFAIK nur als Funktion und nicht als Methode.

  3. #3
    Registriert seit
    01.03.2017
    Alter
    37
    Beiträge
    3

    Standard AW: C++ Frage

    Dann kann es ja nur diese Methode sein die ich verwenden muss :

    Code:
    void CJulianDate::toGregorianDate(int& year, short & month, short & day) const { 
        long i, j, k, l, n; 
      
        l = m_days + 68569; 
        n = 4 * l / 146097; 
        l = l - (146097 * n + 3) / 4; 
        i = 4000 * (l + 1) / 1461001; 
        l = l - 1461 * i / 4 + 31; 
        j = 80 * l / 2447; 
        k = l - 2447 * j / 80; 
        l = j / 11; 
        j = j + 2 - 12 * l; 
        i = 100 * (n - 49) + i + l; 
      
        year = i; 
        month = j; 
        day = k; 
    }
    Ich deklariere mal den ostream ausserhalb der Klasse

    Code:
    #ifndef MYCODE_CJULIANDATE_H_ 
    #define MYCODE_CJULIANDATE_H_ 
    
    #include <string> 
      
    /** 
     * Diese Klasse repräsentiert ein Julianisches Datum ohne Uhrzeit. 
     */ 
    class CJulianDate { 
    private: 
        long m_days; 
      
        /** 
         * Formatiert die übergebene Tagesnummer (1-31) wie folgt: Ist die Zahl 
         * einstellig, wird ein Leerzeichen vorangestellt (3 --> " 3"). Stimmt 
         * die Zahl mit dem Tag des von diesem Objekt repräsentierten 
         * gregorianischen Datums überein, wird das Ergebnis mit eckigen 
         * Klammern umgeben ("10" --> "[10]"), sonst werden am Anfang und 
         * am Ende je ein Leerzeichen ergänzt ("10" --> " 10 "). 
         */ 
        std::string formatDayNumber (short day) const; 
      
    public: 
        /** 
         * Erzeugt ein neues Objekt mit dem angegebenen Julianischen Datum. 
         */ 
        CJulianDate(long date = 0); 
      
        /** 
         * Erzeugt ein neues Objekt, dessen Wert aus dem angegebene Gregorianische Datum 
         * berechnet wird. 
         * 
         * - year: das Jahr 
         * - month: der Monat (Januar = 1) 
         * - day: der Tag (erster Tag eines Monats: 1) 
         */ 
        CJulianDate(int year, short month, short day); 
      
        /** 
         * Liefert das Julianische Datum (Tage seit dem 1. Januar -4712 (4713 v. Chr)). 
         */ 
        long getJulianDate() const; 
      
        /** 
         * Übernimmt das angegebene Julianische Datum. 
         */ 
        void setJulianDate(long date); 
      
        /** 
         * Liefert den aktuallen Wert als Gregorianisches Datum. 
         * 
         * - year: das Jahr 
         * - month: der Monat (Januar = 1) 
         * - day: der Tag (erster Tag eines Monats: 1) 
         */ 
        void toGregorianDate(int& year, short& month, short& day) const; 
      
        /** 
         * Konvertiert und übernimmt das angegebene Gregorianische Datum. 
         * 
         * - year: das Jahr 
         * - month: der Monat (Januar = 1) 
         * - day: der Tag (erster Tag eines Monats: 1) 
         */ 
        void fromGregorianDate(int year, short month, short day); 
      
        /** 
         * Liefert den Wochentag zu dem aktuellen Datum (Montag = 1). 
         */ 
        int dayOfWeek() const; 
      
        /** 
         * Liefert den Namen des Wochentags zu dem aktuellen Datum (Montag = 1). 
         */ 
        std::string dayOfWeekAsName() const; 
      
        /** 
         * Addiert die angegebene Anzahl Tage zu diesem Julianischen Datum hinzu. 
         */ 
        CJulianDate& operator+= (long days) { 
            m_days += days; 
            return *this; 
        } 
      
        /** 
         * Vergleicht zwei Julianische Daten und liefert true, wenn das als 
         * linker Operand angegebene Datum vor dem als rechter Operand 
         * angegebenen liegt. 
         */ 
        bool operator< (const CJulianDate& rhs) const; 
      
    }; 
    
    ostream& operator << (ostream& lop, const CJulianDate& rhs);   Hier richtig ?
    
    #endif /* MYCODE_CJULIANDATE_H_ */
    So ausgeben ?

    Code:
    ostream& operator << (ostream& lop, const CJulianDate& rhs){ 
        
        lop<< rhs.dayOfWeek() << " , " << rhs.toGregorianDate(int& year, short & month, short & day) << " ." <<endl;
        
    }
    Aber in der Methode wird es ja als Jahr,Monat und Tag ausgegeben ?
    Ich will es ja als Tag,Monat ,Jahr ?

    Wie drehe ich die Reihenfolge um?

  4. #4
    vstm ist offline Fortgeschrittener Benutzer
    Registriert seit
    28.12.2008
    Ort
    Züri Oberland
    Alter
    33
    Beiträge
    123

    Standard AW: C++ Frage

    Ja, dort ist die Deklaration richtig.

    Bezüglich der Reihenfolge: Konntest Du den Code so kompilieren? Ich denke der Compiler meldet bei der Implementation des operator<< irgendwelche Syntaxfehler.

    Das Problem ist, dass die Funktion "toGregorianDate" drei Referenzen als Parameter erwartet. Das heisst du musst diese Parameter angeben und die Funktion füllt dann die Werte in diese Parameter ab (das wird auch Output Parameter genannt). Der eigentliche Rückgabewert der Funktion ist "void", das heisst die Funktion gibt nichts zurück und ist nicht dafür gedacht so verwendet zu werden.

    Guck dir nochmal die "formatDayNumber" Methode an, um zu sehen wie die Funktion verwendet wird. Wenn du die Funktion richtig verwendest, wird es auch kein Problem sein die einzelnen Komponenten des Datums (Tag, Monat, Jahr) in einer beliebigen Reihenfolge auszugeben.

  5. #5
    Registriert seit
    01.03.2017
    Alter
    37
    Beiträge
    3

    Standard AW: C++ Frage

    rhs.formatDayNumber(day,month,year);

    Meinst du es so ?

    Ich habe nur die zu veränderte Zeile gepostet

Ähnliche Themen

  1. Frage
    Von AnarchyPunk im Forum Webdesign
    Antworten: 4
    Letzter Beitrag: 06.02.2007, 17:21
  2. Ram frage
    Von das_boot im Forum Hardware
    Antworten: 16
    Letzter Beitrag: 03.10.2005, 11:36
  3. VoIP Frage...
    Von poiu im Forum Hardware
    Antworten: 2
    Letzter Beitrag: 21.09.2005, 07:18
  4. WC Frage??!!
    Von HAMSTER im Forum Off Topic
    Antworten: 9
    Letzter Beitrag: 11.05.2005, 08:01

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •