Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » HAbe Problem bei der übergabe einer Menge. Bitte Hilfe !!

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 <
000
18.04.2004, 12:49 Uhr
~Thomas xyz
Gast


Habe ein Programm geschrieben, welches zwei Mengen zu einer dritten Menge vereinigen soll.

Bei der Methode Vereinigung soll dann die Vereinigungsmenge als Rückgabewert übergeben werden.Das funktioniert aber nicht.Das Programm compiliert mit 0 Fehler, läuft aber trotzdem nicht.

Als Bedingungen für das Programm gelten: nur eien einfach verkettete Liste, Keine Iteratoren, Templates verwenden.Und es soll mit Methoden implementiert werden, und nicht mit Operatoren.

Ich weiß wircklich nichtmehr weiter.Hab schon so viel ausprobiert, und komme aber nicht auf die Lösung.Bin für jede Hilfe Dankbar. Vielleicht kopiert ihr euch das Programm in eurer C++ und probiert es mal aus.Wäre super nett von euch.

mfg Thomas


C++:
#include
using namespace std;

class PRFGNode
{
public:
unsigned int elem;
PRFGNode *next;
PRFGNode(int e=0, PRFGNode *n=0):elem(e),next(n){}

};

class Set
{
public:
Set():root(0) {}
Set(int){Set *first; first=new Set();} //leere Menge
~Set(); //Destruktor, löscht alle Listenelemente
void insert_at_first(unsigned int x); //einfügen in Liste
void Ausgabe();
Set (Vereinigung(Set &b)); //UP für die Vereinigung
bool ist_in(unsigned int y); //Funktion die true zurückliefert, wenn y in Liste
private:
PRFGNode *root;

};

void Set::insert_at_first(unsigned int x) //Einfuegen am Listenbeginn
{

root=new PRFGNode(x,root);

}

Set Set::Vereinigung(Set &b)
{
Set c;
PRFGNode *h1,*h2;
bool test=false;
h1=root; // Zeiger aufs 1 Element der Menge a, siehe Aufruf im void main ( a.Vereinigung(b) )
h2=b.root; // Zeiger aufs 1 Element der Menge b, diese wird als Parameter übergeben

while(h2!=0) //zunächst werden in die neue Menge c alle Elemente von b hineinkopiert
{
c.insert_at_first(h2->elem);
h2=h2->next; //weiter in der Liste
}

while(h1!=0) //hier werden die noch fehlenden Elemente aus a in c eingefügt
{
if(b.ist_in(h1->elem)) // es wird mit der Funktion "ist_in" geschaut, welche noch fehlen
test=true;
else
test=false;

if(test==false) //wenn das Element "h1->elem" von Menge a noch nicht in der Menge b, dann in c einfügen

c.insert_at_first(h1->elem); //einfügen in c

h1=h1->next; //mit next-Zeiger kommt man in der Liste weiter, (ähnlich i++)
} //danach beginnt while-Schleife erneut

return c; //Ausgabe der Vereinigungsmenge, jedoch wird diese Menge nicht zurückgeliefert

}

bool Set::ist_in(unsigned int y) //überprüfen ob y in Liste
{
PRFGNode *hilf;
bool test=false; //bool-Variable test, hat Werte "true" oder "false"
hilf=root;

while (hilf!=0)
{
if((hilf->elem)==y)
test=true;
else
test=false;

hilf=hilf->next;
}
return test;
}

void Set::Ausgabe() //Ausgabe der Liste
{
int anz=0,i=0;
PRFGNode *aktuell;

aktuell = root;

while (aktuell != NULL)
{
i++;
cout << "\n" << "Das " << i << ". Element hat den Wert " << (*aktuell).elem << "."<<endl;
aktuell = (*aktuell).next;
}

}

Set::~Set() //Destruktor
{
PRFGNode *voriges;
PRFGNode *aktuell;

aktuell=new PRFGNode;
voriges=new PRFGNode;
voriges=NULL;

aktuell=root;

while(aktuell!=0)
{

voriges=aktuell;
aktuell=aktuell->next;
delete voriges;
}

}

