Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Empfohlene Antworten

Veröffentlicht

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

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

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

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]

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 :)

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

hallo und dankeschoen fuer die eingebung, but please give me an example. :-)

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]

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

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

gut, ich hab mir mal ein wenig literatur dazu besorgt und danke fuer die hilfe, echt super von euch!!! danke!

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.