erklärung bitte (leicht!)



  • 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); 
    .
    .
    


  • Hallo

    egon2 schrieb:

    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:

    Auch in der Schule gibt es viele Beispiel für das Prinzip vom Allgemeinem zum Speziellen.

    chrische



  • BorisDieKlinge schrieb:

    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...

    Würdest du, wenn der Hase nicht mehr läuft, die std::string Klasse deiner Standard-Lib umschreiben, oder wie ist das im Bezug auf std::string zu verstehen?

    egon2 schrieb:

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

    Was hat das mit dem Verhältnis einer äußeren Schnittstelle zu einer ausgetüftelten Implementierung zu tun? Verhält sich etwa schriftliches Rechnen zu Kopfrechnen wie eine Schnittstelle zu ihrer versteckten, professionellen Funktionalität?



  • Phoemuex schrieb:

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

    Siehe dazu auch Effective STL - Item 5

    Phoemuex schrieb:

    Eine Zeile kürzer :p :xmas2:

    Hier noch eine Zeile weniger, indem die for-Schleife diesmal benutzt wird, ohne der Funktionalität des Programms zu nützen 😉

    #include <iostream>
    #include <string>
    #include <algorithm>
    #include <iterator>
    
    int main()
    {
        for(std::string s; !s.length(); std::cin >> s, std::reverse_copy(s.begin(), s.end(), std::ostream_iterator<char>(std::cout, "")));
    }
    


  • Konstruktör schrieb:

    Siehe dazu auch Effective STL - Item 5

    Google schrieb:

    Prefer range member functions to their single-element counterparts.

    Gibts da auch ne Begründung zu? Ich habe das Buch selber nicht...

    :xmas2:



  • int main()
    {
    for(std::string s="balabal"; !s.length(); std::cin >> s, std::reverse_copy(s.begin(), s.end(), std::ostream_iterator<char>(std::cout, "")));
    }


Anmelden zum Antworten