int main()
{
Set a, b, c;


a.insert_at_first(8);
a.insert_at_first(9);
a.insert_at_first(5);

b.insert_at_first(8);
b.insert_at_first(3);
b.insert_at_first(2);

//a.Ausgabe();
if(a.ist_in(6)) //dh wenn true zurückgegeben wird, dann ist es in der Liste
cout<<"\n"<<"Das Element ist in der Liste";
else
cout<<"\n"<<"Ist nicht drin"<<endl; //wenn 6 nicht in Liste, dann Meldung...

c = (a.Vereinigung(b)); //es wird die Vereinigungs-Menge ausgegeben, siehe UP: void Set::Vereinigung(Set b)
//ist nicht genau das, was in der Angabe gefordert wurde, da dort die Vereinigung zurückgeliefert werden sollte, mit return- funkt. aber irgendwie nicht!!!!
c.Ausgabe();
return 0;
}


Dieser Post wurde am 18.04.2004 um 13:08 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.04.2004, 13:04 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ohne jetzt gross zu wissen wo genau fehler sein könnten

die definierst Set C am anfang deiner mehtode... d.h. es ist eine variable die nur gültigkeit in deinem Vereinigunsblock hat...
wenn du die dann am ende zurücklieferst hast du da nicht mehr viel freude drann weil die ja auf dem stack zerstört wird..
du musst also entweder noch eine variable mit übergeben (als pointer oder referenz) in die er das ergebnis speichern soll oder du musst ein kopiekonstruktor implementieren damit damit das gleichsetzen am ende beim übergeben noch funzt...
an sonsten ist ja nicht definert was a=b bedeutet wenn a und b sets sind
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.04.2004, 13:08 Uhr
Pablo
Supertux
(Operator)


Tipp: Einrücken des Codes erhöht die Lesbarkeit.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.04.2004, 19:59 Uhr
~Thomas xyz
Gast


@ Windalf

Könntest du mir das ein wenig näher erklären wie ich das mit der Übergabe der zusätzlichen Variable machen soll ? Ich bin nicht besonders gut in C++ (sieht man ja am Programm). Ein kurzes Codestück würde sehr helfen. Oder Ändere einfach meinen Code.

Und hir nochmal mit Einrückungen, zwecks Lesbarkeit.

mfg Thomas


C++:


#include <iostream>
using namespace std;


class PRFGNode
{
public:
    unsigned int elem;
    PRFGNode *next;
    PRFGNode(int e=0, PRFGNode *n=0):elem(e),next(n){}

};


class Set
{
    public:
        Set():root(0) {}
        Set(int){Set *first; first=new Set();} //leere Menge
        ~Set();  //Destruktor, löscht alle Listenelemente
        void insert_at_first(unsigned int x);  //einfügen in Liste
        void Ausgabe();
        Set Vereinigung(Set &b); //UP für die Vereinigung
        bool ist_in(unsigned int y);  //Funktion die true zurückliefert, wenn y in Liste
    private:
        PRFGNode *root;
        
};


void Set::insert_at_first(unsigned int x)  //Einfuegen am Listenbeginn
{

    root=new PRFGNode(x,root);        

}

Set Set::Vereinigung(Set &b)
{
    Set c;
    PRFGNode *h1,*h2;
    bool test=false;
    h1=root; // Zeiger aufs 1 Element der Menge a, siehe Aufruf im void main  ( a.Vereinigung(b) )
    h2=b.root; // Zeiger aufs 1 Element der Menge b, diese wird als Parameter übergeben
    
    while(h2!=0)   //zunächst werden in die neue Menge c alle Elemente von b hineinkopiert
    {
        c.insert_at_first((*h2).elem);
        h2=(*h2).next;  //weiter in der Liste
    }

    while(h1!=0)       //hier werden die noch fehlenden Elemente aus a in c eingefügt
    {
        if(b.ist_in((*h1).elem)) // es wird mit der Funktion "ist_in" geschaut, welche noch fehlen
            test=true;
        else
            test=false;
        
        if(test==false) //wenn das Element "h1->elem" von Menge a noch nicht in der Menge b, dann in c einfügen
            
            c.insert_at_first((*h1).elem);  //einfügen in c

        h1=(*h1).next;    //mit next-Zeiger kommt man in der Liste weiter, (ähnlich i++)
    }  
    
    //danach beginnt while-Schleife erneut
    
    c.Ausgabe();
    return c;        //Ausgabe der Vereinigungsmenge, jedoch wird diese Menge nicht zurückgeliefert
    
}


