C++ ostream



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

    #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_ */
    

    cpp

    #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
    //=====================================================
    

    Ich weiss das hier nicht gerne bei Aufgaben geholfen wird , aber vielleicht könnt ihr mir tipps geben ob das in etwa der richtige Ansatz bei der a) ist?
    Habe das Im Header implementiert für die a)

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

    cpp

    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 ?



  • IT21 schrieb:

    ostream& operator << (ostream& lop, const CJulianDate& rhs){
    	
    	lop<< rhs.dayOfWeek() << " , " << rhs.formatDayNumber(short day) << " ." endl;
    	
    }
    

    Und dein Compiler übersetzt das?

    IT21 schrieb:

    Welche Funktion rufe ich für Tag ,monat und Jahr auf ?

    Es gibt ja viele ?

    Ja? Welche liefern denn Tag ,monat und Jahr?



  • ostream& operator << (ostream& lop, const CJulianDate& rhs){

    lop<< rhs.dayOfWeek() << " , " << rhs.formatDayNumber(short day) << " ." endl;

    }

    Es wird bei der obigen Implementierung ein Fehler bei ostream angezeigt ?

    Aber verstehe nicht wie ich es weg 😕 bekomme

    Soll ich diese Funktion aufrufen ?
    void CJulianDate::toGregorianDate(int& year, short & month, short & day) const



  • IT21 schrieb:

    Es wird bei der obigen Implementierung ein Fehler bei ostream angezeigt ?

    Hat man dir im Deutschunterricht eigentlich mal erklärt, wann man so ein '?' benutzt?
    Ich habe noch keinen Compiler gesehen, der "ein Fehler" ausgibt.

    IT21 schrieb:

    Soll ich diese Funktion aufrufen ?
    void CJulianDate::toGregorianDate(int& year, short & month, short & day) const

    Wie viele andere stehen dir denn noch zur Verfügung?



  • Ich habe noch keinen Compiler gesehen, der "ein Fehler" ausgibt.

    Mit static_assert kannst du Fehlermeldungen nach eigenem Ermessen gestalten.
    Kreativität sei wohl gefragt sein.



  • CJulianDate::CJulianDate(int year, short month, short day)

    Diese Funktion könnte man auch nutzen?



  • Du hast wohl überhaupt keine Ahnung und willst dir hier die Aufgabe lösen lassen.



  • Eigentlich wollte ich anhand der Aufgabe lernen .

    Die Aufgabe lösen zu lassen würde mir nicht besonderes bringen ,da das weder meine Hausaufgabe noch das irgendwie bewertet wird.

    Ich wollte das mir jemand ein wenig hilft beim lösen der Aufgabe ,da ich nicht so fit bin beim programmieren.

    Wäre schön wenn du mir trotzdem noch helfen würdest.

    Ansonsten danke



  • Was ist das?

    CJulianDate::CJulianDate(int year, short month, short day)
    


  • Das ist eine Methode in der Rumpf Imlementierung.

    Ich tippe mal jetzt darauf ,dass ich diese Funktion aufrufen muss ?

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


  • IT21 schrieb:

    Das ist eine Methode in der Rumpf Imlementierung.

    Und die heißt zufällig so wie die Klasse?



  • Also die Rumpf Implementierung wurde uns so gegeben manni ?

    Kannst du mir tipps geben ,was ich machen soll?



  • Merkst Du denn nicht selber, dass Dir jegliche Grundlage fehlt? Wie genau soll man Dir denn jetzt die absoluten Basics von C++ vermitteln?

    Du gehst doch auch nicht in ein Chinesisches Forum, kopierst da ein paar Zeichen und Sätze rein und erwartest dann, dass Du dadurch Chinesisch lernen kannst?

    Wenn Dir was daran liegt, C++ zu lernen, dann schnapp Dir ein Buch (Vorschläge zu qualitativer Lektüre gibt es hier im Forum genügende), setz Dich hin und arbeite es durch.
    Wenn Du dann noch Fragen hast, dann wird Dir hier sicherlich jeder gerne dabei helfen, spezifische Verständnisprobleme zu lösen.



  • Also das der Ersteller dieses Threats wohl noch nicht sich so sehr mit der Sprache beschåftigt hat ist wohl ersichtlich. Trotz alle dessem verstehe ich nicht warum hier niemand konstruktiv versucht zu helfen.

    Da nun auch nicht der Kontext ersichtlich ist, wie diese Aufgabe zustande kam und aus welchen Gründen der Ersteller nun diese Aufgabe lösen möchte.

    Als Hilfestellung: Befasse dich mit dem Begriff Referenz. Wenn du weißt, was eine Referenz ist, wie eine Referenz deklariert wird und wie diese benutzt wird, sollte die Aufgabe sehr leicht lösbar sein.

    Von daher viel Spaß noch.



  • @EasyTK

    😃 Das verstehe ich auch nicht warum nicht mal jemand versucht zu helfen?

    Wenn man alles wissen würde , würde es doch gar kein Sinn machen eine frage im Forum zu stellen.

    Referenz:

    nt a = 1; // eine Variable
    2 int &r = a; // Referenz auf die Variable a
    3
    4 std::cout << "a: " << a << " r: " << r << std::endl;

    Inwieweit hilft mir das weiter?

    Kannst du mir ein wenig weiter helfen? 😃

    Ansonsten kann man ja direkt den Thread schliessen



  • Easy_TK schrieb:

    Also das der Ersteller dieses Threats wohl noch nicht sich so sehr mit der Sprache beschåftigt hat ist wohl ersichtlich. Trotz alle dessem verstehe ich nicht warum hier niemand konstruktiv versucht zu helfen.

    Da nun auch nicht der Kontext ersichtlich ist, wie diese Aufgabe zustande kam und aus welchen Gründen der Ersteller nun diese Aufgabe lösen möchte.

    Als Hilfestellung: Befasse dich mit dem Begriff Referenz. Wenn du weißt, was eine Referenz ist, wie eine Referenz deklariert wird und wie diese benutzt wird, sollte die Aufgabe sehr leicht lösbar sein.

    Von daher viel Spaß noch.

    Er weiß ja noch nicht mal, was ein Konstruktor ist. Wo genau soll man da denn jetzt bitte ansetzen und welchen Sinn hat es?
    Er schreibt, dass die Aufgabe nicht bewertet wird und dass er sie freiwillig macht, um was zu lernen.

    Unter dem Aspekt ist die einzig logische Reaktion "Hol dir ein Buch und lern es anständig!".

    Er hat wirklich nichts davon, wenn er diese Aufgabe löst, weil er sie nicht mal ansatzweise versteht.

    IT21 schrieb:

    @EasyTK

    😃 Das verstehe ich auch nicht warum nicht mal jemand versucht zu helfen?

    Wenn man alles wissen würde , würde es doch gar kein Sinn machen eine frage im Forum zu stellen.

    Du weißt nicht "nicht alles" sondern Du weißt gar nichts. Was genau ist am dem Vorschlag, dass Du Dir ein ordentliches Buch kaufen und durcharbeiten sollst, so schlecht?
    Es wird mir hier jeder zustimmen, dass Du mit deinem momentanen Weg völlig auf dem Holzweg bist.
    Glaubst Du es besser zu wissen?



  • Easy_TK schrieb:

    Trotz alle dessem verstehe ich nicht warum hier niemand konstruktiv versucht zu helfen.

    Ich stelle meine Fragen nicht zum Spaß. Wenn man allerdings buchstäblich nichts gelernt hat, wird das schwierig.



  • Ihr habt alle recht, keine Frage.
    Doch ist die Art und Weiße, wie dies hier näher gebracht wird, auf sehr unterdurchschnittlichem Niveau, ohne jemanden dabei jetzt persönlich zu nah treten zu wollen.

    Wenn ich in meinem Nachschlagewerk unter dem Begriff Referenz nach schaue, steht dort auch bedeutend mehr zu da.

    Und Zwecks dessen, wie ich auch betont hatte, ich nicht den Kontext um die Frage herum kenne.

    Ob ihm nun mein Ratschlag hilf, weiß ich nicht und liegt auch nicht in meinem Interesse. In meiner Sicht ist dies aber der Punkt der als Hilfestellung angebracht wäre. Ob es ihm nun nützt oder nicht ist am Ende ja nun seine Sache, aber ich habe die Frage mit einem Konstruktiven Lösungsvorschlag beantwortet.

    Alles weitere liegt nun in seinem geistigem Ermessen daraus was anzufangen.

    In folge dessen entschuldige ich mich, falls ich jemand negativ durch meinen Kommentar beurteilt hätte. Das lag nicht in meinem Interesse.

    Aber ein gutes Buch sollte er sich trotzdem mal zu legen 🙂



  • Ich glaube Hilfe kann man in diesem Forum leider nicht erwarten .

    Theoretisch könnte man auch in einem Mathe Forum sagen , kauf dir ein Buch.

    Da wäre jeder Thread mit einer Antwort erledigt.



  • IT21 schrieb:

    Ich glaube Hilfe kann man in diesem Forum leider nicht erwarten .

    Theoretisch könnte man auch in einem Mathe Forum sagen , kauf dir ein Buch.

    Da wäre jeder Thread mit einer Antwort erledigt.

    Das Forum besteht schon seit einer halben Ewigkeit und alleine in dem Subforum, in dem du gerade postest, wurden bereits 535867 Posts verfasst.
    Vielleicht solltest du darüber nachdenken, dass du etwas falsch machst, wenn du von etlichen Usern einer der wenigen bist, denen nicht geholfen werden kann.


Anmelden zum Antworten