Aufgabe: zu Lifo -Stack
-
Ich finde den Fehler einfach nicht, warum bekomme ich es nicht zum laufen?
Denke ich hab alles nötige ergänzt, gut es ist auch unsauber Programmiert,
aber war ja auch in der vorgabe eine initialisierung in der klasse vorgegeben.
Wenns Läuft schreibe ich das Programm nochmal um, aber erst mal sollte es Laufen.Hier Die Aufgabe: http://img199.imageshack.us/img199/4812/lifo.jpg
und hier soweit mein Code:
/* * Lifo-Stack.cpp * * Created on: 07.02.2010 * Author: c.goupe */ #include <iostream> using namespace std; class stack{ private: int anzahl; int size; int top; int* stck; public: // Konstruktoren stack(int groesse = 16) { stck = new int[groesse]; size = groesse; top = 0; } stack(const stack & s) { anzahl = s.anzahl; stck = new int [anzahl]; for( int i=0; i<anzahl; ++i ) stck[i] = s.stck[i]; } ~stack() { delete[] stck; } void push(int wert) { if (top == size) resize(size*2); stck[top] = wert; ++top; } int pop() { int erg = 0; if (top > 0) { --top; erg = stck[top]; } else cerr << "Fehler in pop: Stack ist leer!\n"; return erg; } void resize(int newsize){ int *Speicher, i; Speicher = new int [newsize]; for( i=0; i<anzahl; ++i ) Speicher[i] = stck[i]; delete [] stck; stck = Speicher; size = newsize; } }; int main() { int a; stack s; cout << "LIFO-Stack!"; cout << "Push: "; cin >> a; s.push(a); cout << "Pop: " << s.pop() << endl; return 0; }
edit: Update!
-
es ist üblich, im dtor den speicher frei zu geben, den man sich irgendwann mal reserviert hatte
auch ist in C++ calloc nicht so angebracht(-> new)
im ctor könntest du die initialisierungsliste nutzenda du die aufgabe nicht abgetippt hast, kann man hier nicht so schön quoten - aber da steht iwas mit ner größe von 16 im default-ctor... seh ich hier nirgendwo...
pop sieht eigenartig aus - aber das ist ja schon so dämlich gegeben - kannst du also nix für...
dafür sieht resize so aus, als ob du das verbrochen hättestwas komplett doof ist:
stack(int x)
was ist das? ne länge? nen wert? sieht man an der signatur nicht, erst wenn man in die implementation guckt - und wenn man dann noch ma die aufgabenstellung anguckt sieht man, dass du noch mal lesen solltest ;o)da steht nämlich was von länge von 16 als default-parameter...
bb
-
ok, gut habs mal dementsprechend geändert, aber läuft immernoch nicht.
/* * Lifo-Stack.cpp * * Created on: 07.02.2010 * Author: c.goupe */ #include <iostream> using namespace std; class stack{ private: int anzahl; int size; int top; int* stck; public: // Konstruktoren stack(int groesse = 16) { stck = new int[groesse]; size = groesse; top = 0; } stack(const stack & s) { anzahl = s.anzahl; stck = new int [anzahl]; for( int i=0; i<anzahl; ++i ) stck[i] = s.stck[i]; } ~stack() { delete[] stck; } void push(int wert) { if (top == size) resize(size*2); stck[top] = wert; ++top; } int pop() { int erg = 0; if (top > 0) { --top; erg = stck[top]; } else cerr << "Fehler in pop: Stack ist leer!\n"; return erg; } void resize(int newsize){ int *Speicher, i; Speicher = new int [newsize]; for( i=0; i<anzahl; ++i ) Speicher[i] = stck[i]; delete [] stck; stck = Speicher; size = newsize; } }; int main() { int a; stack s; cout << "LIFO-Stack!"; cout << "Push: "; cin >> a; s.push(a); cout << "Pop: " << s.pop() << endl; return 0; }
-
if (stck = NULL)
Ih, mach das weg, mach das weg.
-
Außerdem sollte top weg, denn anzahl alleine erfüllt diesen Zweck schon besser. Warum besser? Weil man bei top als Fremdleser nicht weiß, ob der Index des Top-Elements oder der Index der nächsten Schreiposition gemeint ist. Aus size würde ich noch maxAnzahl machen, damit es nicht mit size aus den anderen Containern verwechselt wird, denn wonanders ist size gerade das, was bei Dir anzahl ist und das, was bei Dir size ist, ist woanders unter Umständen capacity. Aber kapazität geht in C++ ja nicht wegen des 'ä', außer Du verwendest einen Microsoft-Conmpiler, die damit wiedermal ihre Codebase von echtem C++ entfernen wollen.
-
volkard schrieb:
if (stck = NULL)
Ih, mach das weg, mach das weg.
gut nun gehts.
-
volkard schrieb:
Außerdem sollte top weg, denn anzahl alleine erfüllt diesen Zweck schon besser. Warum besser? Weil man bei top als Fremdleser nicht weiß, ob der Index des Top-Elements oder der Index der nächsten Schreiposition gemeint ist. Aus size würde ich noch maxAnzahl machen, damit es nicht mit size aus den anderen Containern verwechselt wird, denn wonanders ist size gerade das, was bei Dir anzahl ist und das, was bei Dir size ist, ist woanders unter Umständen capacity. Aber kapazität geht in C++ ja nicht wegen des 'ä', außer Du verwendest einen Microsoft-Conmpiler, die damit wiedermal ihre Codebase von echtem C++ entfernen wollen.
mhmm könnteste recht haben, aber wird ja so vorgegeben.
Werde aber nochmal ein anderes Programm nun schreiben.
Basisklassse wird stack sein und davon abgeleitet Lifo und Fifo.
-
c.groupe schrieb:
volkard schrieb:
if (stck = NULL)
Ih, mach das weg, mach das weg.
gut nun gehts.
ne resize geht nicht...
-
c.groupe schrieb:
Basisklassse wird stack sein und davon abgeleitet Lifo und Fifo.
Ih, mach das weg, mach das weg.
Laß Containerklassen in C++ besser immer unvererbt.
-
ne resize geht nicht...
Weil Du anzahl und top mal jenes mal solches nimmst. Weg mit anzahl!
-
volkard schrieb:
Ih, mach das weg,...
Was Du alz machsch.
-
volkard schrieb:
c.groupe schrieb:
Basisklassse wird stack sein und davon abgeleitet Lifo und Fifo.
Ih, mach das weg, mach das weg.
Laß Containerklassen in C++ besser immer unvererbt.
habs nun so gemacht..
// also gut LIFO bleibt LIFO und FIFO bleibt FIFO, nix beides in einem ;)
-
volkard schrieb:
ne resize geht nicht...
Weil Du anzahl und top mal jenes mal solches nimmst. Weg mit anzahl!
jo nun gehts..
-
StrangePlastinations schrieb:
volkard schrieb:
Ih, mach das weg,...
Was Du alz machsch.
Wer keine Fehler macht, lernt nichts! :p
-
Was bitte bedeutet buttom?
Du meinst wohl bottom?
-
Zuweisungsoperator nicht vergessen -- das steht zwar nicht in der Aufgabenstellung, aber der Compiler-generierte Zuweisungsoperator macht hier das falsche.
Außerdem, missbrauchst Du Vererbung.
-
krümelkacker schrieb:
Außerdem, missbrauchst Du Vererbung.
Merkt euch es mal, c.groupe ist der mit dem Professor, welcher man löschen (verbrennen) sollte
Grüssli
-
Die Basiklasse stack ergibt überhaupt keinen Sinn.
Lies die Geschichte des Herrn Bebel: http://www.c-plusplus.net/forum/viewtopic-var-t-is-75672.html
-
krümelkacker schrieb:
Zuweisungsoperator nicht vergessen -- das steht zwar nicht in der Aufgabenstellung, aber der Compiler-generierte Zuweisungsoperator macht hier das falsche.
Außerdem, missbrauchst Du Vererbung.
ja ist nicht sauber geschrieben, kommt davon wenn man es so schnell runtertippt.
und ja bottom, habs schon angepasst
-
Dravere schrieb:
krümelkacker schrieb:
Außerdem, missbrauchst Du Vererbung.
Merkt euch es mal, c.groupe ist der mit dem Professor, welcher man löschen (verbrennen) sollte
Grüssli
omg, ich hab doch nur die aufgabe machen wollen