bool Set::ist_in(unsigned int y) //überprüfen ob y in Liste
{
    PRFGNode *hilf;
    bool test=false;  //bool-Variable test, hat Werte "true" oder "false"
    hilf=root;

    while (hilf!=NULL)
    {
        if(((*hilf).elem)==y)
            test=true;
        
        hilf=(*hilf).next;
    }
    return false;
}


void Set::Ausgabe() //Ausgabe der Liste
{
    int anz=0,i=0;
    PRFGNode *aktuell;
    
    aktuell = root;

    while (aktuell != 0)
    {
        i++;
        cout << "\n" << "Das " << i << ". Element hat den Wert " << (*aktuell).elem << "."<<endl;
        aktuell = (*aktuell).next;
    }
    
}


Set::~Set()  //Destruktor
{
    PRFGNode *voriges;
    PRFGNode *aktuell;

    aktuell=new PRFGNode;
    voriges=new PRFGNode;
    voriges=NULL;

    aktuell=root;

    while(aktuell!=0)
    {
    
        voriges=aktuell;
        aktuell=(*aktuell).next;
        delete voriges;
    }

}


void main()
{
    Set a, b, c;
    int d=6;
    

    a.insert_at_first(8);
    a.insert_at_first(9);
    a.insert_at_first(5);

    b.insert_at_first(8);
    b.insert_at_first(3);
    b.insert_at_first(2);

    a.Ausgabe();
    if(a.ist_in(d))  //dh wenn true zurückgegeben wird, dann ist es in der Liste
    cout<<"\n"<<"Das Element ist in der Liste";
    else
    cout<<"\n"<<"Das Element " <<d << " ist nicht enthalten."<<endl;  //wenn 6 nicht in Liste, dann Meldung...
    
    c = a.Vereinigung(b); //es wird die Vereinigungs-Menge ausgegeben, siehe UP: void Set::Vereinigung(Set b)
                     //ist nicht genau das, was in der Angabe gefordert wurde, da dort die Vereinigung zurückgeliefert werden sollte, mit return- funkt. aber irgendwie nicht!!!!
    c.Ausgabe();
    
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.04.2004, 20:09 Uhr
~Thomas xyz
Gast


@Pablo

"Der Name der Rose" ist ein sehr guter Roman.

Und für alle die sich fragen was das heißt:

"Secretum finis Africæ manus supra idolum age primum et septimum de quatour"

"Für das Geheimnis des Finis Africae drücke die Hand auf den Ersten und den Siebenten über der Vier."

Im Roman birgt die Bibliothek einer mittelalterlichen Abtei, deren labyrinthische Anordnung in geographische Bezirke eingeteilt ist, am Ende des mit Afrika bezeichneten Teils ein großes Geheimnis. Die Angst davor ist größer als die Angst vor der Sünde. Sie erzeugt schließlich Verwirrung und Mord.

mfg Thomas
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.04.2004, 20:15 Uhr
Pablo
Supertux
(Operator)


richtig! Ganz genau, so ist es. Und "Der Name der Rose" ist schon ganial, ich hab das Buch schon 3 mal gelesen...
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
18.04.2004, 22:00 Uhr
~Thomas xyz
Gast


Danke für eure Hilfe, ich habe das Programm fertig, und es funktioniert so wie es soll.

Ohne eure Hilfe wäre es mir schlecht ergangen.

mfg Thomas

PS: Es fehlte ein Kopykonstruktor und noch ein Zuweisungsoperator.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
18.04.2004, 22:32 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Thomas
na supi dann hast du es noch alleine geschaft...
Ich hatte schon befürchtet ich muss mich noch mit deinem code rumschlagen...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: