Zum Inhalt springen

X,Y in STL container speichern, sortieren, operatorenueberladung?


Empfohlene Beiträge

Geschrieben

hi,

wollte mich erstmal vorstellen, bin der et_schneid und mach ein wenig hobbymaessige cpp-programmierung; bin aber nicht so der crack, leider. :(

hab nun eine aufgabe, an der ich mir die zaehne ausbeisse; vielleicht habt ihr ja eine idee, wie ichs loesen kann (meine "antwort" auf die aufgabe steht weiter unten):

ok, hier die aufgabe:


Definieren Sie eine Klasse Punkt mit zwei int-Elementdaten, x und y.
Benutzen Sie den STL-container Vector, um eine Reihe Punkt-Objekte zu speichern.
Dafür muss von der Tastatur eine Reihe Paare x, y eingelesen werden.
Es ist nicht bekannt wie viel solcher Paare eingegeben werden. Benutzen Sie bei der Eingabe ein nicht-numerisches Zeichen als Abschlusskode.

Definieren Sie die Operatoren == und < für zwei Punkt-Objekte, wobei p<q die folgende Bedeutung hat:

p.x < q.x || (p.x == q.x && p.y < q.y)

Benutzen Sie den STL-Algorithmus sort, um die Reihe eingelesener Punkte zu sortieren und das laut den gerade definierten Sortier-Operator <.
[/PHP]

Und nun meine "Antwort" - leider unvollstaendig, liest nur einen wert ein und ueberlaedt die operatoren fuer sort nicht ... ka, wie man sowas macht...

[PHP]
#include <iostream>
#include <vector>
#include <algorithm>
#include <stdlib.h>

using namespace std;
class punt
{
private:
int x;
vector<int> v;
public:
void eingabe();
void sortieren();
void ausgabe();
};

void punt::eingabe() {
cout << "Gib was ein oder benutzt Du etwa AOL?\n";
while (cin >> x)
v.push_back(x);
};

void punt::sortieren() {
sort(v.begin(), v.end());
};

void punt::ausgabe() {
cout << "Sortiert sieht das so aus:\n";
int n = v.size();
for (int i=0; i<n; i++)
cout << v[i] << endl;
};


int main()
{
punt punkt;
punkt.eingabe();
while(!cin.fail())
{
punkt.eingabe();
};
punkt.sortieren();
punkt.ausgabe();
system("PAUSE");
};

kann mir mal jemand sagen, was ich falsch mache, bzw. wie ich meine loesung so erweitere, dass x und y im container gespeichert werden und ich diese sortieren kann (mit operatorenueberladung)?

vielen, vielen dank und gruss,

et_schneid

Geschrieben

Hallo!

Ich denke, Du verstehst die Aufgabe falsch.

Benutzen Sie den STL-container Vector, um eine Reihe Punkt-Objekte zu speichern.

Das bedeutet, Du sollst eine Klasse mit

class Punkt

{

private:

int x, y;

//...

};

schreiben und dann, nicht in der Punktklasse, einen Vector<Punkt> anlegen, der mehrere Punkte speichern kann. Aber Deine Punktklasse soll nicht mehrere Koordinaten speichern können.

HTH

Jan

Geschrieben
Original geschrieben von Orffi

Hallo!

Ich denke, Du verstehst die Aufgabe falsch.

Das bedeutet, Du sollst eine Klasse mit

class Punkt

{

private:

int x, y;

//...

};

schreiben und dann, nicht in der Punktklasse, einen Vector<Punkt> anlegen, der mehrere Punkte speichern kann. Aber Deine Punktklasse soll nicht mehrere Koordinaten speichern können.

HTH

Jan

nein, das habe ich zuerst auch gedacht, aber das ergibt einfach weniger sinn.

ich habe es jetzt so geloest ...


#include <iostream>
#include <vector>
#include <algorithm>
#include <stdlib.h>

using namespace std;
class punt
{
private:
int x, y;
// vector<int> v;
public:
void eingabe();
void sortieren();
void ausgabe();
};

void punt::eingabe(int xx, int yy) {
x = xx;
y = yy;
};

bool punt::operator==(punt q) {
if ((x==q.x) && (y==q.y))
return TRUE;
else
return FALSE;
}

bool punt::operator<(punt q) {
if ((x<q.x) || ((x=x.q) && (y < q.y)))
return TRUE;
else
return FALSE;
}

int main()
{
int x,y;
punt punkt;
vector<int> v;
punkt.eingabe();

cout << "Gib was ein oder benutzt Du etwa AOL?\n";
while(cin >> x, cin >> y, !cin.fail())
{
punkt.eingabe(x,y);
v.push_back(punkt);
};

sort(v.begin, v.end);

//punkt.sortieren();
//punkt.ausgabe();
system("PAUSE");
};

[/PHP]

ich denke, dass die aufgabe so gemeint ist ...

Geschrieben
Original geschrieben von 007ski

Hi,

ich will Dir nichts vorwerfen aber so wie du es uns gezeigt hast funktioniert es bestimmt nicht. Es reicht wenn man nur die Funktion eingabe() anschaut??

Das läuft bestimmt nicht.

du wirfst mir nichts vor; da hast einfach du recht, war auch nur n chaotisches workaround; was haelst du hier von:


#include <iostream>
#include <vector>
#include <algorithm>
#include <stdlib.h>

using namespace std;
class punt
{
private:
int x, y;
//vector<int> v;
public:
// int x, y;
void eingabe(int xx, int yy);
bool operator==(punt q);
bool operator<(punt q);
};

void punt::eingabe(int xx, int yy) {
x = xx;
y = yy;
};

bool punt::operator==(punt q) {
if ((x==q.x) && (y==q.y)) {
return true; }
else {
return false; }
}

bool punt::operator<(punt q) {
if ((x<q.x) || ((x=x.q) && (y < q.y))) {
return true; }
else {
return false; }
}

int main()
{
int x,y;
punt punkt;
vector<punt> v;

cout << "Gib was ein, pls?\n";
while(cin >> x, cin >> y, !cin.fail())
{
punkt.eingabe(x,y);
v.push_back(punkt);
};

sort(v.begin(), v.end());

int size = v.size();
for (int j=0; j<size; j++) {
cout << v[j].x() << "," << v[j].y() << endl;
}

//punkt.sortieren();
//punkt.ausgabe();
system("PAUSE");
};


[/PHP]

Geschrieben
Original geschrieben von 007ski

Es funktioniert auch nicht schau Dir z.B. des an

Aha und wenn ich es public deklariere reichts? Oder siehst Du noch andere Fehler? ... leider werden aus irgendnem grund die compilerausgaben von der IDE falsch geparsed... hilf mir doch mal :)

