3Danke
ERLEDIGT
NEIN
NEIN
ANTWORTEN
11
11
ZUGRIFFE
670
670
EMPFEHLEN
-
04.09.10 20:28 #1
Hallo!
Ich hab hier folgende Aufgabe:
Die Anweisung
Code :1 2 3 4 5 6 7 8 9 10 11
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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
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
JulieGeändert von mrs_schokokeks (04.09.10 um 20:38 Uhr)
-
04.09.10 21:35 #2
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
Geändert von Akeshihiro (08.09.10 um 14:10 Uhr)
Man sagt, das Schwert eines Samurai sei seine Seele ...
Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.
Das Schmieden ist eine Kunst; Das Schreiben auch ;)
-
04.09.10 22:32 #3
Danke für die Tipps! Damit werden meine Versuche ja noch schlimmer!

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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
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...
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.folglich soll per Zufall entweder eine 1 oder eine 0 zurückgegeben werden
-
„Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
“For every complex problem, there is an answer that is short, simple and wrong.”
“Pessimism is safe, but optimism is a lot faster!”
Aktuelles Coding Quiz: #17 - Wörter kreuz und quer
-
05.09.10 11:34 #5Man sagt, das Schwert eines Samurai sei seine Seele ...
Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.
Das Schmieden ist eine Kunst; Das Schreiben auch ;)
-
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
-
05.09.10 22:03 #7
pop() gibt aber kein bool-Wert zurück, sondern nimmt das oberste Objekt vom Stapel runter und gibt dieses dann zurück.
Man sagt, das Schwert eines Samurai sei seine Seele ...
Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.
Das Schmieden ist eine Kunst; Das Schreiben auch ;)
-
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

Grüße,
MatthiasGeändert von Matthias Reitinger (06.09.10 um 15:49 Uhr) Grund: Typo
„Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
“For every complex problem, there is an answer that is short, simple and wrong.”
“Pessimism is safe, but optimism is a lot faster!”
Aktuelles Coding Quiz: #17 - Wörter kreuz und quer
-
06.09.10 08:35 #9Man sagt, das Schwert eines Samurai sei seine Seele ...
Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.
Das Schmieden ist eine Kunst; Das Schreiben auch ;)
-
06.09.10 09:33 #10
- Registriert seit
- Jun 2005
- Beiträge
- 7.970
Hi.Das ist in der STL aber z.B. nicht der Fall. Da gibt pop() einfach nur void zurück. Mit top() kann auf den obersten Wert des Stacks zugegriffen werden. (http://www.cplusplus.com/reference/stl/stack/pop/)
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
06.09.10 17:03 #11
Danke für die Antworten!
Aufgabe:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
void main() { Stack fuechse; for( int i = 1 ; i <= 8 ; i++) { if(getZufallsBit()) fuechse.push(new Fix()); else fuechse.push(new Foxi()); }while(fuechse.pop()); Alsooo, neuer Versuch: }
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
#include <iostream> #include <string> #include "stlist.h" #include <ctime> using namespace std; class Stack { private: Stack* f; public: Stack(){}; /*void push(Stack* fu) ********? Zugriff auf void push(T ding) aus stlist**** { f=fu; } bool pop() { return true; }*/ }; class Fix:public Stack { public: Fix(){ /*cout << "Fix.Objekt" << endl;*/}; }; class Foxi:public Stack { public: Foxi(){/*cout<< "Foxi.Objekt"<< endl;*/}; };
stlist.h
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
#include <iostream> using namespace std; template<typename T> class STlist { enum{anzahl = 10}; T stapel[anzahl]; int top; public: STlist() { top = 0; }; void push(T ding) { stapel[top] = ding; top++; } bool pop() { if( top == NULL) return false; else top--; cout << stapel[top]; return true; } };
Ich hatte ähnliche Aufgaben mit push und pop, aber hier habe ich das Problem, dass Stack keine Template-Klasse ist. Ich muss also auf push und pop "über" Stack zugreifen (fuechse.push), aber push() soll Template sein (hoffe ich).
Ich hatte in main statt
Stack fuechse
das hier geschrieben:
STlist<Stack*> fuechse;
dann sind push und pop Methoden von Stack, alles in Template und es hat funktioniert!
Aber wie greife ich hier über fuchs der nicht-templateKlasse Stack auf die template-Methode push()?
-
07.09.10 08:07 #12
- Registriert seit
- Jun 2005
- Beiträge
- 7.970
Hi.
Vergiss doch mal bitte im Zusammenhang mit Listen deine Arrays.
Ein Liste ist eine aus einfachen Grundelementen zusammengesetzte Datenstruktur:
Diese list_node (Kettenglieder) können zu einer Liste zusammengefügt werden indem man sie aneinander hängt. Es gibt keine festgelegte Größe (im Gegensatz zu Arrays).Code cpp:1 2 3 4
struct list_node { void* data; list_node* next; }
In dieser Aufgabe brauchst du auch keine Templates, verwende doch einfach Vererbung, so dass Fix und Foxi eine gemeinsame Oberklasse besitzen.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
Ähnliche Themen
-
C# Elemente in Liste hinzufügen und auslesen
Von Terminator2 im Forum .NET Windows FormsAntworten: 8Letzter Beitrag: 31.03.09, 19:17 -
Qt: Elemente bei Tab-wechsel hinzufügen
Von Ozzy Ozborn im Forum C/C++Antworten: 0Letzter Beitrag: 06.11.07, 09:07 -
Dom Elemente hinzufügen und löschen
Von Stefan Miefert im Forum Javascript & AjaxAntworten: 4Letzter Beitrag: 15.09.06, 06:07 -
GEF Grundlagen - Elemente hinzufügen
Von SOSUS im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 3Letzter Beitrag: 10.12.04, 15:11 -
mit js dom td-Elemente hinzufügen
Von quezo im Forum Javascript & AjaxAntworten: 6Letzter Beitrag: 26.02.03, 14:25





Zitieren

Login





