Bitte um Hilfe.



  • Volkard,

    lass es, was hat eine doppelt verkettet Liste als Haushaufgabe mit allgemeinbildung zu tun??? Nix, also, bitte, geh weiter, danke!



  • So Jungchen jetzt nimm mal tief Luft und setze dich mal wirklich mit dem Thema auseinander. Immer nur zu sagen kann ich nicht will ich nicht bringt dich hier nicht weiter. Ich schätze mal du musst die Aufgabe morgen abgeben also hast du heute Abend noch Zeit dir das Wissen anzueignen, was eine doppelt verkettete Liste ist. Diese Thematik ist wirklich trivial und kann auch bestimmt von dir verstanden werden. Ich sehe bei dir das gleiche Problem wie es viele mit Mathe haben. Sagen immer ich kann das nicht ich kann das nicht aber wenn man sie dann einmal dazu zwingt sich mit dem Thema zu beschäftigen ist plötzlich doch alles ganz einfach und logisch.
    Und ist es nicht schöner abends mit dem Gefühl ins Bett zu gehen selber was geschafft zu haben? 🙂



  • volkard schrieb:

    Das würde ich noch erweitern auf Duetschunterricht.
    Auch Mathe ist eine sinnlose Qual, wer muss an der Arbeit schon rechnen können?

    Ich glaub, das Thema hatten wir schon paar mal 😉 Kann gut sein, dass ich da einfach etwas "traditionsbewußt" denke, aber ich finde eigentlich alle Fächer in der Schule soweit ok für die Allgemeinbildung. Informatik würde mir aber zu weit gehen. Mag schon sein, dass für viele Mathe genauso eine Quälerei ist, aber jetzt noch zusätzlich etwas einzuführen, das wirklich nur für einen kleinen Bruchteil der Menschen später eine Rolle spielen wird, halte ich für einen Fehler. Und ich sehe Mathe viel eher als Grundlagenfach für alles mögliche. Bei Informatik sehe ich das erstmal nicht. Natürlich kann man vieles etwas anders sehen/angehen, wenn man da etwas Ahnung hat und die Probleme durch die Informatikerbrille betrachtet. Aber das bisschen, das man in der Schule dann machen würde, würde nicht reichen, damit man so abstrakt denken kann. Und so wie ich das sehe, was anscheinend unterrichtet wird, geht es nicht mal in die Richtung. Programmieren bringt da nichts, dadurch entwickelt man anfangs kein abstraktes Denken, das hilft als Grundlage überhaupt nicht weiter, es ist nur kompliziert und funktioniert nicht. Nee, ich werd mich sicher nie davon überzeugen lassen, dass Informatik ein sinnvolles Schulfach wäre 😉

    @tom830211: ich weiß nicht, wie man dir sonst helfen könnte. Meine Worte waren etwas harsch, ich dachte, du wärst ein Informatikstudent. Mein Tipp wär auch gewesen, das mit Papier und Stift durchzuspielen, aber wenn du das schon probiert hast, dann weiß ich auch nicht... Vielleicht denkst du auch einfach zu kompliziert. Es ist wirklich trivial und liegt einfach auf der Hand. Mal dir einfach paar Kästchen auf und zeichne Verbindungslinien dazwischen ein. Wie musst du die Linien nun ändern, wenn du ein Kästchen aus der Mitte entfernen willst?


  • Mod

    tom830211 schrieb:

    lass es, was hat eine doppelt verkettet Liste als Haushaufgabe mit allgemeinbildung zu tun?

    Sie ist das programmiertechnische Sinnbild einer Kette.



  • @Mechanics
    Imperative Programmierung erfordert etwas, was viele Leute nicht können: Schritt für Schritt klare Anweisungen geben, deren Ausführung dann im Endeffekt das bewirkt was man erreichen wollte.
    Das in der Schule zu unterrichten halte ich schon für Vorteilhaft, weil ich der Meinung bin dass es allgemein das logische Denken und die Fähigkeit sich klar auszudrücken fördert. Wobei man es dann natürlich so unterrichten müsste dass dabei auch was ankommt.
    Rumhantieren mit Zeigern halte ich dabei z.B. nicht füt notwendig.



  • Hört mal. Wir haben mit Office alles durch. Auch Mi MYSQL ein bißchen gearbeitet, jetzt c++ bzw das Programm QT. Wir haben schon Taschenrechner gemacht, Rechenaufgaben, usw. War echt ok. Aber sowas sehe ich zum ersten Mal. Egal ob ich zeichne, wenn es mich nicht weiterbringt, weil ich nicht richtig weiß, wo was reingehört.
    Ich wollte hier Hilfe bekommen, Weil ich damit nichts zu tun habe, oder ab September hoffentlich nix mehr zu tun haben werde.
    Es ist für mich einfach sinnlos sowas zu lernen. Ich muss es machen. Leider. Hilfe brauche ich.



  • In einer doppelt verketteten Liste hat jedes Element einen Zeiger auf das nächste Element sowie auf das vorige Element.
    Wenn also e ein Zeiger auf ein Element ist, dann muss e->Next immer der Zeiger auf das nächste Element sein, und e->Prev der Zeiger auf das vorige.
    D.h. es muss dann z.B. auch (für alle Elemente bis auf das letzte) gelten e == e->Next->Prev. Und für alle Elemente bis auf das erste muss gelten e == e->Prev->Next.

    Um ein Element e irgendwo einzufügen musst du also 4 Zeiger richtig setzen:
    `e->Next

    e->Prev

    e->Next->Prevunde->Prev->Next`



  • Danke an hustbaer,

    jetzt ist es rückwärts, aber es fahlt 1-2-3. Aber ist schon mal was, ich bekomme auch Fehlermeldungen, das Programm macht den build fertig. 😃
    Ist schon mal was!

    [code"cpp"]
    #include <iostream>
    using namespace std;
    struct listenelement
    {
    string daten;
    listenelement* next;
    listenelement* prev;
    listenelement* last;
    };
    void anhaengen(string datenneu, listenelement* listenanfang)
    {
    listenelement* hilfszeiger;
    hilfszeiger = listenanfang;
    while(hilfszeiger->next != NULL)
    hilfszeiger = hilfszeiger->next;
    hilfszeiger == hilfszeiger->prev->next;
    hilfszeiger == hilfszeiger->next->prev;
    hilfszeiger->daten = datenneu;
    hilfszeiger = hilfszeiger->prev = NULL;
    }
    void ausgeben(listenelement listenanfang)
    {
    listenelement
    hilfszeiger;
    hilfszeiger = listenanfang;
    cout << hilfszeiger->daten << '\n';
    while (hilfszeiger->next != NULL)
    {
    hilfszeiger = hilfszeiger->next;
    cout << hilfszeiger->daten << '\n';
    }
    }
    void ende(listenelement* listenanfang)
    {
    listenelement* hilfszeiger;
    while (listenanfang !=NULL)
    {
    hilfszeiger = listenanfang;
    listenanfang = listenanfang->next;
    delete (hilfszeiger);
    }
    }

    int main ()
    {
    listenelement* listenanfang;
    listenanfang = new (listenelement);
    listenanfang->next = NULL;
    listenanfang->daten = "Element 1",
    anhaengen("Element 2", listenanfang);
    anhaengen("Element 3", listenanfang);
    anhaengen("Element 4", listenanfang);
    ausgeben (listenanfang);
    ende (listenanfang);

    return 0;
    }
    [/code]



  • tom830211 schrieb:

    ... das Programm macht den build fertig.

    Das hat nicht viel zu sagen:
    Zeile 16 und 17 haben keinen Effekt (das ist ein Vergleich)
    Aber da sollte der Compiler eine Warnung geben.

    Es hilft auch nichts, dem Hilfszeiger immer neue Werte zuzuweisen.
    Du musst diese Werte auch mal wieder schreiben.

    Am einfachsten ist es erstmal drei (3) Hilfszeiger zu nehmen.
    Einen für das neue Element,
    einen für den Vorgänger und
    einen für den Nachfolger.

    Damit kannst du dann die Werte neu zuweisen.

    Vorgänger->next     = neues Element
    Nachfolger->prev    = neues Element
    neues Element->prev = Vorgänger
    neues Element->next =
    

    Denke aber auch daran, dass die Zeiger mal NULL sein können (Anfang und Ende).
    Einen NULL-Zieger darf man nicht dereferenzieren.

    Mach dich mal über http://de.wikipedia.org/wiki/Einrückungsstil schlau.



  • Hallo, ich schon wieder.
    Wie kann ich es rückwärts laufen lassen??? Vorvärts geht es ja! 😃

    Danke schön!

    #include <iostream>
    using namespace std;
    struct listenelement
    {
        string daten;
        listenelement* next;
        listenelement* prev;
        listenelement* last;
    };
    void anhaengen(string datenstring, listenelement* listenanfang)
    {
    listenelement* hilfszeiger;
    hilfszeiger = listenanfang;
    while(hilfszeiger->next != NULL)
    hilfszeiger = hilfszeiger->next;
    hilfszeiger->next =  new (listenelement);
    hilfszeiger->next->prev = hilfszeiger;
    hilfszeiger->next->daten = datenstring;
    hilfszeiger->next->next = NULL;
    }
    void ausgeben(listenelement *listenanfang)
    {
    listenelement* hilfszeiger;
    hilfszeiger = listenanfang;
    cout << hilfszeiger->daten << '\n';
    while (hilfszeiger->next != NULL)
    {
    hilfszeiger = hilfszeiger->next;
    cout << hilfszeiger->daten << '\n';
    }
    }
    void ende(listenelement* listenanfang)
    {
    listenelement* hilfszeiger;
    while (listenanfang !=NULL)
    {
        hilfszeiger = listenanfang;
    listenanfang = listenanfang->next;
    delete (hilfszeiger);
    }
    }
    
    int main ()
    {
    listenelement* listenanfang;
    listenanfang = new (listenelement);
    listenanfang->next = NULL;
    listenanfang->daten = "Element 1",
    anhaengen("Element 2", listenanfang);
    anhaengen("Element 3", listenanfang);
    anhaengen("Element 4", listenanfang);
    ausgeben (listenanfang);
    ende (listenanfang);
    
    return 0;
    }
    


  • Na als erstes wie in anhaengen das letzte Element suchen (die while Schleife) und dann über die prev Zeiger zurück gehen statt über die next Zeiger vorwärts.

    BTW: Den last Zeiger in der struct würde ich wegmachen, schliesslich verwendest du den ja auch nicht.
    (Vermutlich wurde "last" hier mit der Bedeutung "letztes" im Sinn von "voriges" verwendet/vorgeschlagen, also einfach nur ein anderer Name für das was bei dir jetzt "prev" heisst.)

    Und dem

    DirkB schrieb:

    Mach dich mal über http://de.wikipedia.org/wiki/Einrückungsstil schlau.

    kann ich mich nur anschliessen.
    Korrekte Einrückung macht den Code viel einfacher lesbar.



  • So,

    danke an alle, wir haben jetzt eine Musterlösung bekommen, Das hätten wir programmieren müssen.
    Also, ohne "prev", nur mit "last".
    Also, hatt die ganze Klasse eine 6 bekommen. Wir haben uns sehr darüber ......

    Danke trotzdem an alle, die helfen wollten!

    #include <iostream>
    using namespace std;
    
    struct listenelement
    {
        int daten;
        listenelement* next;
        listenelement* last;
    };
    
    listenelement* anhaengen(int datenneu, listenelement* listenende)
    {
    
            listenelement* hilfszeiger;
    
            hilfszeiger = listenende;
            hilfszeiger->next = new(listenelement);
    
            hilfszeiger->next->last = hilfszeiger;
    
            hilfszeiger = hilfszeiger->next;
    
            hilfszeiger->daten = datenneu;
    
            hilfszeiger->next = NULL;
    
            return (hilfszeiger);
    }
    
    void ausgeben(listenelement* listenanfang)
    {
    
        listenelement* hilfszeiger;
    
        hilfszeiger = listenanfang;
    
        cout << hilfszeiger->daten << '\n';
    
        while (hilfszeiger->next != NULL)
        {
    
            hilfszeiger = hilfszeiger->next;
    
            cout << hilfszeiger->daten << '\n';
        }
    }
    
    void ausgebenRueckwaerts(listenelement* listenanfang)
    {
    
        listenelement* hilfszeiger;
    
        hilfszeiger = listenanfang;
    
        while (hilfszeiger->next != NULL)
    
            hilfszeiger = hilfszeiger->next;
    
        while (hilfszeiger != NULL)
        {
            cout << hilfszeiger->daten << '\n';
    
            hilfszeiger = hilfszeiger->last;
        }
    }
    
    void ende(listenelement *listenanfang)
    {
    
        listenelement* hilfszeiger;
    
        while (listenanfang != NULL)
        {
    
            hilfszeiger = listenanfang;
    
            listenanfang = listenanfang->next;
    
            delete(hilfszeiger);
        }
    }
    
    int main ()
    {
    
        listenelement* listenanfang;
    
        listenelement* listenende;
    
        listenanfang = new(listenelement);
    
        listenanfang->next = NULL;
        listenanfang->daten = 1;
    
        listenende = listenanfang;
    
        for (int schleife = 2; schleife< 100; schleife++)
            listenende = anhaengen(schleife, listenende);
    
        ausgeben(listenanfang);
    
        ausgebenRueckwaerts(listenanfang);
    
        ende(listenanfang);
    
        return 0;
    }
    


  • Die ganze Klasse hat ne 6 bekommen, weil sie die Variable "prev" und nicht "last" genannt haben? 😃
    Lustig auch, dass wohl deine ganze Klasse diesen Thread gelesen hat.

    Mal ehrlich, was genau hat der Lehrer denn gesagt?



  • tom830211 schrieb:

    Also, hatt die ganze Klasse eine 6 bekommen.

    .. dann hat ja wohl der Lehrer auf ganzer Linie versagt - oder?



  • NaAHörMal schrieb:

    Die ganze Klasse hat ne 6 bekommen, weil sie die Variable "prev" und nicht "last" genannt haben? 😃
    Lustig auch, dass wohl deine ganze Klasse diesen Thread gelesen hat.

    Kann ja sein dass die anderen wegen anderer Fehler/Probleme ne 6 bekommen haben.

    Davon abgesehen ist natürlich von einem Versagen des Lehrers auszugehen wenn die ganze Klasse ne 6 bekommt.
    Eine ganze Klasse voller Idioten und/oder Leute die zu faul sind eine bestimmte Aufgabe zu machen, davon ist ja eher nicht auszugehen.

    @tom830211
    Wie ist denn euer Direktor so drauf? Falls man mit dem halbwegs reden kann würde ich mir mal einen Termin bei diesem erbitten. Bzw. vielleicht kann man das ganze ja einfach beim nächsten Elternsprechtag ansprechen.
    Dass ein Lehrer allen ne 6 gibt, einfach nur weil er nicht fähig war das Thema so zu unterrichten dass es wenigstens ein paar Schüler verstehen, das kanns ja dann auch nicht sein.
    Dann muss man als Lehrer auch soweit sein zu sagen "OK, das hab' ich verbockt, also werte ich die Aufgabe einfach nicht und gucke wie ich das das nächste mal besser machen kann".

    ps: Ausser natürlich es haben alle in eurer Klasse "zufällig" 1:1 den selben Code abgegeben. Dann würde wohl auch ich als Lehrer einfach allen ne 6 geben 😉
    (Obwohl man bei dieser Aufgabe schon sehr eingeschränkt ist, bzw. auch sehr wenig dazuprogrammieren muss, so dass es kaum sehr viele wirklich unterschiedliche Lösungen geben wird -- auch ohne Schummeln/Abschreiben. Gerade weil schon so viel vorgegeben ist, inklusive Schema wie lokale Hilfsvariablen etc. benannt werden.)



  • Eine ganze Klasse voller Idioten und/oder Leute die zu faul sind eine bestimmte Aufgabe zu machen, davon ist ja eher nicht auszugehen.

    da wäre ich mir mal nicht so sicher 😉



  • Nun, paar haben es nicht mal versucht. Wieso auch, kann ich auch nachvollziehen. Aber ich habe es wenigstens versucht, mit Hilfe von hier, die Tipps habe ich eingebaut, es lief bloß nicht rückwärts. Aber trotzdem ne 6. Ist ja auch ok. Die nächste Aufgabe ist ein TV zu programmieren, mit ein und aus. Weiß nicht wieso, aber hört sich nicht schwer an.



  • Also dieses "die ganze Klasse hat ne 6 bekommen" hört sich so bekannt aus Schulzeiten an.

    Man hat ne 6 bekommen, schaut sich um : "Ach ja, [2-3 Personen, die ich kenne] haben auch auch ne 6 -> JEDER HAT NE 6!!!".

    In deinem Fall ist die 6 natürlich gerechtfertigt. Du hast schlichtweg überhaupt keine Ahnung von der Materie und du hast was gefordert war einfach nicht mal ansatzweise umgesetzt. Wenn es eine schlechtere Note als die 6 gäbe, dann wäre diese angebracht.

    Aber das ist dir auch völlig bewusst und da du nicht klagst ist ja auch alles in Ordnung. Ist halt nun mal so.

    Was die anderen angeht haben wir natürlich viel zu wenig Informationen. Das hängt imho vom Milieu ab. Kein Lehrer der Welt kann Menschen unterrichten, die nicht unterrichtet werden wollen.
    Aber in so einem Milieu bringt man eig. auch keine Informatik bei.

    Naja, wie auch immer ... Wir können daran eh nichts ändern, du wirst auch nichts dran ändern und am Ende ist es halt so, wie es ist.
    Schade aber auch keine Tragödie.



  • NaAHörMal schrieb:

    In deinem Fall ist die 6 natürlich gerechtfertigt. Du hast schlichtweg überhaupt keine Ahnung von der Materie und du hast was gefordert war einfach nicht mal ansatzweise umgesetzt. Wenn es eine schlechtere Note als die 6 gäbe, dann wäre diese angebracht.

    Wie kannst du das sagen?
    Warst du beim Unterricht dabei?
    Weisst du was unterrichtet wurde? Ob die Schüler überhaupt auch nur ansatzweise genug mitbekommen haben so dass man ihnen die Aufgabe zumuten kann?
    Kann sein ja, kann sein nein.

    Was ich nicht abkann, ist wenn sich jemand anhand unvollständiger und nicht nachzuprüfender Daten ein Bild macht, und dann sicher ist dass es zutrifft.
    Das ist nämlich reichlich arrogant.
    Und abgesehen davon natürlich auch sehr dumm.
    Macht die Welt dafür natürlich unglaublich einfach.



  • hustbaer schrieb:

    Wie kannst du das sagen?
    Warst du beim Unterricht dabei?
    Weisst du was unterrichtet wurde? Ob die Schüler überhaupt auch nur ansatzweise genug mitbekommen haben so dass man ihnen die Aufgabe zumuten kann?
    Kann sein ja, kann sein nein.

    Hast du mal versucht den Thread zu lesen?

    Mal ehrlich ... Mit der Einstellung hat man nichts anderes als eine 6 verdient. Ganz egal was der Lehrer beigebracht hat oder was auch nicht.

    Willst du mir ernsthaft erzählen, dass jemand mit der Einstellung "Ich will das gar nicht können, sagt mir bitte einfach die Lösung damit ich es abgeben kann! Ich will auch bitte überhaupt gar keine Mühe darin investieren, es zu verstehen!" etwas anderes als die schlechteste Note verdient hat?

    Es juckt ihn doch nicht mal. Und wieso? Weil er selber weiß, dass es verdient war.


Anmelden zum Antworten