Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » variable Mengen in C++

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ] [ 4 ] [ 5 ]
010
13.07.2003, 14:16 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


mal ne anmerkung

C++:
...
void Menge::Add(int element)
{
    Menge merke(*this);
    anzahl++;
    elemente= new int[anzahl];
    for(int i = 0;i<anzahl-1;i++)
        elemente[ i ]=merke.GetElemente(i);
    elemente[anzahl-1]=element;
}
...



ist ne ganz üble Sache weil du dir damit den speicher vollmüllst. elemente zeigt vorher auf den von dir allokierten speicherbereich (unter der annahme das welcher allokiert wurde. den gibst du aber nicht wieder frei.

wenn du das schon so machst dann machs lieber in etwa so:


C++:
void Menge::Add(int element)
{
    Menge merke(*this);
    if(anzahl) delete [] elemente;
    anzahl++;
    elemente= new int[anzahl];
    for(int i = 0;i<anzahl-1;i++)
        elemente[ i ]=merke.GetElemente(i);
    elemente[anzahl-1]=element;
}




Gruss Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
13.07.2003, 15:15 Uhr
Oliver
S2-Pixelgeneral


@Heiko:

und was mach ich bei der Schnittmenge falsch?
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
13.07.2003, 19:59 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Hm mal schauen
auf den ersten Blick siehts richtig aus.
Muss ich mal eben testen.
deine Schnittmenge geht
probier mal so


C++:
.../hier deinen Krempel kopieren
int main(){

Menge a,b;

a.Add(1);
a.Add(2);
a.Add(3);
a.Add(4);

b.Add(1);
b.Add(2);
b.Add(5);
b.Add(4);

int i;
for(i=0;i<a.GetAnzahl();i++) printf("%d\t",a.GetElemente(i));printf("\n\n");
for(i=0;i<b.GetAnzahl();i++) printf("%d\t",b.GetElemente(i));printf("\n\n");
for(i=0;i<(a.Schnittmenge(b)).GetAnzahl();i++) printf("%d\t",(a.Schnittmenge(b)).GetElemente(i));printf("\n\n");

return 0;
}



Dein problem ist vermutlich ein anderes

du machst wahrscheinlich irgendwo in deinem programm sowas


C++:
Menge c;
c=a.Schnittmenge(b); //und hier funzt das nicht



das liegt wohl daran das du diesen operator des gleichsetzens (Zuweisung) noch nicht definiert hast. Er weiss ja gar nicht was das heisst wenn du sagst menge A ist gleich Menge B. Musst du erst noch definieren.

Ich kann mich natürlich auch irren vermute aber mal das dein problem hier liegt


Gruss Heiko
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 13.07.2003 um 20:00 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
13.07.2003, 20:22 Uhr
~Jerome83
Gast


ich glaub ich muss das erstmal verstehen, so kapier ich das nie. kann mir einer von euch mal ne main funktion schreiben die folgendes kann:

es sollen 2 mengen erstellt werden. der benutzer wird gefragt ob er seiner Menge1 ein Element hinzufügen möchte. wenn nicht bleibt die Menge1 leer. wenn ja dann soll er seine zahl eingeben und dann wid er wieder gefragt, usw.

is er mit der Menge1 fertig folgt Menge2 genauso...

WIE GEHT DAS???
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
13.07.2003, 20:40 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


also so ein menu zu machen ist nicht weiter schwer kannst du z.b. so machen.


C++:
#include <iostream>
using namespace std;

int main(){

char x;

while(true){
    cout << "(1) Element Menge 1 hinzufuegen"<<endl;
    cout << "(2) Element Menge 2 hinzufuegen"<<endl;
    cout << "(3) Schnittmenge ausgeben" << endl;
    cout << "(4) Ende" << endl << endl;

    cout << "Ihre Wahl:";
    cin >> x;
    switch(x){
        case 1: cout<< "Hier muss noch die Funktion, die ein Element zu Menge 1 hinzufuegt, implementiert werden"<<endl; break;
        case 2: cout<< "Hier muss noch die Funktion, die ein Element zu Menge 2 hinzufuegt, implementiert werden"<<endl; break;
        case 3: cout<< "Hier muss noch die Funktion, die die Schnittmenge ermittelt, implementiert werden"<<endl; break;
        case 4: return 0;
        default : cout << "Menupunkt " << x << " exitiert nicht"<<endl;

    }
}

return 0;
}


--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
13.07.2003, 20:46 Uhr
Oliver
S2-Pixelgeneral


So die komplette Klasse nochmal mit kleinen Programm:


C++:
#include <iostream>
using namespace std;

class Menge
{
    int* elemente;
    int anzahl;
public:
    Menge();
    ~Menge(){delete [] elemente;}
    Menge(const int elements[],const int &anzahl);
    Menge(Menge &vorh);
    void Add(int element);
    Menge Schnittmenge(Menge &meng2);
    int GetAnzahl();
    int GetElemente(const int &index);
             Menge operator=(Menge &menge2);
    bool IsVorhanden(const int &element);
    Menge Vereinigungsmenge(Menge menge2);
    // ...
};




Menge::Menge(const int elements[],const int &anzahl2)
{
    elemente=new int[anzahl2];
    anzahl=anzahl2;
    for(int i =0;i<anzahl;i++)
        elemente[i] = elements[i];
    anzahl = anzahl2;
}

Menge::Menge()
{
    elemente=0;
    anzahl=0;
}

bool Menge::IsVorhanden(const int &element)
{
    for(int i =0;i<anzahl;i++)
        if(elemente[i]==element)
            return 1;
    return 0;
}


int Menge::GetAnzahl()
{
    return anzahl;
}

int Menge::GetElemente(const int &index)
{
    return elemente[index];
}

Menge::Menge(Menge &vorh)
{
    anzahl = vorh.GetAnzahl();
    elemente = new int[anzahl];
    for(int i =0;i<anzahl;i++)
        elemente[i] = vorh.GetElemente(i);
}

Menge Menge::operator=(Menge &menge2)
{
    anzahl=menge2.GetAnzahl();
    if(anzahl) delete [] elemente;
    elemente = new int[anzahl];
    for(int i=0;i<anzahl;i++)
        elemente[i] =  menge2.GetElemente(i);
    return *this;
}





void Menge::Add(int element)
{
    Menge merke(*this);
    anzahl++;
    if(anzahl) delete [] elemente;
    elemente= new int[anzahl];
    for(int i = 0;i<anzahl-1;i++)
        elemente[i]=merke.GetElemente(i);
    elemente[anzahl-1]=element;
}

Menge Menge::Vereinigungsmenge(Menge menge2)
{
    Menge erg;
    int i;
    for(i=0;i<anzahl;i++)
        if(!erg.IsVorhanden(elemente[i])) erg.Add(elemente[i]);
    for(i=0;i<menge2.GetAnzahl();i++)
        if(!erg.IsVorhanden(menge2.GetElemente(i))) erg.Add(menge2.GetElemente(i));
    return erg;
}



Menge Menge::Schnittmenge(Menge &meng2)
{
    Menge erg;
    for(int z =0;z<meng2.GetAnzahl();z++)
     for(int i = 0;i<anzahl;i++)
         if(elemente[i] == meng2.GetElemente(z)) erg.Add(elemente[i]);
    return erg;
}

// Das geht nicht...

int main(){

    int elemente1[6] = {0,1,2,3,4,5};
    int elemente2[6] = {4,5,6,7,8,9};

    Menge menge1(elemente1,6);
    Menge menge2(elemente2,6);
    Menge ergebnis=menge1.Schnittmenge(menge2);

    for(int i =0;i<ergebnis.GetAnzahl();i++)
        cout << ergebnis.GetElemente(i) << ", ";

    cout << "\n\n";

    Menge ergebnis2=menge1.Vereinigungsmenge(menge2);

    for(i =0;i<ergebnis2.GetAnzahl();i++)
        cout << ergebnis2.GetElemente(i) << ", ";
    cin.get();

return 0;
}



@Heiko:

Du hattest Recht, hab jetzt den = Operator, da gehts.

@Jerome83:

Bitte nimms mir nicht übel, aber ich wird auch mal was alleine machen.
Das ist ja wohl nicht so schwierig.
Mit cin und cout...

Es ist sowieso sinnlos das zu erklären, wenn du's sowieso nicht kapierst.
Das kann man nicht so eben schnell im Forum erklären.
Ein Forum ist für konkrete Fragen da.

Wenn du mehr wissen, willst kauf dir so ein kleines Taschenbuch (10 €).

Bitte versteh micht nicht falsch, aber ist so.
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
13.07.2003, 20:57 Uhr
0xdeadbeef
Gott
(Operator)


Wenn ich mich dazu auch mal einklinken dürfte: Wenn man die Code-Größe ein bisschen runterschrauben will und das ganze per STL macht, sähe das etwa so aus:

C++:
#include <set>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#include <iterator>

using namespace std;

int main() {
    string buffer_line;
    stringstream buffer_stream;
    int buffer_zahl;
    set<int> menge[2], schnitt, vereinigt;

    for(int i = 0; i < 2; ++i) {
        cout << "Menge " << (i+1) << " eingeben: ";

        getline(cin, buffer_line);
        buffer_stream.str(buffer_line);

        while(!buffer_stream.fail()) {
            buffer_stream >> buffer_zahl;
            menge[i].insert(buffer_zahl);
        }
        buffer_stream.clear();
    }

    for(int i = 0; i < 2; ++i) {
        cout << "Menge " << (i+1) << ":";
        copy(menge[i].begin(), menge[i].end(), ostream_iterator<int>(cout, " "));
        cout << endl;
    }

    cout << "Schnitt: ";
    set_intersection(menge[0].begin(), menge[0].end(),
                        menge[1].begin(), menge[1].end(),
                        ostream_iterator<int>(cout, " "));

    cout << endl << "Vereinigung: ";
    set_union(  menge[0].begin(), menge[0].end(),
                menge[1].begin(), menge[1].end(),
                ostream_iterator<int>(cout, " "));
    cout << endl;

    return 0;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
13.07.2003, 21:00 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Olli
du musst dir übrigens nicht immer krampfhaft neue variablennamen ausdenken bzw durchnummerieren.

z.B. hier.

C++:
Menge::Menge(const int elements[],const int &anzahl2)
{
    elemente=new int[anzahl2];
    anzahl=anzahl2;
    for(int i =0;i<anzahl;i++)
        elemente[ i ] = elements[ i ];
    anzahl = anzahl2;
}



so gehts auch


C++:
Menge::Menge(const int elemente[],const int &anzahl)
{
    this.anzahl=anzahl;
    this.elemente=new int[anzahl];
    for(int i =0;i<anzahl;i++)
        this.elemente[ i ] = elemente[ i ];
}


Gruss Heiko
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 13.07.2003 um 21:01 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
13.07.2003, 21:33 Uhr
Oliver
S2-Pixelgeneral


@Oxdeadbeef:

Dafür ist das eigentlich Programm größer .
Ich kann dieses Zeug nicht so leiden, da mach ich mir lieber meine eigenen Klassen.

Ich finde, das das alles noch schwieriger macht, obwohl es schon schwierig genug ist

Gruß Oli
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )

Dieser Post wurde am 13.07.2003 um 21:34 Uhr von Oliver Müller editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
13.07.2003, 21:41 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Olli
Ich hasse diese templates zwar auch, was wohl aber auch eher daran liegen wird, dass ich nicht richtig mit umgehen kann.

Wirklich grösser machen sie das Programm ja nicht sondern du bekommst eine typenunabhängige Implementierung.
Deine Klasse funktioniert, wenn sie denn mal fertig ist, nur auf int.
hättest du ne templateklasse geschrieben könntest du das auf jeden beliebigen datentypen laufen lassen

"schwieriger" wirds halt weil dieses Konzept mächtiger ist. Da kommen eben noch ein paar Freiheitsgrade hinzu.

Gruss Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ] [ 4 ] [ 5 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: