Mit Punkten arbeiten



  • Naja das kann alles mehre Gründe haben.
    Was ist deine Klasse Point? Wie sieht sie aus?Hat sie geeignete Konstruktoren?
    Und was machst du da mit dem ifstream? Von wo ließt du denn ein?
    Poste mal mehr Code, keep_window_open fehlt auch...wobei ich mir denken kann was diese Funktion macht.

    Lg freeG

    EDIT: Da war Nexus schneller...allerdings braucht deine Klasse auch ein Konstruktor der die beiden Werte entgegennimmt und die Member damit initialisiert.



  • Das heißt das man es so machen soll. Laut meinem Buch (Einführung in die Programmierung mit C++ von Bjarne Stroustrup) ist das geschrieben: Legen Sie ein neues Projekt an, das mit Punkten arbeitet (siehe §10.4). Definieren Sie dazu zuerst den Datentyp Pont, mit den beiden Koordinatenmembern x und y. Und unter §10.4 ist das geschrieben :

    vector <Point> points;
    Point p;
    while (istr>>p) points.push_back(p);
    

    Da habe ich dann die Aufgabe falsch verstanden.



  • Definieren sie den Datentyp Point bedeutet das, was Nexus auch geschrieben hat. Du musst eine Klasse definieren.

    z.B.: so

    class Point
    {
       public:
         Point( int _x, int _y ) : x(_x), y(_y) {}
       private:
         int x;
         int y;
    }
    


  • Das ist bei §10.4 geschrieben:

    cout << "Geben Sie bitte den Namen der Eingabedatei ein:";
    string name;
    cin >> name;
    ifstream istr(name.c_str());
    if(!istr)error ("Fehler beim Oeffnen der Eingabedatei ",name);
    
    vector <Point> points;
    Point p;
    while(istr>>p)points.push_back(p);
    
    cout << "Geben Sie bitte den Namen der ausgabedatei ein:";
    string oname;
    cin >> oname;
    ofstream ostr(oname.c_str());
    if(!ostr) error("Fehler beim Oeffnen der Ausgabedatei",oname);
    


  • winux schrieb:

    Definieren Sie dazu zuerst den Datentyp Point, mit den beiden Koordinatenmembern x und y.

    Ohne das Buch zu kennen, gehe ich stark davon aus das vorher beschrieben wird, wie man eigene Datentypen erstellt (Vermutlich mittels struct oder class).

    Da laut google-Books das Kapitel "Klassen und mehr" (8) vorher kommt, solltest du dir dies nochmals anschauen.



  • Ich lese das so, du sollst die Klasse Point selber definieren, und diese wird dann in dem Code den du zuletzt gepostet hast benutzt.
    Allerdings hast du den Code ja in deinem ersten Post nur teilweise übernommen und auch im letzten Posting ist er nicht vollständig( ohne den Code zu kennen) da fehlt ja noch der Teil, wo vom Vektor alles in die Ausgabedatei wieder hineingeschrieben wird.

    Lg freeG



  • winux schrieb:

    Das heißt das man es so machen soll. Laut meinem Buch (Einführung in die Programmierung mit C++ von Bjarne Stroustrup) ist das geschrieben: Legen Sie ein neues Projekt an, das mit Punkten arbeitet (siehe §10.4).

    Ja, und an der Stelle, an der Du jetzt bist steht:

    winux schrieb:

    Definieren Sie dazu zuerst den Datentyp Pont, mit den beiden Koordinatenmembern x und y.

    Wenn Du nicht weißt, dass Du hierfür:

    vector <Point> points;
    Point p;
    while (istr>>p) points.push_back(p);
    

    erst mal einen entsprechenden Datentyp benötigst, dann fang das Buch noch mal von vorne an (ich nehme an, dass das schon erwähnt worden ist; aber ich kenne das Buch nicht).



  • Dann muss man den Benutzer auffordern sieben (x,y) Paare einzugeben. Die Daten sollen in einen Point-Vektor namens original_points gespeichert werden. Doch das Problem ist wie kann es machen das es nur sieben eingaben sind und nicht mehr. Und das habe ich bis jetzt gemacht:

    void f()
    {
    	ifstream istr;
    
    	class Point 
        { 
        public: 
           Point( int xx, int yy ) : x(xx), y(yy) {}
    	   vector <Point> original_points;
    	   int x2(){return x;}
    	   int y2(){return y;}
        private: 
           int x,y;  
        };
    	int x3,y3;
    	cout << "Geben Sie sieben (x,y)-Paare ein." << endl;
    	while (istr>>x3>>y3){
    		Point::original_points.push_back(Point(x3,y3));};
    }
    
    int main()
    {
        f();
    
    	keep_window_open();
        return 0;
    }
    

    Und da sagt der Compiler push_back muss sich eine Klasse/Struktur/Union befinden. Wenn ich aber Point:: weglasse dann sagt der Compiler es findet original_points nicht.



  • Der korrigierter Code:

    ifstream istr;
    
    	class Point 
        { 
        public: 
           Point( int xx, int yy ) : x(xx), y(yy) {}
    	   int x2(){return x;}
    	   int y2(){return y;}
        private: 
           int x,y;  
        };
    	vector <Point> original_points;
    	int x2,y2;
    	cout << "Geben Sie sieben (x,y)-Paare ein." << endl;
    	while (istr>>x2>>y2){
                    if (x2 <= 0 || x2 >= 10000) error("ungueltige eingabe"); 
    		original_points.push_back(Point(x2,y2));};
    

    Doch wieso kann man keine werte eingeben?



  • Weil der Code nicht korrigiert ist und sich nicht kompilieren lässt. Ohne lauffähiges Programm lässt sich auch nix eingeben.



  • Der Code wurde korrigiert das Programm läuft doch ich kenn keine Eingabe machen. Die Eingabe von istr auf cin geändert jetzt kann man etwas eingeben.



  • Also ist jetzt echt nicht böse gemeint, aber ich würd dir empfehlen das Buch nochmal von vorne zu lesen, denn dir fehlen anscheinend sehr viele Grundlagen.
    Außerdem, soll der vector Teil der Klasse sein oder nicht?

    Hier mal ein Beispiel-Pseudo-Code:

    Point.h

    //hier definierst du deine Klasse
    

    main.cpp

    #include "Point.h"
    #include <iostream>
    #include <vector>
    
    int main()
    {
       vector<Point> original_points;
       for( int i = 0; i < 7; ++i )
       {
         cout << "Bitte geben sie einen x- und einen y-Wert ein: ";
         int x, y;
         cin >> x;
         cin >> y;
         original_points.push_back( Point(x,y) );
       }
    }
    

    Lg freeG



  • Danke für die Hilfe, werde das Buch dann mal zurückblättern. Habe auch die Point.h definiert. Doch jetzt ist es so das man keine Werte einlesen kann. Es wird 7-mal das was in cout ist angezeigt.



  • Das mit dem Zurückblättern wird dir auf jeden Fall helfen 😉
    So jetzt hab den Beitrag oben geändert, hatte die Eingabe aus irgendeinem Grund vergessen:D( warscheinlich zu stark von Mathe abgelenkt )

    Lg freeG



  • So jetzt geht alles, danke für deine Hilfe. Denke auch zurückblättern hilft immer weil man auch sehr viel Sachen vergisst. Doch wie der Autor gesagt hat Programmieren lernt man in dem man Code schreibt und nicht wenn man ein Buch liest.



  • Edit: hatte nicht registriert das der Thread inzwischen deutlich weiter fortgeschritten ist...

    winux schrieb:

    Und das habe ich bis jetzt gemacht

    Es deutet vieles darauf hin, das du das Buch nochmal von Anfang an intensiv lesen solltest.

    1. Deklariere den Datentyp nicht lokal (Es sei den du weist wirklich was du da tust).
    2. Der Vector gehört nicht in die Punktklasse hinein, was ganz davon abgesehen, so auch nicht so funktionieren kann.
    3. Für die Verwendung des Vectors sollte die Klasse einen Standardkonstruktor (Sprich einen ohne Argumente, oder mit Defaultargumenten) haben.
    4. Selbst wenn 2 funktionieren würde, könntest du nicht auf Nicht-Statische Membervariablen ohne eine Instanz zugreifen (Ist dir der Unterschied zwischen Klasse und Objekt [im OO-Sinne] bzw. Instanz klar?).



  • winux schrieb:

    So jetzt geht alles, danke für deine Hilfe. Denke auch zurückblättern hilft immer weil man auch sehr viel Sachen vergisst. Doch wie der Autor gesagt hat Programmieren lernt man in dem man Code schreibt und nicht wenn man ein Buch liest.

    Es stimmt zwar, das man nicht alleine vom Bücher lesen lernt, aber in deinen Fall scheint mir eher zu sein das du das Buch im allerbesten Fall überflogen hast (Und wenn das Kapitel 10 auf die anderen Kapitel übertragbar ist, werden in jedem davon Übungen gemacht).



  • Jetzt will ich die Werte im Vektor ausgeben lassen, doch der Compiler sagt error C2679: Binärer Operator '<<': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'Point' akzeptiert (oder keine geeignete Konvertierung möglich). Doch wie ich es weiß muss man doch so die werte ausgeben lassen.

    void f()
    {
       vector<Point> original_points; 
       for( int i = 0; i < 7; ++i ) 
       { 
         cout << "Bitte geben sie einen x- und einen y-Wert ein: "; 
         int x, y; 
         cin >> x >> y;
    	 if (x  >= 10000 || x <= 0 || y <= 0 || y >= 10000) {cout << "ungueltiger wert" << endl; break;}
         original_points.push_back( Point(x,y) );
    	 }
       for ( int i = 0; i < original_points.size(); ++i)
    	     cout << original_points[i] << "\n";
    }
    
    int main()
    {
        f();
    
    	keep_window_open();
        return 0;
    }
    


  • winux schrieb:

    ...Doch wie ich es weiß...

    Du rätst dich hier doch nur durch. Ob man dir aktuell helfen sollte wage ich eigentlich zu bezweifeln (da dies nur mehr fragen nach sich zieht, die beim "echten" Lesens des Buches mit Sicherheit nicht auftreten würden.

    Nur ein Tip: Der operator<< unterstützt direkt weder den Vector- noch deine Point-Klasse. Du kannst aber durchaus die Einzelwerte jedes Elementes einzeln ausgeben...



  • das geht auch, du musst nur die entsprechende Methode implementieren die den operator <<(...) entsprechend überläd so dass sie deine Point-typen frisst und die Koordinaten ausspuckt


Anmelden zum Antworten