Lineare Liste, Elemente hinzufügen und entfernen

mrs_schokokeks

Grünschnabel
Hallo!

Ich hab hier folgende Aufgabe:

Die Anweisung


Code:
Stack fuechse;

for(int i = 1; i <= 8; i++)
{

	if(getZufallsBit())
		fuechse.push(newFix());
	else
		fuechse.push(newFoxi());
}while(fuechse.pop());

Ausgabe:

5.Foxi.Objekt
3.Fix.Objekt
2.Fix.Objekt
4.Foxi.Objekt
3.Foxi.Objekt
1.Fix.Objekt
2.Foxi.Objekt
1.Foxi.Objekt


Alle Klassen erstellen
- Stack ist keine Template Klasse
- Stack soll als lineare Liste implementiert werden
- Fix und Foxi Objekte werden gezählt. Sie kennen offenbar ihre Nummer
- pop entnimmt das oberste Element vom Stapel und gibt dessen Wert mit cout aus.



Soviel hab ich zusammenbekommen ^^ :

Code:
class Stack
{
private:
	
	enum {anzahl=8};
	string feld[anzahl];
	int top;
	
public:

	Stack ()	
	{ 
		top = 0; 
	}	


	bool push(string objekt)
	{
		if (top == anzahl)
		return false;	
		else
		{
			feld [top] = objekt;	
			top++;		   
			return true;  
		}
	}


	bool pop()
	{
		if (top == 0)	
		return false; 

		else 

		{ 
			top--;
			cout << top << "\n";
		        return true;
		}
	}								

};

        string newFix()
	{
		string s = "Fix.Objekt\n";
		return s;
	}


	string newFoxi()
	{
		
		string s = "Foxi.Objekt\n";
		return s;
		
	}

bool getZufallsBit()


Und da es nicht das Ziel der Aufgabe war, mit unendlich laufender Ausgabe + Piepton einen epilleptischen Anfall beim Anwender auszulösen, brauche ich Hilfe!

In der Aufgabe heißt es "Alle Klassen erstellen". Sind newfix und newFoxi (Template) Klassen?
Und ich weiß nicht, was getZufallsbit() macht oder eher gesagt, wann es true und wann false ausgeben soll.

Bitte helft mir :)

Julie
 
Zuletzt bearbeitet:
Wie lange machst du das schon bzw. wie lange beschäftigst du dich mit C++ mittlerweile?

Wenn ich deinen Code so sehe stellen sich mir ein paar Fragen: "Hast du die Aufgabe richtig gelesen?", "Weißt du, was ein Stack ist und wie er arbeitet?" und "Hast du im Internet schonmal nach einer Beispielimplementierung gegooglet?".

Anstatt dir eine Lösung zu geben, tippe ich lieber ein paar Tipps oder Stichpunkte runter, die dir helfen sollten (hoffe ich). Dannach kannst du es ja nochmal probieren und dann dein neues Ergebnis posten oder halt weitere Fragen stellen ^^

Das, was du da machst, ist keine lineare Liste, sondern bestenfalls eine ArrayList und das war in der Aufgabe nicht gefordert. Vielleicht hilft es dir ein wenig, wenn ich das Stichwort "verkettete Liste" in den Raum werfe.

newFix() und newFoxi() sind Funktionen und keine Klassen. Allerdings kannste ja die Klassen Fix und Foxi implementieren und die Funktionen geben halt ein Objekt des jeweiligen Typs zurück. Für die Ausgabe der Strings "Foxi.Objekt" und "Fix.Objekt" kommt es auf deine Implementierung an, aber es würde sich anbieten den <<-Operator der beiden Klassen zu überladen.

Außerdem steht in der Aufgabe zwar, dass die Klasse Stack keine Template-Klasse sein soll, das heißt aber nicht, dass du sie auf Strings beschränken sollst. Die oberste Klasse aller Objekte ist die object-Klasse, würde sich also anbieten, denn dann können alle Datentypen aufgenommen werden. Alternativ würde ich mir eine Vaterklasse für Fix und Foxi überlegen, z.B. Fox, und diese Klasse als Typ für den Stack verwenden, damit Fix und Foxi verwendet werden, object wäre aber wohl ratsamer.

Und was getZufallsBit() angeht, ich weiß auch nicht, was darin passieren soll, aber der Name sagt es ja schon eigentlich. Meine Interpretation wäre: Bit = 1 oder 0, folglich soll per Zufall entweder eine 1 oder eine 0 zurückgegeben werden. Brauchst kein True oder False zurückgeben, weil C++ fast alles als True "schluckt", Ausnahmen sind False, 0 und NULL.

