erklärung bitte (leicht!)



  • ich denke du vergleichst ganz andere objekte miteinander, je mehr man am anfang über ein problem nachdenkt desto schneller findet man für neue Programme die Lösung.

    man sollte sich erstmal mit dem elementaren vertraut machen bevor man zusätliche bibliotheken anwendet

    ein unsinniger vergleich:

    wozu verkehrsregeln lernen ? wenn ich paar kilometer gefahren bin werd ichs schon merken was man darf und nicht darf



  • Stelfer schrieb:

    man sollte sich erstmal mit dem elementaren vertraut machen bevor man zusätliche bibliotheken anwendet

    Die STL ist aber keine zusätzliche Bibliothek, sie ist elementar.



  • Ich habe nicht gesagt, man soll sich nicht mit der Schnittstelle der C++ String-Klasse auseinandersetzen. Es geht hier NICHT darum, dass man nur durch Trial & Error lernen soll, im Gegenteil. Ich habe auch mit C Strings angefangen, weil wir im Studium mit C angefangen haben. Meiner Meinung nach kommt man bei C Strings eher mit "Lernen durch Trial & Error" in Kontakt, als bei C++ Strings. Ich habe von anderen Objekten gesprochen, aber die Analogie bezog sich auf Schnittstellen und das was dahinter steckt. Wie genau das realisiert ist, was hinter einer Schnittstelle steckt muss man nicht wissen. Es geht um den Zweck und die korrekte Verwendung der Schnittstelle. Im Gegensetz zum Lenkrad mit versteckter Lenkstange haben die Verkehrsregeln in erster Linie herzlich wenig mit einer Schnittstelle und dahinter versteckter Funktionalität zu tun. Man könnte die Verkehrsregeln aber als eine Spezifikation ansehen, auf deren Basis man versteckte Funktionalität mit einer sichtbaren Schnittstelle implementiert, die Autos zwingt, sich an diese Regeln zu halten. Und wieder müsste der Fahrer nicht wissen, wie genau die versteckte Funktionalität implementiert ist, sondern nur die Schnittstelle kennen um z. Bsp. die Regeln dem Land entsprechend, zu konfigurieren.
    Wie schon gesagt, in C++ muss man sich erst mit C Strings auseinandersetzen, wenn man seine eigene String-Klasse implementieren will oder wenn man dazu gezwungen wird. Ansonsten ist es genauso freiwillig, wie das Einbetten von Inline-Assembler.



  • Es gibt schlechtere Bücher als "Objektorientiertes Programmieren von Anfang an".

    Im übrigen ist der Ausgangspunkt der Diskussion das Verstehen der for-Schleife, die noch aus C stammt.

    Ich denke, dass man die Klasse string erst dann wirklich versteht, wenn man selbst zumindest rudimentär versucht hat, z.B. auf Basis von char eine solche Klasse zu schreiben.



  • net schrieb:

    BorisDieKlinge schrieb:

    auserdem sollte man erst mal char[..] verstehen bevor man mit string anfängt..

    dafür werden dich die hardcore c++ freaks gleich steinigen 😉

    ... und zwar vollkommen zurecht ! 😉
    Es gibt wirklich KEINEN Grund, Anfänger erst mit char* zu quälen (statt gleich mit string anzufangen) außer:

    • den "C-Hintergrund" des Buchauthors und
    • dessen sadistische "da musste ich auch durch"-Einstellung

    Beides keine Kriterien für gute Didaktik.

    Das regt mich immer wieder auf, weil es vollkommen unnötig Einsteigern das Leben erschwert und dann noch "rufschädigend" für die Sprache ist. Für den richtigen Umgang mit char* muss man einen Haufen Zeug verstanden haben (Zeiger(arithmetik), Heap/Stack, Literale, Arrays, 0-Terminierung, ....) - eigentlich nix für den Anfänger und sein erstes Programm.

    Gruß,

    Simon2.



  • Hallo

    BorisDieKlinge schrieb:

    auserdem sollte man erst mal char[..] verstehen bevor man mit string anfängt.. bau alles aufeinander auf...;)

    Sorry, aber das halte auch ich für Quatsch. Damit kann man sich später beschäftigen. Erstmal sollte man Spaß haben und ein bisschen rumprobieren. Das geht mit char und Kollegen aber nicht wirklich gut.

    chrische



  • BorisDieKlinge schrieb:

    aha.. d.h. es ist völlig egal wie der hase läuft, hautpsache er läuft...

    Das Problem ist, dass amn als Anfänger gar keine Chance hat, zu begreifen, wie der Hase läuft.

    Ich wette mit Dir, dass Du auch erst angefangen hast, char* zu verstehen, als Dir

    • Programmablauf
    • Variablen
    • Konditionen (if)
    • Schleifen

    (und noch einiges mehr) mehr oder weniger in Fleisch ubd Blut übergegangen ist.
    Und für strings kommt noch Einiges weiter dazu (templates, policies, namespaces, ....)

    Im Nachinein unterschätzt man oft die eigenen Lernschritte (in Dauer und Schwierigkeitsgrad) und denkt "ist doch alles logisch - muß man doch einsehen"...
    Denk mal drüber nach, wie lange Du schon "Rechnen/Mathe" in der Schule hattest (von der Zeit davor mal ganz zu schweigen), bevor Du das erstmal einen mathematischen Satz bewiesen hast....

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Für den richtigen Umgang mit char* muss man einen Haufen Zeug verstanden haben (Zeiger(arithmetik), Heap/Stack, Literale, Arrays, 0-Terminierung, ....) - eigentlich nix für den Anfänger und sein erstes Programm.

    das ist aber, nach meiner meinung (bis auf zeigerarithmetik), alles ziemlich banal und auch für einsteiger leicht zu verstehen.

    chrische5 schrieb:

    Erstmal sollte man Spaß haben und ein bisschen rumprobieren. Das geht mit char und Kollegen aber nicht wirklich gut.

    kommt drauf an wie man 'spass' definiert. man kann mit pointern tolle faxen machen. wer ganz drauf verzichten will, kann sich ja einer c++ -verwandten sprache zuwenden, die keine pointer hat.
    aber wir wollen ja nicht schon wieder damit anfangen... 😉
    :xmas2:



  • net schrieb:

    Simon2 schrieb:

    Für den richtigen Umgang mit char* muss man einen Haufen Zeug verstanden haben (Zeiger(arithmetik), Heap/Stack, Literale, Arrays, 0-Terminierung, ....) - eigentlich nix für den Anfänger und sein erstes Programm.

    das ist aber, nach meiner meinung (bis auf zeigerarithmetik), alles ziemlich banal und auch für einsteiger leicht zu verstehen....

    Das gilt definitiv nicht für die Mehrheit der Programmieranfänger !
    (Schau Dir doch nur mal hier im Forum an, wieviele Leute damit Probleme haben)
    Frag' doch mal einen Anfänger, was der Unterscheid zwischen Heap und Stack ist, und wann man aus einem char* lesen oder in ihn schreiben darf. ...

    Ich glaube, da unterliegst Du auch wieder dem (von mir schon beschriebenen) "Fehlschluss"...

    Gruß,

    Simon2.



  • Hallo

    net schrieb:

    chrische5 schrieb:

    Erstmal sollte man Spaß haben und ein bisschen rumprobieren. Das geht mit char und Kollegen aber nicht wirklich gut.

    kommt drauf an wie man 'spass' definiert. man kann mit pointern tolle faxen machen. wer ganz drauf verzichten will, kann sich ja einer c++ -verwandten sprache zuwenden, die keine pointer hat.
    aber wir wollen ja nicht schon wieder damit anfangen... 😉
    :xmas2:

    Mir geht es nicht darum, ob Zeiger überhaupt wichtig und gut sind, sondern nur darum, ob man dies als Anfänger sofort verstehen kann.
    Ich habe es bereits auch in einen anderen Thread geschrieben, aber bei OOP ist es doch auch so, dass man nur die Schnittstellen der Klassen kennen muss und sich eigentlich keine Gedanken darüber machen braucht, was da intern passiert.
    Für mich ist das gerade bei std::string und char das gleiche. Es spielt doch für mich als Benutzer keine Rolle, was da intern passiert.
    Oft passiert es doch dann, dass Anfänger sich mit Dingen wie: Ich will alles selber machen und programmiere mir deswegen meine eigene Engine, string-Klasse oder vector-Klasse. Was soll denn das. Nutzt doch die Arbeit anderer und beschäftige dich mit deinen Programm.

    chrische



  • Einerseits meckern alle immer darüber, das die Standardlib von C++ so minimalistisch ist, und man doch endlich mehr Features haben will. Im anderen Moment sind die, die über C++ motzen, diejenigen die fordern, das man bloss nicht string usw. nutzen sollte, weil man ja nicht weiß wie die funktionieren könnten. Das steht doch im totalen Widerspruch, eine große Basislib zu fordern!?

    Die meisten Leute die programmieren lernen wollen, wollen dies erstmal, weil sie eine Anwendung oder Spiel programmieren wollen. Sie haben ursprünglich das Ziel, etws zu erschaffen. Aber dazu brauchen sie nicht wissen, wie string intern funktioniert. Sie wollen einfach nur Strings verarbeiten!

    Wenn jemand technisch interessiert ist, wird er schnell aus eigenem Willen hinterfragen, wie denn nun string intern funktioniert. Und diesen Weg gehen die C++ Bücher und Tutorials selten.

    Ich lese auch immer "ja, du mußt erstmal 1 Jahr lang trocken Konsole programmieren.". Warum? Weil die alten GUI-Libs so schei*** sind und Lowlevel-Knowhow verlangen? Da ist doch schon der Fehler bei den GUI-Libs!!! Wenn ich eine nutzerfreundliche C++-Lib programmiere, die C++ Features nutzt, kann ich viel Lowlevel-Kram verstecken. Das ist doch der Sinn, warum wir C++ nutzen. Und es ist auch der Sinn, warum C++ erfunden wurde. Weil man damals es Satt hatte, das in C alles so Lowlevel ist, obwohl man es selten braucht. Wenn ich eine Lowlevel-Aufgabe zu erfüllen habe, muß ich mich natürlich damit auseinandersetzen. Aber ich bezeifel, das dies ein Programmier-Anfänger ursprünglich will?



  • @Artchi: 👍 Du hast ja so Recht!

    Gruß
    Werner



  • calm down please



  • ich hab elementar angefangen .. char* etc. !!! erst später OO !!

    naja wenn der Hase nicht mehr läuft, können sich anfänger nich dran tun um zu kapieren wieso er nicht mehr läuft...

    naja.. vll. hab ich ja keine Ahnung:) :xmas2:



  • BorisDieKlinge schrieb:

    ich hab elementar angefangen .. char* etc. !!! erst später OO !!

    Man lernt heute das kleine Einmal-Eins nicht vorher - sondern beginnt gleich mit dem schriftlichen Rechnen! :xmas1:



  • Nochmal zur Aufgabenstellung:

    #include <iostream>
    #include <string>
    #include <iterator>
    #include <algorithm>
    
    int main() 
    {
      std::string wort;
      cin >> wort;
      copy(wort.rbegin(), wort.rend(), ostream_iterator<char>(cout, ""));
    }
    

    Kürzere Vorschläge? :xmas1:

    Damit will ich allerdings nicht sagen, daß das die Lösung ist, die ein Anfänger da abliefern sollte. Das kann man später noch machen. Aber das Wort mit std::string einzulesen und die length-Methode zum Aufbau der Schleife benutzen ist imho schon sinnvoll.



  • Jester schrieb:

    Damit will ich allerdings nicht sagen, daß das die Lösung ist, die ein Anfänger da abliefern sollte.

    richtig, und sowas sollte auch nicht in 'nem anfängerbuch stehen. nur black boxes etc., das ist für anfänger total unverständlich.
    :xmas2:



  • Jester schrieb:

    Kürzere Vorschläge? :xmas1:

    #include <iostream>
    #include <string>
    
    int main(void)
    {
        std::string wort;
        std::cin >> wort;
        for(std::string::reverse_iterator it = wort.rbegin(); it != wort.rend(); ++it)
            std::cout << *it;
    }
    

    Eine Zeile kürzer :p :xmas2:

    Ich mag die for-Schleife für solche Dinge einfach viel lieber als die Sachen aus <algorithm> 😃

    EDIT: Wofür includest du eigentlich <iterator>??

    EDIT2: Habs gerade gesehen... für ostream_iterator<char>

    EDIT3 🕶 : Bei dir fehlen noch ein paar std::

    #include <iostream> 
    #include <string> 
    #include <iterator> 
    #include <algorithm> 
    
    int main() 
    { 
      std::string wort; 
      std::cin >> wort; 
      std::copy(wort.rbegin(), wort.rend(), std::ostream_iterator<char>(std::cout, "")); 
    }
    


  • @Phoemux: jo, okay. Aber die Implementierung ist nicht mehr so schön griffig. 🙂



  • .
    .
    .
    for(std::string::reverse_iterator it = wort.rbegin(); it != wort.rend(); ++it, std::cout << *it); 
    .
    .
    

Anmelden zum Antworten