Hallo Leute,
studiere Elektrotechnik im 4ten Sem. und hab schon n' paar fifos/lifos
in C/C++ programmiert.
Diese arbeiten entweder auf simplen arrays,
oder dynamischen Feldern, oder auch wie hier verlangt, auf einfach verketteten Listen.
Heute kam ne verwirrte 2Sem. Studentin zu mir und legte mir folgende Aufgabenstellung aus Prog für E-Techniker vor:
"In dieser Aufgabe soll eine Warteschlange (FIFO) für Integer-Werte entworfen
und implementiert werden. Die Warteschlage soll beliebig viele Integer-Werte
aufnehmen können. Die Warteschlange soll basierend auf einer Zyklischen Liste
arbeiten.
Implementieren Sie zuerst eine Klasse ListenElem, mit folgenden Eigenschaften
und Methoden:
• Die private Eigenschaft value speichert den Integer-Wert
• Die private Eigenschaft pNext enthält den Zeiger zum nächsten ListenElem.
• Ein Default-Konstruktor soll alle Eigenschaften sinnvoll initialisieren
• Die Methoden setValue() und getValue() dienen zum Schreiben und Lesen
des Integer-Wertes
• Die Methoden setNext() und getNext() dienen zum Lesen und Schreiben des
Zeigers auf das nächste ListElem
Auf dieser Klasse aufbauend implementieren Sie dann Ihre Warteschlange. Ihre
Warteschlange soll folgende Eigenschaften und Methoden besitzen:
• Die private Eigenschaft pTop speichert einen Zeiger auf das nächste freie
ListElem.
• Die private Eigenschaft pBottom speichert einen Zeiger auf das älteste
belegte LiestElem.
• Einen Konstruktor, der optional die Größe der Warteschlange übergeben
bekommt. Als minimaler Wert wird die Größe 1 akzeptiert. Wird keine
Größe angegeben, wird eine Warteschlange mit 4 Elementen angelegt.
• Überlegen Sie sich, ob Sie einen Destruktor und eine Copy-Konstruktor
benötigen.
• Eine private Methode extend(), die Ihre Warteschlange um ein weiteres
ListenElem erweitert.
• Die Methode push(), um einen Int-Wert in die Warteschlange
einzufügen.
• Die Methode pop(), um den ältesten gespeicherten Wert zurückzugeben.
Intern soll Ihre Warteschlange folgendermaßen funktionieren:
Konstruktor
Im Konstruktor wird eine zyklische Liste aufgebaut, in der das letzte
Listenelement wieder auf das erste Listenelement verweist. Gehen Sie hierbei
folgendermaßen vor:
1. Erzeugen Sie ein erstes ListElem (als Liste der Größe 1)
2. Nutzen Sie die Methode extend() um weitere Elemente zu erzeugen
pTop zeigt zu Beginn auf ein beliebiges Element in der Liste. pBottom besitzt
den Wert NULL, da ja noch kein Element eingefügt wurde.
push()
Die Warteschlage soll immer mindestens Platz für ein weiteres Element
besitzen. So kann immer in dem ListenElem, auf das pTop verweist, der Wert
abgespeichert werden. Dann muss überprüft werden, ob die Schlange voll belegt
ist: in diesem Fall enthält der Nachfolger von pTop denselben Zeiger wie
pBottom. Um dann wieder ein neues Listenelemt einzufügen muß extend()
aufgerufen werden. Weiterhin muss überprüft werden, ob mit diesem push() das
erste Element in die Warteschlange eingefügt wurde (pBottom ist noch NULL).
Dann muss pBottom entsprechend gesetzt werden. Am Ende wird pTop noch
auf das nächste ListElem weitergeschaltet.
pop()
Wenn pBottom ungleich NULL ist, wird der Wert aus dem ListElem, auf das
pButtom verweist, als pop-Ergebnis genutzt. Ist pBottom gleich NULL, soll eine
Fehlermeldung ausgegeben werden. Dann wird pBottom auf den Nachfolger von
pBottom weitergeschaltet.
extend()
In extend wird ein weiteres ListElem angelegt und in die bestehende zyklische
Liste eingehängt. Hierzu wird das neue Element hinter dem Element eingefügt
auf das pTop verweist. Der Nachfolger des neuen ListElem ist dementsprechend
der alte Nachfolger von pTop. Das neue Element wird der neue Nachfolger von
pTop."
Hier, was sie dazu schon gemacht hat...
erst mal Ihre header Datei:
Alles anzeigen
jetzt die Implementierung:
Alles anzeigen
Muss erst mal sagen, dass ich die Aufgabenstellung ziemlich restriktiv finde
und froh bin, dass meine Übungen in Prog freier formuliert waren! (So nach dem Motto: "Das und das soll Ihr Programm können, nun machen Sie mal...")
Verstehe aber auch, dass so zum Einen der Umgang mit Referenzen/Zeigern und zum Anderen der Zugriff auf Methoden und Eigenschaften
von Klassen ohne die Vorzüge von "protected" usw. geübt werden soll.
Setz mich morgen mal dran, obwohl ich eigentlich selbst genug zu tun
hab (ich sag nur Rekursion in Assembler :twisted: )
Hab ihren source mal überflogen und find die Ansätze schon ganz nett :wink: ....
Würd mich über paar Anregungen, Vorschläge und Meinungen zur A-Stellung Eurerseits freuen!
Wenn Ihr was habt was funzt wie's da steht könnt Ihr's mir auch gern schicken,
an: whatagoin@web.de
Schon mal Vielen Dank für Eure posts....
Man liest sich.....
greetin's
Markus
studiere Elektrotechnik im 4ten Sem. und hab schon n' paar fifos/lifos
in C/C++ programmiert.
Diese arbeiten entweder auf simplen arrays,
oder dynamischen Feldern, oder auch wie hier verlangt, auf einfach verketteten Listen.
Heute kam ne verwirrte 2Sem. Studentin zu mir und legte mir folgende Aufgabenstellung aus Prog für E-Techniker vor:
"In dieser Aufgabe soll eine Warteschlange (FIFO) für Integer-Werte entworfen
und implementiert werden. Die Warteschlage soll beliebig viele Integer-Werte
aufnehmen können. Die Warteschlange soll basierend auf einer Zyklischen Liste
arbeiten.
Implementieren Sie zuerst eine Klasse ListenElem, mit folgenden Eigenschaften
und Methoden:
• Die private Eigenschaft value speichert den Integer-Wert
• Die private Eigenschaft pNext enthält den Zeiger zum nächsten ListenElem.
• Ein Default-Konstruktor soll alle Eigenschaften sinnvoll initialisieren
• Die Methoden setValue() und getValue() dienen zum Schreiben und Lesen
des Integer-Wertes
• Die Methoden setNext() und getNext() dienen zum Lesen und Schreiben des
Zeigers auf das nächste ListElem
Auf dieser Klasse aufbauend implementieren Sie dann Ihre Warteschlange. Ihre
Warteschlange soll folgende Eigenschaften und Methoden besitzen:
• Die private Eigenschaft pTop speichert einen Zeiger auf das nächste freie
ListElem.
• Die private Eigenschaft pBottom speichert einen Zeiger auf das älteste
belegte LiestElem.
• Einen Konstruktor, der optional die Größe der Warteschlange übergeben
bekommt. Als minimaler Wert wird die Größe 1 akzeptiert. Wird keine
Größe angegeben, wird eine Warteschlange mit 4 Elementen angelegt.
• Überlegen Sie sich, ob Sie einen Destruktor und eine Copy-Konstruktor
benötigen.
• Eine private Methode extend(), die Ihre Warteschlange um ein weiteres
ListenElem erweitert.
• Die Methode push(), um einen Int-Wert in die Warteschlange
einzufügen.
• Die Methode pop(), um den ältesten gespeicherten Wert zurückzugeben.
Intern soll Ihre Warteschlange folgendermaßen funktionieren:
Konstruktor
Im Konstruktor wird eine zyklische Liste aufgebaut, in der das letzte
Listenelement wieder auf das erste Listenelement verweist. Gehen Sie hierbei
folgendermaßen vor:
1. Erzeugen Sie ein erstes ListElem (als Liste der Größe 1)
2. Nutzen Sie die Methode extend() um weitere Elemente zu erzeugen
pTop zeigt zu Beginn auf ein beliebiges Element in der Liste. pBottom besitzt
den Wert NULL, da ja noch kein Element eingefügt wurde.
push()
Die Warteschlage soll immer mindestens Platz für ein weiteres Element
besitzen. So kann immer in dem ListenElem, auf das pTop verweist, der Wert
abgespeichert werden. Dann muss überprüft werden, ob die Schlange voll belegt
ist: in diesem Fall enthält der Nachfolger von pTop denselben Zeiger wie
pBottom. Um dann wieder ein neues Listenelemt einzufügen muß extend()
aufgerufen werden. Weiterhin muss überprüft werden, ob mit diesem push() das
erste Element in die Warteschlange eingefügt wurde (pBottom ist noch NULL).
Dann muss pBottom entsprechend gesetzt werden. Am Ende wird pTop noch
auf das nächste ListElem weitergeschaltet.
pop()
Wenn pBottom ungleich NULL ist, wird der Wert aus dem ListElem, auf das
pButtom verweist, als pop-Ergebnis genutzt. Ist pBottom gleich NULL, soll eine
Fehlermeldung ausgegeben werden. Dann wird pBottom auf den Nachfolger von
pBottom weitergeschaltet.
extend()
In extend wird ein weiteres ListElem angelegt und in die bestehende zyklische
Liste eingehängt. Hierzu wird das neue Element hinter dem Element eingefügt
auf das pTop verweist. Der Nachfolger des neuen ListElem ist dementsprechend
der alte Nachfolger von pTop. Das neue Element wird der neue Nachfolger von
pTop."
Hier, was sie dazu schon gemacht hat...
erst mal Ihre header Datei:
Quellcode
- #ifndef _FIFO_H_
- #define _FIFO_H_
- class ListenElem{
- private:
- int value;
- ListenElem *pNext;
- public:
- ListenElem();
- //~ListenElem(); // Destruktor
- void setValue(int wert);
- int getValue(void);
- void setNext(ListenElem &le);
- ListenElem &getNext(void);
- };
- class Fifo:ListenElem{
- private:
- ListenElem *pTop;
- ListenElem *pBottom;
- unsigned int size;
- public:
- Fifo(unsigned int groesse);
- ~Fifo();
- void push(int wert);
- int pop(void);
- void extend(void);
- };
- #endif //_FIFO_H_
jetzt die Implementierung:
Quellcode
- #include "fifo.h"
- #include <iostream>
- using namespace std;
- ListenElem::ListenElem(){
- ListenElem *neu=new ListenElem;
- neu->value=0;
- neu->pNext=NULL;
- }
- /*ListenElem::~ListenElem(){ // Destruktor
- ListenElem &zeiger;
- delete this->value;
- zeiger=this->pNext;
- delete zeiger;
- }*/
- void ListenElem::setValue(int wert){
- this->value=wert;
- }
- int ListenElem::getValue(){
- return this->value;
- }
- void ListenElem::setNext(ListenElem &le){
- this->pNext=≤
- }
- ListenElem &ListenElem::getNext(){
- return *(this->pNext);
- }
- // Implementierungen der Klasse ListenElem:Fifo
- Fifo::Fifo(unsigned int groesse=4){
- Fifo *neu=new Fifo;
- ListenElem anfang;
- neu->size=1;
- neu->pBottom=NULL;
- neu->pTop=&anfang;
- anfang.setNext(anfang);
- while(neu->size<=groesse)
- neu->extend();
- }
- void Fifo::extend(void){
- ListenElem neu;
- neu.setNext(*(this->pBottom));
- this->pTop->setNext(neu);
- //this->pTop=&neu;
- this->size++;
- }
- void Fifo::push(int wert){
- //if(this->pBottom==NULL){
- this->pTop->setValue(wert);
- this->pTop->setNext(this->pTop->getNext());
- ListenElem hilf=this->pTop->getNext();
- if(this->pBottom==&hilf){
- cout<<"\nSchlange voll belegt!"<<endl;
- cout<<"\nJetzt wird extend aufgerufen!"<<endl;
- extend();
- }
- if (this->pBottom==NULL){
- }
- }
- //~Fifo();
- //int pop(void);
Muss erst mal sagen, dass ich die Aufgabenstellung ziemlich restriktiv finde
und froh bin, dass meine Übungen in Prog freier formuliert waren! (So nach dem Motto: "Das und das soll Ihr Programm können, nun machen Sie mal...")
Verstehe aber auch, dass so zum Einen der Umgang mit Referenzen/Zeigern und zum Anderen der Zugriff auf Methoden und Eigenschaften
von Klassen ohne die Vorzüge von "protected" usw. geübt werden soll.
Setz mich morgen mal dran, obwohl ich eigentlich selbst genug zu tun
hab (ich sag nur Rekursion in Assembler :twisted: )
Hab ihren source mal überflogen und find die Ansätze schon ganz nett :wink: ....
Würd mich über paar Anregungen, Vorschläge und Meinungen zur A-Stellung Eurerseits freuen!
Wenn Ihr was habt was funzt wie's da steht könnt Ihr's mir auch gern schicken,
an: whatagoin@web.de
Schon mal Vielen Dank für Eure posts....
Man liest sich.....
greetin's
Markus