Hoffe, das bringt dich etwas weiter ^^
 
Zuletzt bearbeitet:
Danke für die Tipps! Damit werden meine Versuche ja noch schlimmer! :D

Ja, habs mit verketteter Liste versucht und bin kläglich gescheitert ^^ Erstellt push() immer ein neues Element mit dem "Inhalt" newFix() und newFoxi()? Aber wenn das member von Klassen sein sollen, wie können sie dann ohne Objekt aufgerufen werden?

Ich weiß gar nicht, was da an push überhaupt übergeben wird...
ANGENOMMEN, das wären strings...

Code:
class Stack
{
private:
    string fuchs;
    Stack* next;
	    
public:

void push (string f)   

{ 
    Stack* ptr;
	Stack* hilf;		
	hilf = ptr;			

	if (ptr == NULL)		
	{
		ptr = new Stack;	
		ptr->next = 0;
        ptr->fuchs = f;	
		
	}

	else						  
	
		while (hilf->next != NULL)
		{
			hilf = hilf->next; 
		}
	
	hilf->next = new Stack;
	hilf->next->fuchs = f;
	hilf->next->next = NULL;

}
	
	bool pop()
	{
		Stack* ptr;
		Stack *hilf;
		hilf = ptr;
		while (hilf->next != NULL)
			hilf = hilf->next;
	    cout << hilf->next->fuchs;
		return true;
		   	
	}									




};

	string newFix()
	{
		string s = "Fix.Objekt\n";
		return s;
	}


	string newFoxi()
	{
		
		string s = "Foxi.Objekt\n";
		return s;
		
	}

bool getZufallsBit();

Ich bezweifle stark, das pop() vom Typ bool ist...

folglich soll per Zufall entweder eine 1 oder eine 0 zurückgegeben werden
Das habe ich mir gedacht und habe gehofft, dass jemand eine hübsche Lösung dazu hat, weil ich mir das gaaar nicht vorstellen kann.
 
Ich glaube du hast dich in der Programmiersprache geirrt. In C++ gibt es keine globale Oberklasse, von welcher alle anderen Klassen erben.

Grüße,
Matthias
Kann sein ... Aber ich hab da sowas im Kopf ... Ich wälz mal meine Bücher und meld mich dann ^^

EDIT:
Ok, hast recht. Frag mich nur woher ich das dann hab o_O Und nein, das hat nix mit Java zu tun ...
 
Zuletzt bearbeitet:
Hi,

newFix und new Foxi könnten ja Member der Klasse sein, in der du die ganze oben beschriebene Aufgabe implementierst. Oder es sind halt statische Methode. Was die zurückgeben sollen scheinen ja Objekte irgendeiner Art zu sein, also hast du da wohl relativ freie Wahl.
Die Methode pop() wird dir wohl ein bool zurückgeben, dass anzeigen soll ob noch Objekte in deinem Stack vorhanden sind oder nicht.
Und für die getZufallsBit kannst du ja eine der bereits vorhandenen Random Funktionen verwenden, die dir eine Zufallszahl liefern und dann aufgrund der Zahl entscheiden ob eine 1 oder eine 0 vorliegt.

Gruß
Der Wolf
 
pop() gibt aber kein bool-Wert zurück, sondern nimmt das oberste Objekt vom Stapel runter und gibt dieses dann zurück.
 
pop() gibt aber kein bool-Wert zurück, sondern nimmt das oberste Objekt vom Stapel runter und gibt dieses dann zurück.
In der Aufgabenstellung der Themenerstellerin steht nur, dass das Objekt auf die Standardausgabe ausgegeben werden soll. Über den Rückgabewert wird keine Aussage getroffen.

@mrs_schokokeks: Du verwendest in deiner Implementierung sehr häufig nicht initialisierte Zeiger. Wenn du eine Variable nicht initialisierst, ist deren Wert undefiniert (zufällig). Insbesondere werden Zeiger nicht automatisch mit NULL initialisiert. Zur Implementierungsidee an sich: du versuchst anscheinend bei push() das neue Element am Ende der Liste einzufügen und bei pop() entsprechend das letzte Element zu entfernen. Das ist unnötig kompliziert. Hänge neue Elemente doch einfach am Anfang ein, dann musst du nicht jedes Mal die komplette Liste ablaufen. Im Netz gibt es auch eine Vielzahl von Beispielimplementierungen :google::google:

Grüße,
Matthias
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück