Aufgabe zu Klassen



  • Sitze vor folgender Aufgabe und weiss absolult nicht wie das funktionieren soll,
    kann mir da jemand weiter helfen? 😕

    1.)Aufgabe
    Definieren Sie einen Punkt in der Ebene mit den Koordinaten(x,y) soll eine Klasse in C++ entworfen werden die Koordinaten seinen dabei Integer-Werte.
    Definieren sie eine Klasse „Punkt“ mit Elementfunktionen und Elementdaten.
    Die Klasse muss folgende Elementfunktionen enthalten:
    Konstruktor
    Schreiben Sie den Konstruktor so, dass ein Objekt der Klasse „Punkt“ mit keinem, einem oder zwei Parameter erzeugt werden kann (Bsp: Punkt p0, p1(5), p2(1,1);). Erfolgt die Erzeugung mit keinem Parameter, so soll der Punkt mit den Koordinaten (0,0) erzeugt werden, erfolgt die Erzeugung des Punktes mit einem Parameter „r“, so soll der Punkt mit den Koordinaten (r,0) erzeugt werden. Erfolgt die Erzeugung des Punktes mit zwei Parametern „s“ und „t“, so soll der Punkt mit den Koordinaten (s,t) erzeugt werden.
    Destruktor
    Zuweisungsoperator
    Kopierkonstruktor
    Funktion zum Belegen der Koordinaten(x,y) des Punktes
    Funktion zum Auslesen der x-Koordinate des Punktes
    Funktion zum Auslesen der y-Koordinate des Punktes
    Die Elementdaten der Klasse müssen obigen Anforderungen genügen.
    Verwenden Sie wo möglich und sinnvoll die impliziten Funktion, die der Compiler zur Verfügung stellt. Geben Sie Zugriffsspezifikationen so an, dass Sie möglichst wenig Elementdaten und Elementfunktionen öffentlich zugänglich machen.
    Mit Hilfe der Klasse „Punkt“ soll nun eine Klasse für ein Polygon in dem Polygon sei durch eine … Menge von Punkten verallgemeinert, welche Punkte nacheinander durch Linien miteinander verbunden sind und zusätzlich Punkt eine Linie erstellt wird. In folgender Abbildung ist ein Polygon beschrieben
    1.1 Definieren Sie eine Klasse „Polygon“ mit Elementfunktion und Elementdaten
    Die Klasse muss folgende Elementfunktion beinhalten:
     Standardkonstruktor
     Destruktor
     Zuweisungsoperator
     Kopierkonstruktor
     Funktion zum Einfügen eines Punktes in einer bestimmten Position im Polygon
    (Die Zählung der Position eines Punktes im Polygon beginnt mit „0“. Wenn ein Punkt an der Stelle p eingefügt werden soll, dann habe er auch nach dem Einfügen die Position p und alle Punkte, die vor dem Einfügen die Position p und höher inne hatten, werden um eine Position nach hinten geschoben. Dies kann realisiert werden, indem ein neuer Vektor erzeugt und entsprechend belegt wird, anschließend kann der Speicherplatz des bisherigen Vektors freigegeben werden.)
     Funktion zum Einfügen eines Punktes ganz hinten im Polygon
    (Realisieren Sie diese Funktion durch die Benutzung der Funktion zum Einfügen eines Punktes zur bestimmten Position im Polygon.)
     Funktion zum Löschen eines Punktes in einer bestimmten Position im Polygon
    (Der Einfachheit halber braucht ein frei werdender Speicherplatz im dynamischen Vektor über eine Funktion nicht freigegeben werden.)
     Funktion zum Auslesen eines Punktes in einer bestimmten Position im Polygon
     Funktion zum Auslesen der Anzahl der Punkte im Polygon
     Geben Sie bei allen Funktionen …, dass diese … mit einem erlaubten Wert für … aufgerufen werden, d.h. eine … der Position muss nicht erfolgen.
     … Anforderungen genügen.
     …die der Compiler zur Verfügung stellt…

    1.4 Definieren Sie die Elementfunktionen, die Sie unter 1.3 deklariert haben.

    1.5 Schreiben Sie mit Hilfe der Klasse „Polygon“ ein Programm, das ein Rechteck mit der linken unteren Eckkoordinate (0,0) und der rechten oberen Eckkoordinate (1,1) als Polygon enthält.

    1.6 Damit beim Einfügen eines Punktes in das Polygon nicht jedes Mal Speicherplatz neu reserviert werden muss, soll bei Speicherplatzbedarf immer Speicher für 5 Punkte bereit gestellt werden damit die nächsten 4 Einfüge-Operationen keinen Speicherplatz allokieren brauchen. Bei einer neuen Einfüge-Operation wird dann wieder für 5 Punkte Speicherplatz reserviert.
    Implementieren Sie die Funktion zum Einfügen eines Punktes in das Polygon an einer geeigneten Stelle unter Berücksichtigung dieser Strategie des Speichermanagements.
    (Hinweis: Definieren Sie in der Klasse „Polygon“ ein Elementdatum, das angibt, wie viel Speichplatz aktuell reserviert wurde.)

    Gruß
    PrinzC



  • Nein!



  • Und vielleicht jemand anders?


  • Mod

    auch nicht



  • PrinzC schrieb:

    Und vielleicht jemand anders?

    Vielleicht gibt's jemanden hier ohne Selbstwertgefühl. Der Rest von uns wird den Teufel tun und dir deine Hausaufgaben machen.

    Wenn du spezifische Fragen hast - sprich, wenn wir das Gefühl haben, dass du selbstständig versucht hast, was zu erreichen - kannste gerne wiederkommen. Ansonsten gilt: geh zu Hause.



  • Das ist im Prinzip ganz einfach. Der erste Schritt ist, C++ zu lernen. Die Aufgabe dient dazu zu überprüfen, ob DU das verstanden hast. Wenn Du die Aufgabe lösen kannst, dann kannst Du weiter lernen. Wenn nicht, dann solltest Du nochmal die Grundlagen anschauen.

    Würde hier jemand die Aufgabe für Dich lösen, dann kann man feststellen, dass derjenige, der die Aufgabe löst, die Grundlagen von C++ beherrscht. Ob Du das kannst, bleibt völlig offen. Daher wäre es nicht Zielführend, wenn Du hier die Lösung bekommen würdest.

    Versuche Dich an der Aufgabe. Hast Du Verständnisprobleme bei einem Thema, dann kannst Du das in Deinem Lehrbuch nochmal nach lesen. Bleibt dennoch was unklar, dann schreibst Du uns, was konkret unklar ist. Dann helfen wir Dir sehr gerne.



  • Alles klaro,ich versuch mich nochmal dran dann melde ich mich nochmal 🙂



  • class Punkt()
    {
    public: Punkt ();
    ~Punkt();
    Punkt& operator =(const Punkt &source);
    void setXY( int x, int y);
    int getX ();
    int getY();

    private: int x;
    int y;
    }

    Stimmt das so? :p



  • nein



  • Ist wenigstens etwas richtiges dabei?



  • bisher ja. aber die hälfte fehlt ja noch, und damit meine ich jetzt nicht, dass die methoden nicht implementiert wurden.



  • public: Punkt ()
    { if (x=r) {x=r;y=0} ;
    else if (x=s && y=t){x=s;y=t};
    else {x=0;y=0};
    }

    so?



  • nein. beschäftige dich mal mit überladung von konstruktoren und dem unterschied zwischen zuweisungsoperator und vergleichsoperator.

    oh und im c-unterforum gibt es ein thema namens "[Neu] Syntax Highlighting für C". ich weiß jetzt nicht, warum es im c++-unterforum kein entsprechendes thema gibt, aber das dort geschriebene kannst du super übertragen.



  • class Punkt()
    {
    public: Punkt ();
    		Punkt(int a);
    		Punkt(int a, int b);
    		~Punkt();
    		Punkt& operator =(const Punkt &source);
    		void setXY( int c, int d);
    		int getX ();
    		int getY();
    
    private: int x;
    		 int y;
    } 
    
    Punkt ::Punkt() 
    {		
    	x=0;
    	y=0;
    }
    Punkt ::Punkt(int a)
    {
    	x=0;
    }
    Punkt ::Punkt(int a, int b)
    {
    	x=a;
    	y=b;
    }
    Punkt::~Punkt({}
    
    int Punkt :: getX()
    {
    	return x;
    }
    int Punkt:: getY()
    {
    	return y;
    }
    
    void Punkt::setXY (int c, int d)
    {
    	x=c;
    	y=d;
    }
    

    Wie siehts damit aus? 😕



  • ist das jetzt ein Ratespiel? Mir scheint, du willst so lange herumraten, bis es richtig wird...

    Versuch doch mal, deinen Code mit Warnungen zu kompilieren!

    Dann stellst du fest, dass wir hier immer noch "nein" sagen werden!

    Mindestens folgende Punkte sind falsch:

    1. Punkt(int a) -> Der Parameter a wird nicht genutzt (sollte Warnung ergeben)
      2. Im Destruktor Punkt::~Punkt({} sollte es aufgrund der falschen Klammern einen Fehler geben. Abgesehen davon: wozu brauchst du den Destruktor, wenn der eh nix tut?


  • ja du machst fortschritte. 🙂

    aber wenn du im konstruktor mit einem parameter die werte dieses parameters nicht in die attribute der klasse schreibst, dann werden die werte auch nicht zugewiesen.

    [oberlehrer]und wenn in der aufgabe steht, dass der konstruktor die parameter r oder s und t übernehmen soll, dann sollte er das auch tun. [/oberlehrer]



  • .. ich finde Aufgaben dieser Art fürchterbar!

    Nehmen wir's mal wörtlich:

    PrinzC schrieb:

    1.1 Definieren Sie eine Klasse „Polygon“ ..

    Lösung:

    #include <vector>
    typedef std::vector< Punkt > Polygon;
    

    fertig! erfüllt wirklich alle Anforderungen

    außer vielleicht

    PrinzC schrieb:

    Damit beim Einfügen eines Punktes in das Polygon nicht jedes Mal Speicherplatz neu reserviert werden muss, soll bei Speicherplatzbedarf immer Speicher für 5 Punkte bereit gestellt werden damit die nächsten 4 Einfüge-Operationen keinen Speicherplatz allokieren brauchen. Bei einer neuen Einfüge-Operation wird dann wieder für 5 Punkte Speicherplatz reserviert.
    Implementieren Sie die Funktion zum Einfügen eines Punktes in das Polygon an einer geeigneten Stelle unter Berücksichtigung dieser Strategie des Speichermanagements.
    (Hinweis: Definieren Sie in der Klasse „Polygon“ ein Elementdatum, das angibt, wie viel Speichplatz aktuell reserviert wurde.)

    Dort steht explizit 'Speicherplatz' und nicht 'Anzahl der Punkte im Vector'. Dies und der Rest der Aufgabenstellung zeigt doch wes Geistes Kind das ist. Der Lehrer hat wahrscheinlich vor 30 Jahren mit C angefangen und seither keine Praxis gesehen.

    und

    PrinzC schrieb:

    Schreiben Sie mit Hilfe der Klasse „Polygon“ ein Programm, das ein Rechteck mit der linken unteren Eckkoordinate (0,0) und der rechten oberen Eckkoordinate (1,1) als Polygon enthält.

    Eine Lösung wäre:

    Polygon makeRechteck() {
        return Polygon{ {0,0}, {1,0}, {1,1}, {0,1}, {0,0} };
    }
    

    aber meint hier irgend jemand, dass sich das mit der Erwartungshaltung des Lehrers deckt?

    Gruß
    Werner



  • immerhin hat sich der lehrer (hoffentlich) selbst eine aufgabe ausgedacht.
    mein professor hat sich die aufgaben von anderen hochschulen "ausgeborgt".



  • Werner Salomon schrieb:

    aber meint hier irgend jemand, dass sich das mit der Erwartungshaltung des Lehrers deckt?

    Mit dem vector kannst du das mit dem Reservieren für genau 5 weitere Punkte nicht machen, vec.reserve(n) reserviert ja für >= n und nicht für == n. Somit leider Aufgabe verfehlt, Werner, das gibt eine 6- 😉

    Ich könnte mir aber denken, dass man erst mal selbst sowas machen soll, bevor dann später gelehrt wird, dass es std::vector gibt.

    Was ich ansonsten blöd finde: die 3 Punkt-Konstruktoren. Ich verstehe den ohne Argumente => Ursprung und den mit x,y. Aber wozu soll der mit nur einem Parameter gut sein? Man fragt sich dann leicht, was der genau tut. Und wenn dann noch ein Parameter "r" heißen soll, denke zumindest ich sofort an Polarkoordinaten (wahlweise auch an Zylinder- oder Kugelkoordinaten). Halte ich also für eine schlechte Wahl - warum nicht "x"?



  • class Punkt()
    {
    public: Punkt ();
            Punkt(int a);
            Punkt(int a, int b);
            ~Punkt();
            Punkt& operator =(const Punkt &source);
            void setXY( int c, int d);
            int getX ();
            int getY();
    
    private: int x;
             int y;
    		 int a,b;
    		 int c,d;
    }
    
    Punkt ::Punkt()
    {      
        x=0;
        y=0;
    }
    Punkt ::Punkt(int a)
    {
        x=r;
    	y=0;
    }
    Punkt ::Punkt(int a, int b)
    {
        x=s;
        y=t;
    }
    Punkt::~Punkt(){}
    
    int Punkt :: getX()
    {
        return x;
    }
    int Punkt:: getY()
    {
        return y;
    }
    
    void Punkt::setXY (int c, int d)
    {
        x=c;
        y=d;
    }
    

    Soo, passt das so für Aufgabe 1? 😕
    Oder was genau ist falsch?


Anmelden zum Antworten