C++ Prüfungsaufgabe verkettete Liste



  • Hallo,

    ich habe mich an folgender Prüfungsaufgabe versucht. Könnte jemand viellecht mal drüber schauen?

    1. Erstellen Sie eine Klasse "BYTE" zur Verwaltung von Bytes (8 Bit) als Kombinationen der Ascii-Zeichen '0' und '1'. Der Wert soll mit einem Attribut mit dem Namen "Bits" (Datentyp char 😉 als String (mit Stringendezeichen!) verwaltet werden. Ein weiteres Attribut "Valid" (Typ bool) gibt an, ob Objekte der Klasse gültige Werte haben. Geben Sie den Klassenkopf, die Attribute (private) und die get-Methoden der Attribute an.
    class BYTE{
    private:
        char *Bits;
        bool Valid;
    public:
        char *getBits(){
        return Bits;
        }
        bool getValid(){
        return Valid;
        }
    };
    

    2.Erstellen Sie die Konstruktorenmit den folgenden Signaturen:BYTE (char * ZK), "ZK" ist ein String der genau 8 ASCII-Zeichen lang sein muss und nur die Zeichen '0' oder '1' enthalten darf. Das ist zu prüfen und widrigenfalls mit dem Wert "false" in "Valid" zu signalisieren. Ein gültiger String wird als Wert übernommen, "Valid" wird dann "true".
    BYTE (int Wert), Wert muss eine Zahl 0 <= Wert < 256 sein. Das ist zu prüfen und wid-rigenfalls mit dem Wert "false" in "Valid" zu signalisieren. Ein gültiger Wert wird umge-wandelt und nach "Bits" übernommen.BYTE (BYTE & B2), (Copy-Konstruktor), verwenden Sie hier die Initialisierungsliste für das Attribut "Valid".

    BYTE(char *ZK){
        if(strlen(ZK)!=8)
            return;
        else{
            for(int i=0; i<8; i++){
                if(ZK[i] !=0 && ZK[i] != 1){
                    Valid = false;
                    return;
                }
            }
            Valid = true;
            Wert = ZK;
        }
    }
    BYTE(int Wert){
        if(Wert<0 || Wert>=256){
            valid = false;
            return;
        }
        Bits = new char(Wert /256);
        
    }
    
    BYTE(BYTE &B2): B2(Valid){
        Bits = new BYTE(*B2);
         }
    

    3.Geben Sie den Destruktor für "BYTE" an.

    ~BYTE(){
    delete []Bits;
    } 
    
    1. Erstellen Sie eine Klasse "EVLE" für die Elemente einer einfach verketteten Liste. "EVLE" habe als private Attribute einen Pointer (Variablenname "Daten") auf ein Objekt der Klasse "BYTE" und einen Pointer des Typs "EVLE" mit dem Namen "Next". Ein Initialisierungskonstruktor mit den Parametern "BYTE * Daten" und "EVLE* N" soll die Objekte erzeugen. "N" ist für die Verkettung vorgesehen. Geben Sie den Klassenkopf mit den Attributen, dem Initialisierungskonstruktor und dem Copy-Konstruktor an. Verwenden Sie in den Konstruktoren die Initialisierungsliste für das Attribut "Next" und den Copy-Konstruktor von "BYTE" für das Attribut "Daten". Geben Sie die get-Methoden der Attribute an. Beachten Sie hierbei, dass für "Daten" kein Pointer nach „außen“ gegeben werden darf! Geben Sie für das Attribut "Next" zu-sätzlich die set-Methode an. Geben Sie den Destruktor für "EVLE" an.
    class ELVE{
    public:
        BYTE *Daten;
        ELVE * Next;
        ELVE(BYTE *Daten, ELVE *N){
        this->Daten = Daten
        Next = N;
        }
        ELVE(ELVE &W2):BYTE(W2){
        ?????
        }
        BYTE *getDaten(){
        return Daten
        }
        ELVE *getNext(){
        return Next;
        }
        void setNext(ELVE *N){
        ELVE *ptr = new ELVE();
        ptr = N;
        }
        ~ELVE(){
        delete[]Daten;
        delete[]Next;
        }
    };
    
    
    1. Legen Sie die Klasse"FIFO" an, die eine einfach verkettete Liste von Objekten der Klasse "EVLE" realisiert. "FIFO" hat die privaten Attribute "First" als Pointer auf den Beginn der Liste (=Anker) und "Last" (Pointer auf das letzte Element der Liste = zu entfernendes Element, s. Grafik). Im Standardkonstruktor werden diese Attribute mit der Konstanten NULL initialisiert, das heisst, zu Beginn ist der "FIFO"-Speicher leer. Die Anzahl der tatsächlichen Einträge steht im Attribut "Anz" (public, ganzzahlig). Geben Sie den Klassenkopf mit den Attributen und den Standardkonstruktor für "FIFO" an. Erstellen Sie die Methode "void put2FIFO (BYTE * In)", die ein neues "EVLE"-Objekt in "FIFO" einträgt. "In" ist ein Pointer auf ein "BYTE"-Objekt, der für das einzutragende Objekt die Daten bereitstellt.Beachten Sie die Fälle „leerer FIFO“ und „nicht leerer FIFO“! Erstellen Sie die Methode "BYTE * getFromFIFO ()" zum Entfernen eines Elementesaus "FIFO"! Der Rückgabewert von "getFromFIFO" ist ein Pointer auf ein "BYTE"-Objekt, welches die Daten des aus der Liste entfernten Elementes enthält. Beachten Sie, dass der "FIFO" kein, ein oder mehr als ein Element enthalten kann und entfernen Sie alle Objekte aus dem Speicher, auf die kein Pointer mehr existiert!
    class FIFO{
    private:
        ELVE *First;
        ELVE *Last;
    public:
        int Anz;
        FIFO(){
        Anker = NULL;
        Last = NULL;
        }
        
        void put2FIFO(BYTE *In){
            ELVE *ptr = new ELVE();
            ptr->Daten = In;
            ptr->setNext = NULL;
        if(First == NULL)
            First = ptr;
            Last = ptr;
        }
        else
            Last->setNext()= ptr;
            Last = ptr;
            
        BYTE *getFromFIFO(){
            BYTE *Wertruck;
        if(First = NULL && Last == NULL)
            return;
        }
        else if(First == Last){
            Wertruck = First;
            delete[]First;
            First = NULL;
            return Wertruck;
        }
        else
        {   
            Wertruck = First;
            Node *ptr = First;
            First = First->getNext();
            delete[]ptr;
            return Wertruck;
        }
    };
    

    Vielen Dank in Vorraus.


  • Mod

    Leider Speicherverwaltung nicht verstanden. Vermutlich aufgrund schlechtem Lehrers, denn die Aufgabenstellung deutet darauf hin, dass der Lehrer das selber nicht beherrscht.

    Hast du irgendetwas von deinem Code mal compiliert oder ausgeführt? Vieles sollte schon beim Compilieren scheitern. Und selbst wenn man alle Compilerfehler beseitigt, sollte es beim kleinsten Testfall schon explodieren, wegen besagter Fehler in der Speicherverwaltung.



  • Bis auf das Schlüsselwort class hat das nichts mit C++ zu tun, das ist C mit Klassen.

    • In C++ benutzt man für Zeichenketten std::string
    • In C++ benutzt man keine "besitzenden" rohen Zeiger, dafgür gibt es smart pointer (std::unique_ptr und std::shared_ptr
    • ... ach, da stimmt einfach gar nichts. Vor allem hat der Aufgabensteller auch keinen Plan von C++, wo haste die Aufgabe her?

  • Mod

    @DocShoe sagte in C++ Prüfungsaufgabe verkettete Liste:

    Bis auf das Schlüsselwort class hat das nichts mit C++ zu tun, das ist C mit Klassen.

    Nee, auch in C programmiert man korrekt. Das hier ist einfach nur falsch.

    • In C++ benutzt man für Zeichenketten std::string
    • In C++ benutzt man keine "besitzenden" rohen Zeiger, dafgür gibt es smart pointer (std::unique_ptr und std::shared_ptr

    Eigentlich wäre hier ein char[8] perfekt angemessen. char[9] falls man die unsinnige Anforderung "mit Stringendezeichen!" unbedingt erfüllen möchte.

    Ach, da stimmt einfach gar nichts. Vor allem hat der Aufgabensteller auch keinen Plan von C++, wo haste die Aufgabe her?

    So ist es. Finger weg!



  • @ccoder94 sagte in C++ Prüfungsaufgabe verkettete Liste:

    public:
        char *getBits(){
        return Bits;
        }
    

    und Datenkapselung nicht verstanden.



  • Ja es tut mir wirklich leid für das schlechte Ergebnis. Die Aufgabe ist von unserem Lehrer
    Aber damit ich vllt etwas konkreter werde, zb. verstehe ich die Anweisung :

    "Verwenden Sie hier die Initialisierungsliste für das Attribut "Valid""

    Also über die Initialisierungsliste hab ich mich etwas informiert, aber es ist mir schleierhaft wie ich hier Valid mit einbinden soll.

    Entschuldigung nochmal für diesen langen Text. Bei mir weiß man wahrscheinlich nicht wo man ansetzen soll.



  • class foo {
        bool valid;
    public:
        foo() : valid{ false } {}
    //        ^^^^^^^^^^^^^^^^
    //      Initialisierungsliste
        bool is_valid() const { return valid; }
    }
    

Anmelden zum Antworten