Geschrieben
Original geschrieben von et_schneid

Aha und wenn ich es public deklariere reichts? Oder siehst Du noch andere Fehler? ... leider werden aus irgendnem grund die compilerausgaben von der IDE falsch geparsed... hilf mir doch mal :)

Nix wird da public deklariert. ;) Fuer Membervariablen gibts Get-Methoden (und falls noetig macht man auch noch ne Set-Methode).

Goos

Geschrieben
Original geschrieben von et_schneid

Aha und wenn ich es public deklariere reichts?

natürlich nicht ;)

Original geschrieben von et_schneid

Oder siehst Du noch andere Fehler?

ja :)

Original geschrieben von et_schneid

... leider werden aus irgendnem grund die compilerausgaben von der IDE falsch geparsed...

was für compiler benutzt Du ??

Original geschrieben von et_schneid

hilf mir doch mal :)

vieleicht so:


#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class punkt
{

public:
int x, y;
punkt() : x(),y(){}
punkt(int Newx, int Newy) : x(Newx), y(Newy) {}

};
bool operator==(const punkt& x, const punkt& y)
{
return (x.x == y.y);
}
bool operator<(const punkt& x, const punkt& y)
{
return x.x < y.y;
}
typedef vector<punkt> PUNKTVECTOR;
int main()
{
PUNKTVECTOR punktVector;
PUNKTVECTOR::iterator punktIterator;
int m_x,m_y;
cout << "Gib was ein, pls?\n";
while(cin >> m_x, cin >> m_y, !cin.fail())
{
punktVector.push_back(punkt(m_x,m_y));
}
cout<<"Ausgabe vor dem sortieren"<<endl;
for (punktIterator = punktVector.begin(); punktIterator != punktVector.end();
punktIterator++)
{

cout <<"X"<< punktIterator->x << "\t"
<<"Y"<< punktIterator->y << endl;
}
cout << endl;
system("pause");

sort(punktVector.begin(), &punktVector[punktVector.size()]);

cout << "Ausgabe nach dem sortieren, sortiert bei y" << endl;
for (punktIterator = punktVector.begin(); punktIterator != punktVector.end();
punktIterator++)
cout << punktIterator->x << "\t"
<< punktIterator->y << endl;
cout << endl;
system("pause");

cout << "Ausgabe nach dem sortieren, sortiert bei x" << endl;
sort(punktVector.begin(), punktVector.end());
for (punktIterator = punktVector.begin(); punktIterator != punktVector.end();
punktIterator++)
cout << punktIterator->x << "\t"
<< punktIterator->y << endl;
return 0;
}
[/PHP]

Geschrieben
Original geschrieben von et_schneid

vielen vielen dank fuer die muehe. warum loest du es ueber einen iterator?

naja, wahrscheinlich macht er das, weil dies die einfachste möglichkeit ist, einen container element für element durchzugehen ;)

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...