Zu den Aufzeichnungen der tutorials.de-Live-Workshops
Like Tree3Danke
  • 1 Beitrag von Akeshihiro
  • 1 Beitrag von Der Wolf
  • 1 Beitrag von Matthias Reitinger
ERLEDIGT
NEIN
ANTWORTEN
11
ZUGRIFFE
670
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von mrs_schokokeks
    mrs_schokokeks mrs_schokokeks ist offline Mitglied
    Registriert seit
    Aug 2010
    Beiträge
    10
    Hallo!

    Ich hab hier folgende Aufgabe:

    Die Anweisung


    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
     
    Stack fuechse;
     
    for(int i = 1; i <= 8; i++)
    {
     
        if(getZufallsBit())
            fuechse.push(newFix());
        else
            fuechse.push(newFoxi());
    }while(fuechse.pop());

    Ausgabe:

    5.Foxi.Objekt
    3.Fix.Objekt
    2.Fix.Objekt
    4.Foxi.Objekt
    3.Foxi.Objekt
    1.Fix.Objekt
    2.Foxi.Objekt
    1.Foxi.Objekt


    Alle Klassen erstellen
    - Stack ist keine Template Klasse
    - Stack soll als lineare Liste implementiert werden
    - Fix und Foxi Objekte werden gezählt. Sie kennen offenbar ihre Nummer
    - pop entnimmt das oberste Element vom Stapel und gibt dessen Wert mit cout aus.



    Soviel hab ich zusammenbekommen :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    
    class Stack
    {
    private:
        
        enum {anzahl=8};
        string feld[anzahl];
        int top;
        
    public:
     
        Stack ()    
        { 
            top = 0; 
        }   
     
     
        bool push(string objekt)
        {
            if (top == anzahl)
            return false;   
            else
            {
                feld [top] = objekt;    
                top++;         
                return true;  
            }
        }
     
     
        bool pop()
        {
            if (top == 0)   
            return false; 
     
            else 
     
            { 
                top--;
                cout << top << "\n";
                    return true;
            }
        }                               
     
    };
     
            string newFix()
        {
            string s = "Fix.Objekt\n";
            return s;
        }
     
     
        string newFoxi()
        {
            
            string s = "Foxi.Objekt\n";
            return s;
            
        }
     
    bool getZufallsBit()


    Und da es nicht das Ziel der Aufgabe war, mit unendlich laufender Ausgabe + Piepton einen epilleptischen Anfall beim Anwender auszulösen, brauche ich Hilfe!

    In der Aufgabe heißt es "Alle Klassen erstellen". Sind newfix und newFoxi (Template) Klassen?
    Und ich weiß nicht, was getZufallsbit() macht oder eher gesagt, wann es true und wann false ausgeben soll.

    Bitte helft mir

    Julie
    Geändert von mrs_schokokeks (04.09.10 um 20:38 Uhr)
     

  2. #2
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    566
    Wie lange machst du das schon bzw. wie lange beschäftigst du dich mit C++ mittlerweile?

    Wenn ich deinen Code so sehe stellen sich mir ein paar Fragen: "Hast du die Aufgabe richtig gelesen?", "Weißt du, was ein Stack ist und wie er arbeitet?" und "Hast du im Internet schonmal nach einer Beispielimplementierung gegooglet?".

    Anstatt dir eine Lösung zu geben, tippe ich lieber ein paar Tipps oder Stichpunkte runter, die dir helfen sollten (hoffe ich). Dannach kannst du es ja nochmal probieren und dann dein neues Ergebnis posten oder halt weitere Fragen stellen

    Das, was du da machst, ist keine lineare Liste, sondern bestenfalls eine ArrayList und das war in der Aufgabe nicht gefordert. Vielleicht hilft es dir ein wenig, wenn ich das Stichwort "verkettete Liste" in den Raum werfe.

    newFix() und newFoxi() sind Funktionen und keine Klassen. Allerdings kannste ja die Klassen Fix und Foxi implementieren und die Funktionen geben halt ein Objekt des jeweiligen Typs zurück. Für die Ausgabe der Strings "Foxi.Objekt" und "Fix.Objekt" kommt es auf deine Implementierung an, aber es würde sich anbieten den <<-Operator der beiden Klassen zu überladen.

    Außerdem steht in der Aufgabe zwar, dass die Klasse Stack keine Template-Klasse sein soll, das heißt aber nicht, dass du sie auf Strings beschränken sollst. Die oberste Klasse aller Objekte ist die object-Klasse, würde sich also anbieten, denn dann können alle Datentypen aufgenommen werden. Alternativ würde ich mir eine Vaterklasse für Fix und Foxi überlegen, z.B. Fox, und diese Klasse als Typ für den Stack verwenden, damit Fix und Foxi verwendet werden, object wäre aber wohl ratsamer.

    Und was getZufallsBit() angeht, ich weiß auch nicht, was darin passieren soll, aber der Name sagt es ja schon eigentlich. Meine Interpretation wäre: Bit = 1 oder 0, folglich soll per Zufall entweder eine 1 oder eine 0 zurückgegeben werden. Brauchst kein True oder False zurückgeben, weil C++ fast alles als True "schluckt", Ausnahmen sind False, 0 und NULL.

    Hoffe, das bringt dich etwas weiter
    Geändert von Akeshihiro (08.09.10 um 14:10 Uhr)
    mrs_schokokeks bedankt sich. 
    Man sagt, das Schwert eines Samurai sei seine Seele ...

    Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.

    Das Schmieden ist eine Kunst; Das Schreiben auch ;)

  3. #3
    Avatar von mrs_schokokeks
    mrs_schokokeks mrs_schokokeks ist offline Mitglied
    Registriert seit
    Aug 2010
    Beiträge
    10
    Danke für die Tipps! Damit werden meine Versuche ja noch schlimmer!

    Ja, habs mit verketteter Liste versucht und bin kläglich gescheitert Erstellt push() immer ein neues Element mit dem "Inhalt" newFix() und newFoxi()? Aber wenn das member von Klassen sein sollen, wie können sie dann ohne Objekt aufgerufen werden?

    Ich weiß gar nicht, was da an push überhaupt übergeben wird...
    ANGENOMMEN, das wären strings...

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    
     
    class Stack
    {
    private:
        string fuchs;
        Stack* next;
            
    public:
     
    void push (string f)   
     
    { 
        Stack* ptr;
        Stack* hilf;        
        hilf = ptr;         
     
        if (ptr == NULL)        
        {
            ptr = new Stack;    
            ptr->next = 0;
            ptr->fuchs = f; 
            
        }
     
        else                          
        
            while (hilf->next != NULL)
            {
                hilf = hilf->next; 
            }
        
        hilf->next = new Stack;
        hilf->next->fuchs = f;
        hilf->next->next = NULL;
     
    }
        
        bool pop()
        {
            Stack* ptr;
            Stack *hilf;
            hilf = ptr;
            while (hilf->next != NULL)
                hilf = hilf->next;
            cout << hilf->next->fuchs;
            return true;
                
        }                                   
     
     
     
     
    };
     
        string newFix()
        {
            string s = "Fix.Objekt\n";
            return s;
        }
     
     
        string newFoxi()
        {
            
            string s = "Foxi.Objekt\n";
            return s;
            
        }
     
    bool getZufallsBit();

    Ich bezweifle stark, das pop() vom Typ bool ist...

    folglich soll per Zufall entweder eine 1 oder eine 0 zurückgegeben werden
    Das habe ich mir gedacht und habe gehofft, dass jemand eine hübsche Lösung dazu hat, weil ich mir das gaaar nicht vorstellen kann.
     

  4. #4
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.770
    Blog-Einträge
    5
    Zitat Zitat von Akeshihiro Beitrag anzeigen
    Die oberste Klasse aller Objekte ist die object-Klasse, würde sich also anbieten, denn dann können alle Datentypen aufgenommen werden.
    Ich glaube du hast dich in der Programmiersprache geirrt. In C++ gibt es keine globale Oberklasse, von welcher alle anderen Klassen erben.

    Grüße,
    Matthias
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  5. #5
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    566
    Zitat Zitat von Matthias Reitinger Beitrag anzeigen
    Ich glaube du hast dich in der Programmiersprache geirrt. In C++ gibt es keine globale Oberklasse, von welcher alle anderen Klassen erben.

    Grüße,
    Matthias
    Kann sein ... Aber ich hab da sowas im Kopf ... Ich wälz mal meine Bücher und meld mich dann

    EDIT:
    Ok, hast recht. Frag mich nur woher ich das dann hab o.O Und nein, das hat nix mit Java zu tun ...
    Geändert von Akeshihiro (05.09.10 um 12:02 Uhr)
     
    Man sagt, das Schwert eines Samurai sei seine Seele ...

    Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.

    Das Schmieden ist eine Kunst; Das Schreiben auch ;)

  6. #6
    Der Wolf Der Wolf ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    153
    Hi,

    newFix und new Foxi könnten ja Member der Klasse sein, in der du die ganze oben beschriebene Aufgabe implementierst. Oder es sind halt statische Methode. Was die zurückgeben sollen scheinen ja Objekte irgendeiner Art zu sein, also hast du da wohl relativ freie Wahl.
    Die Methode pop() wird dir wohl ein bool zurückgeben, dass anzeigen soll ob noch Objekte in deinem Stack vorhanden sind oder nicht.
    Und für die getZufallsBit kannst du ja eine der bereits vorhandenen Random Funktionen verwenden, die dir eine Zufallszahl liefern und dann aufgrund der Zahl entscheiden ob eine 1 oder eine 0 vorliegt.

    Gruß
    Der Wolf
    mrs_schokokeks bedankt sich. 

  7. #7
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    566
    pop() gibt aber kein bool-Wert zurück, sondern nimmt das oberste Objekt vom Stapel runter und gibt dieses dann zurück.
     
    Man sagt, das Schwert eines Samurai sei seine Seele ...

    Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.

    Das Schmieden ist eine Kunst; Das Schreiben auch ;)

  8. #8
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.770
    Blog-Einträge
    5
    Zitat Zitat von Akeshihiro Beitrag anzeigen
    pop() gibt aber kein bool-Wert zurück, sondern nimmt das oberste Objekt vom Stapel runter und gibt dieses dann zurück.
    In der Aufgabenstellung der Themenerstellerin steht nur, dass das Objekt auf die Standardausgabe ausgegeben werden soll. Über den Rückgabewert wird keine Aussage getroffen.

    @mrs_schokokeks: Du verwendest in deiner Implementierung sehr häufig nicht initialisierte Zeiger. Wenn du eine Variable nicht initialisierst, ist deren Wert undefiniert (zufällig). Insbesondere werden Zeiger nicht automatisch mit NULL initialisiert. Zur Implementierungsidee an sich: du versuchst anscheinend bei push() das neue Element am Ende der Liste einzufügen und bei pop() entsprechend das letzte Element zu entfernen. Das ist unnötig kompliziert. Hänge neue Elemente doch einfach am Anfang ein, dann musst du nicht jedes Mal die komplette Liste ablaufen. Im Netz gibt es auch eine Vielzahl von Beispielimplementierungen

    Grüße,
    Matthias
    Geändert von Matthias Reitinger (06.09.10 um 15:49 Uhr) Grund: Typo
    mrs_schokokeks bedankt sich. 
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  9. #9
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    566
    Zitat Zitat von Matthias Reitinger Beitrag anzeigen
    In der Aufgabenstellung des Themenerstellers steht nur, dass das Objekt auf die Standardausgabe ausgegeben werden soll. Über den Rückgabewert wird keine Aussage getroffen.
    Ja schon, aber im Normalfall ist es so, da pop() dazu verwendet wird das oberste Objekt rauszuholen.
     
    Man sagt, das Schwert eines Samurai sei seine Seele ...

    Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.

    Das Schmieden ist eine Kunst; Das Schreiben auch ;)

  10. #10
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    7.970
    Hi.
    Zitat Zitat von Akeshihiro Beitrag anzeigen
    Ja schon, aber im Normalfall ist es so, da pop() dazu verwendet wird das oberste Objekt rauszuholen.
    Das ist in der STL aber z.B. nicht der Fall. Da gibt pop() einfach nur void zurück. Mit top() kann auf den obersten Wert des Stacks zugegriffen werden. (http://www.cplusplus.com/reference/stl/stack/pop/)

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  11. #11
    Avatar von mrs_schokokeks
    mrs_schokokeks mrs_schokokeks ist offline Mitglied
    Registriert seit
    Aug 2010
    Beiträge
    10
    Danke für die Antworten!


    Aufgabe:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    void main()
    {
        Stack fuechse;
     
        for( int i = 1 ; i <= 8 ; i++)
        {
            if(getZufallsBit())
                fuechse.push(new Fix());
            else
                fuechse.push(new Foxi());
        }while(fuechse.pop());
     
    Alsooo, neuer Versuch:
     
    }

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    
    #include <iostream>
    #include <string>
    #include "stlist.h"
    #include <ctime> 
     
    using namespace std;
     
     
    class Stack
    {
    private:
        Stack* f;
    public:
        Stack(){};
        
        
        /*void push(Stack* fu)       ********? Zugriff auf void push(T ding) aus stlist****
        {
            f=fu;
     
        }
        bool pop()
        {
            
            return true;
        }*/
     
        
    };
     
    class Fix:public Stack
    {
    public:
        Fix(){ /*cout << "Fix.Objekt" << endl;*/};
        
    };
     
    class Foxi:public Stack
    {
    public:
        Foxi(){/*cout<< "Foxi.Objekt"<< endl;*/};
        
    };


    stlist.h

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    
    #include <iostream>     
    using namespace std;
     
    template<typename T>
    class STlist
     
    {
        enum{anzahl = 10};
        T stapel[anzahl];
        int top;
     
     
    public:
     
    STlist()
        {
            top = 0;
        };
     
    void push(T ding)
     
            {   
        
                stapel[top] = ding;
                top++;
                    
            }
     
     
    bool pop()
            {
                if( top == NULL)
                return false;
     
                else
     
                top--;
                cout << stapel[top];
            
                return true;
            }
        
    };


    Ich hatte ähnliche Aufgaben mit push und pop, aber hier habe ich das Problem, dass Stack keine Template-Klasse ist. Ich muss also auf push und pop "über" Stack zugreifen (fuechse.push), aber push() soll Template sein (hoffe ich).

    Ich hatte in main statt
    Stack fuechse
    das hier geschrieben:
    STlist<Stack*> fuechse;

    dann sind push und pop Methoden von Stack, alles in Template und es hat funktioniert!

    Aber wie greife ich hier über fuchs der nicht-templateKlasse Stack auf die template-Methode push()?
     

  12. #12
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    7.970
    Hi.

    Vergiss doch mal bitte im Zusammenhang mit Listen deine Arrays.

    Ein Liste ist eine aus einfachen Grundelementen zusammengesetzte Datenstruktur:
    Code cpp:
    1
    2
    3
    4
    
    struct list_node {
      void* data;
      list_node* next;
    }
    Diese list_node (Kettenglieder) können zu einer Liste zusammengefügt werden indem man sie aneinander hängt. Es gibt keine festgelegte Größe (im Gegensatz zu Arrays).

    In dieser Aufgabe brauchst du auch keine Templates, verwende doch einfach Vererbung, so dass Fix und Foxi eine gemeinsame Oberklasse besitzen.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. C# Elemente in Liste hinzufügen und auslesen
    Von Terminator2 im Forum .NET Windows Forms
    Antworten: 8
    Letzter Beitrag: 31.03.09, 19:17
  2. Qt: Elemente bei Tab-wechsel hinzufügen
    Von Ozzy Ozborn im Forum C/C++
    Antworten: 0
    Letzter Beitrag: 06.11.07, 09:07
  3. Dom Elemente hinzufügen und löschen
    Von Stefan Miefert im Forum Javascript & Ajax
    Antworten: 4
    Letzter Beitrag: 15.09.06, 06:07
  4. GEF Grundlagen - Elemente hinzufügen
    Von SOSUS im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 3
    Letzter Beitrag: 10.12.04, 15:11
  5. mit js dom td-Elemente hinzufügen
    Von quezo im Forum Javascript & Ajax
    Antworten: 6
    Letzter Beitrag: 26.02.03, 14:25