OOP Fifo mit linearer zykl Liste und folgenden Auflagen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • OOP Fifo mit linearer zykl Liste und folgenden Auflagen

    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:

    Quellcode

    1. #ifndef _FIFO_H_
    2. #define _FIFO_H_
    3. class ListenElem{
    4. private:
    5. int value;
    6. ListenElem *pNext;
    7. public:
    8. ListenElem();
    9. //~ListenElem(); // Destruktor
    10. void setValue(int wert);
    11. int getValue(void);
    12. void setNext(ListenElem &le);
    13. ListenElem &getNext(void);
    14. };
    15. class Fifo:ListenElem{
    16. private:
    17. ListenElem *pTop;
    18. ListenElem *pBottom;
    19. unsigned int size;
    20. public:
    21. Fifo(unsigned int groesse);
    22. ~Fifo();
    23. void push(int wert);
    24. int pop(void);
    25. void extend(void);
    26. };
    27. #endif //_FIFO_H_
    Alles anzeigen


    jetzt die Implementierung:

    Quellcode

    1. #include "fifo.h"
    2. #include <iostream>
    3. using namespace std;
    4. ListenElem::ListenElem(){
    5. ListenElem *neu=new ListenElem;
    6. neu->value=0;
    7. neu->pNext=NULL;
    8. }
    9. /*ListenElem::~ListenElem(){ // Destruktor
    10. ListenElem &zeiger;
    11. delete this->value;
    12. zeiger=this->pNext;
    13. delete zeiger;
    14. }*/
    15. void ListenElem::setValue(int wert){
    16. this->value=wert;
    17. }
    18. int ListenElem::getValue(){
    19. return this->value;
    20. }
    21. void ListenElem::setNext(ListenElem &le){
    22. this->pNext=&le;
    23. }
    24. ListenElem &ListenElem::getNext(){
    25. return *(this->pNext);
    26. }
    27. // Implementierungen der Klasse ListenElem:Fifo
    28. Fifo::Fifo(unsigned int groesse=4){
    29. Fifo *neu=new Fifo;
    30. ListenElem anfang;
    31. neu->size=1;
    32. neu->pBottom=NULL;
    33. neu->pTop=&anfang;
    34. anfang.setNext(anfang);
    35. while(neu->size<=groesse)
    36. neu->extend();
    37. }
    38. void Fifo::extend(void){
    39. ListenElem neu;
    40. neu.setNext(*(this->pBottom));
    41. this->pTop->setNext(neu);
    42. //this->pTop=&neu;
    43. this->size++;
    44. }
    45. void Fifo::push(int wert){
    46. //if(this->pBottom==NULL){
    47. this->pTop->setValue(wert);
    48. this->pTop->setNext(this->pTop->getNext());
    49. ListenElem hilf=this->pTop->getNext();
    50. if(this->pBottom==&hilf){
    51. cout<<"\nSchlange voll belegt!"<<endl;
    52. cout<<"\nJetzt wird extend aufgerufen!"<<endl;
    53. extend();
    54. }
    55. if (this->pBottom==NULL){
    56. }
    57. }
    58. //~Fifo();
    59. //int pop(void);
    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