Stack - Programmierung

Hallo, ich habe folgende Aufgabe:

Programmieren Sie einen Stapel (Stack) für Ganzzahlwerte (int). Stapel bedeutet, das
zuletzt eingefügte Element wird zuerst entfernt. Verwenden Sie ein int Feld konstanter
Länge. Beginnen Sie mit dem Einfügen an der Position 0 des int Feldes. Eine Variable zur Verwaltung der aktuellen Anzahl Elemente im Stack genügt. Dadurch ist die
Einfügeposition und das als erstes heraus zu nehmende Element bestimmt.

Benutzen Sie folgendes Menue:

i - insert entry
d - delete entry
c - clear (delete all entries)
p - print all entries


Zudem muss ich sagen, dass ich noch nicht allzuviel Erfahrung in C++ mitbringe.
Kopiert hier einfach den Code heraus. Ist sonst zu unübersichtlich. Übringens habe ich einige Zweifel an meiner Lösung.
Ich habe die Aufgabe so gelöst:

// Aufgabenblatt 6 Aufgabe 1


#include <iostream>
using namespace std;

void menue(void); // Funktion zur Darstellung des Menüs
void eingabe(void); // Funktion zur Zuweisung der Eingaben des Benutzers anhand des Menüs
void insert(void); // Funktion zur Speicherung der Eingabe
void del(void); // Funktion zum Löschen der letzten Eingabe
void clear(void); // Funktion zum Löschen aller Eingaben
void print(void); // Funktion zur Ausgabe der kompletten Liste
void exit(void); // Funktion zum verlassen des Programms

char c;
int stack[10], pos=0, wert, i; // stack[10] = Ein Stapel, welcher eine EIngabe von 10 Zahlen ermöglicht


int main()
{
do
{
menue(); // Aufruf der Funktion zur Anzeige des Menues
eingabe(); // Aufruf der Funktion zur Eingabe von Werten
}
while(char(c)!='e'); // solange ein Buchstaben ausser "e" eingegeben wird, wird das Programm nicht verlassen

system("PAUSE");
return 0;
}

void menue(void)
{
cout<<" Bitte waehlen Sie aus: "<<"\n";
cout<<" i - insert entry "<<"\n";
cout<<" d - delete entry "<<"\n";
cout<<" c - clear (delete all entry) "<<"\n";
cout<<" p - print all entries "<<"\n";
cout<<" e - exit "<<"\n";
cout<<" Ihre Wahl: ";
cin>>c;
}

void eingabe(void)
{
switch(c) // durch cin>>c wird an dieser Stelle, je nach dem was man auswählt, der nächste Funktionsaufruf bestimmt
{
case 'i' : insert(); break;
case 'd' : del(); break;
case 'c' : clear(); break;
case 'p' : print(); break;
case 'e' : exit(); break;
default : cout<<" unbekannte Eingabe!!"<<"\n"<<"\n"; break; // Wenn etwas anderes ausser "i,d,c,p oder e" eingegeben wird ist es eine unbekannte Eingabe.
}
}

void insert(void)
{
if(pos<=9) // Solange die Position kleiner oder gleich ist als 9 ist eine Eingabe von Werten möglich
{
cout<<" Bitte einen Wert beliebigen Wert eingeben: ";
cin>>wert;
stack[pos]=wert; // Zuweisung von "wert" in den Stapel (bzw. Liste) an einer bestimmten Position
cout<<" Wert <<< "<<wert<<" >>> auf Position <<< "<<pos<<" >>> hinzugefuegt. "<<"\n";
pos++;
}
else
{
cout<<" >>> Die Liste ist voll <<< "<<"\n";
}

}

void del(void)
{
pos--;
cout<<" >>> Letzte Eingabe geloescht! <<< "<<"\n";
print();
}

void clear(void)
{
do
{
pos--;
}
while(pos>0);
cout<<" >>> Alles geloescht! <<< "<<"\n";
}

void print(void)
{
if(pos==0)
{
cout<<" >>> Liste ist Leer!! <<< "<<"\n";
}
for(i=0;i<pos;i++) // Liste von Position 0 bis 9 (10 Werte).
{
cout<<" Eintrag an Position <<< "<<i<<" >>> ist der Wert: <<< "<<stack<<" >>>"<<"\n";
}
}

void exit(void)
{
cout<<" >>> Beenden <<< "<<"\n";
}
 
was ist denn jetzt genau dein problem? läuft deine lösung nicht? kommen seltsame effekte? weil so auf den ersten blick sieht es doch so aus, wie du beschrieben hast.

ich habe meine ide zur zeit leider nicht installiert um es zu probieren, aber eine sache ist mir aufgefallen, wo ich mich wunder, dass es geht. muss c nicht irgendwo definiert werden? du benutzt die variable und nirgends steht, was es ist. mag aber sein dass es dennoch geht.

zwei andere sachen wundern mich auch noch.

Code:
void del(void)
{
     pos--;
     cout<<" >>> Letzte Eingabe geloescht! <<< "<<"\n";
     print();
 }

für was benutzt du print() ?du machst das cout doch bereits



Code:
void clear(void)
{
     do
     {
          pos--;
     }
     while(pos>0);
     cout<<" >>> Alles geloescht! <<< "<<"\n";
}

wieso benutzt du ne schleife? mach doch einfach pos=0;
 
Mein Problem ist nur dass ich nicht weis ob ich die Aufgabe korrekt erledigt habe. Ich weis dass das Programm funktioniert, jedoch nicht, ob es auf diese Weise die Aufgabenstellung erfüllt.

dieses print(); ist ein Funktionsaufruf.
Siehe hier:

Code:
void del(void)
{
     pos--;
     cout<<" >>> Letzte Eingabe geloescht! <<< "<<"\n";
     print();
 }

print() soll hier nicht sowas wie cout heissen, sondern soll das hier aufrufen:

Code:
void print(void)
{
if(pos==0)
{
cout<<" >>> Liste ist Leer!! <<< "<<"\n";
}
for(i=0;i<pos;i++) // Liste von Position 0 bis 9 (10 Werte).
{
cout<<" Eintrag an Position <<< "<<i<<" >>> ist der Wert: <<< "<<stack[i]<<" >>>"<<"\n";
}
}

Also: Wenn eine Zeile gelöscht wird, soll er print() aufrufen und somit nochmals die Liste anzeigen. (Als Bestätigung, dass die letzte Zeile gelöscht wurde).


Code:
wieso benutzt du ne schleife? mach doch einfach pos=0;

Ja, ist mir auch aufgefallen als ich deinen Kommentar angeschaut habe. Habe es nun auch abgeändert. Eine Schleife ist hier überflüssig.

Aber dennoch: Ist diese Aufgabe korrekt gelöst? Erfüllt es die Bedingungen der Aufgabe? Hab ich ein Stack korrekt programmiert oder ist er falsch ?
 
ja, also das was du als aufgabenstellung genannt hast ist erfüllt. aber kannst das ja einfach mal mit ein paar werten probieren. also mal ein paar sachen eintragen, löschen, vielleicht auch mal die grenzen testen, also ein 11. element einfügen, wenn der stack leer ist ein element löschen oder alle löschen. dann solltest du schon sehen dass die aufgabenstellung erfüllt ist und vielleicht siehst du ja doch noch irgendein problem was so bei der code-durchsicht jetzt übersehen wurde
 
Zurück
Oben