Gutes Buch für Einstieg in C++?



  • Mitleid schrieb:

    krümelkacker schrieb:

    nachtfeuer schrieb:

    Als schneller aber guter Schnuppereinstieg, wirklich gut, ist auch dieses Script [...] http://wwwmath.uni-muenster.de/num/Vorlesungen/Programmierpraktikum_WS1112/Skript/praesentation_praktikum.pdf

    Sooo toll finde ich das gar nicht. Besser mal in Accelerated C++ reingucken.

    Sehe ich auch so. Das ist kein Schnuppereinstieg sondern Zeitverschwendung.

    Das erlärt doch mal bitte etwas genauer.
    Warum sollte sich ein Anfänger keine kleinen Erfolgserlebnisse mit wichtigen Hilfsmitteln gönnen?

    Natürlich kann man auch gleich mit Büchern wie http://www.amazon.de/Modernes-Design-Programmierung-Entwurfsmuster-Professional/dp/3826613473/
    einsteigen, ist ja ein Klacks.

    In gewisser Weise steht C++ in der Tradition von APL (guck mal, noch effektiver) und in der Tradition von Lisp (1001 Dialekt) (1001 Bibliothek) und in der von Linux (ach, kannste nich?) usw.

    Naja, und wenn man schon keinen Zugriff auf die tollen englischsprachigen Texte hat, dann sollte man sich wenigstens etwas Gutes auf deutsch gönnen:
    http://www.amazon.de/Hacking-Die-Kunst-Exploits-mit/dp/3898645363/



  • nachtfeuer schrieb:

    Mitleid schrieb:

    krümelkacker schrieb:

    nachtfeuer schrieb:

    Als schneller aber guter Schnuppereinstieg, wirklich gut, ist auch dieses Script [...] http://wwwmath.uni-muenster.de/num/Vorlesungen/Programmierpraktikum_WS1112/Skript/praesentation_praktikum.pdf

    Sooo toll finde ich das gar nicht. Besser mal in Accelerated C++ reingucken.

    Sehe ich auch so. Das ist kein Schnuppereinstieg sondern Zeitverschwendung.

    Das erlärt doch mal bitte etwas genauer.
    Warum sollte sich ein Anfänger keine kleinen Erfolgserlebnisse mit wichtigen Hilfsmitteln gönnen?

    Das sagt ja keiner. Im Gegenteil. Das von Dir verlinkte Material ist leider eher eine schlechtere Low-Level-Feature-Aufzählung des Sprachkerns. Warum denkst du, dass das gut dazu geeignet wär, Anfängern zu Erfolgserlebnissen zu verhelfen? Sie werden dadurch ja erstmal mit recht unpraktischem Wissen konfrontiert. Von std::string oder std::vector<> sehe ich erstmal ganz lange gar nichts. Aber das sind praktische High-level-Features. Stattdessen sehen wir

    char zeichenkette[] = "Guten Morgen Welt!";
    

    Was nimmt der Leser dabei mit? Was soll er sich unter zeichenkette genau vorstellen? Dann wird später char* im Beispielcode verwendet ohne Erklärungen. Die For-Schleife wird mit

    for ( Zählervariable(n) ; Abbruchbedingung; Veränderung der Zählervariable(n) )

    erklärt. Das Wort "Abbruchbedingung" ist da leider ungeschickt gewählt, da, wenn der Ausdruck im boolschen Kontext true ergibt, die Schleife gerade nicht abgebrochen wird. Weiter:

    const char* dateiname = "ausgabe";
    

    Datentyp als const deklariert heißt: Objekt nachträglich nicht mehr veränderbar.

    Was soll das dem Anfänger sagen? Der weiß ja nicht einmal, dass dateiname ein Zeiger ist. Wie kann er dann wissen, dass sich das const hier auf das gezeigte, nicht aber auf den Zeiger bezieht?

    Weiter können wir sehen:

    int: ganzzahliger Wert, Größe: 2 Byte
    long: ganzzahliger Wert, Größe: 4 Byte

    float: Gleitkommazahl, Größe: 4 Byte
    double: Gleitkommazahl, Größe: 8 Byte
    long double: Gleitkommazahl, Größe: >8 Byte (nicht einheitlich)

    Das hier ist nichts halbes und nichts ganzes. Dadurch, dass er hier sagt "nicht einheitlich" kann er sich ja hier nicht auf eine bestimmte Plattform beziehen. Allerdings ist alles andere auch nicht einheitlich. Wenn er erklären will, was der C++ Standard für diese Typen für Garantien machen will, dann geht das so:

    int: ganzzahliger Wert, kann mindestens die Zahlen -32767...32767 darstellen (typischerweise mehr auf aktuellen Systemen)
    long: ganzzahliger Wert, kann mindestens die Zahlen -2147483647...2147483647 darstellen

    float: Gleitkommazahl, mindestens 6 Dezimalstellen genau
    double: Gleitkommazahl, mindestens 10 Dezimalstellen genau
    long double: Gleitkommazahl, mindestens 10 Dezimalstellen genau (ggf genauer als double, falls die Plattform das unterstützt)

    (Hier sind die 6 bzw 10 signifikantesten Stellen, keine Nachkommastellen gemeint. Und das bezieht sich auch nur auf Zahlen mit Betrag zwischen 1e-37 und 1e+37, da es sonst ggf Unterläufe (denormalisierte Zahlen) oder Überläufe (Infinity) gibt)

    Auch ganz toll:

    #include<iostream>
    using namespace std;
    
    int main()
     {
      int groesse;
      cin >> groesse;
    
      // nicht-dynamischer array:
      double feld[ groesse ];
    
      // dynamischer array::
      double *dynamischesFeld = new double[ groesse ];
    
      // Verhalten komplett gleich:
      for ( int i = 0; i < groesse; i += 1 )
       {
        feld[i] = i;
        dynamischesFeld[i] = i;
        cout << "feld[i] = " << feld[i] << endl;
        cout << "dynamischesFeld[i] = " << dynamischesFeld[i] << endl;
       }
      return 0;
    

    Er tut so, als wäre das legales C++. Ist es aber nicht. new/delete hatte er vorher schonmal erwähnt, aber bei all seinen ungeschickten Dynamische-Felder-Konstruktionen ist gar nichts von delete[] zu sehen.

    Wahnsinn! Auf Seite 98 wird mal std::string verwendet mit der Erklärung "string verhält sich wie char[]". Na supi! Wieso gibt's dann beides?

    Bitte schaut Euch mal Folie 116 an. Ich verstehe absolut nicht, was er mir damit sagen will. Er legt ein Hund-Objekt an und einen Zeiger auf dasselbe Hundobjekt und faselt etwas von Kopierkonstruktoren, dass man die doch überschreiben müsste. WTF?!

    Dann kommt Überatorüberladung am Beispiel der Klasse "Hund" mit hund1+hund2, wobei dieser Operator auch noch den Zustand von hund1 verändert!! WTF?!

    Das mit den virtuellen Funktionen wird auch nicht besonders toll erklärt.

    Die Container der Standardbibliothek kommen ganz am Ende des Kurses dran. WTF?!

    Oh mann! Jetzt, wo ich da nochmal drüber geblätter habe, musste ich feststellen, dass der Kurs noch schlechter ist, als ich zuerst dachte ...

    Gut, das eine oder andere wird Herr Doktor Patrick Henning sicherlich während der Vorlesung noch zusätzlich erklären, aber für zum alleine zu Hause lesen, ohne bei der Vorlesung dabei gewesen zu sein, ist das echt Zeitverschwendung.



  • Erstmal:
    1. Kommt es als Anfänger nicht so genau auf jede Einzelheit an, sondern erstmal ein bißchen auswendiglernen, nachprogrammieren und auf einen grünen Zweig kommen.
    2. Sind Speichergeschichten al la Variable vs [Variable] (und natürlich &Variable) nicht immer einfach zu verstehen, man braucht eine gewissen Zeit, muss es sacken lassen, u.a. kommt man ja auch öfter mal durcheinander z.B. bezüglich Konvertierungen, Typenumwandlungen usw.

    Na klar, man kann bei dem Skript annehmen, dass in der Vorlesung und in Tutorial-Seminaren auch Debuggersessions gemacht werden, um den Code genauer einzuordnen und zu verstehen, da hast du schon recht.

    Eine Zeichenkette sieht im Hexcode nicht viel anderes aus in verschiedenen Programmiersprachen, meistens sieht sie so oder so ähnlich aus:

    1E5B:0200  47 75 74 65 6E 20 4D 6F-72 67 65 6E 20 57 65 6C     Guten Morgen Wel
    1E5B:0210  74 21 20 41 75 73 67 65-73 63 68 6c 61 66 65 6e 3f  t!
    

    Operatorüberladung finde ich gut am Beispiel mit <<, aber dazu müsste man jetzt auch erstmal Shifts verstehen. Allerdings finde ich den Begriff etwas, na sagen wir mal, "technisch überhöht", ..aber ein besser Begriff fällt mir auf die Schnelle jetzt auch nicht ein, Multimeaning, Autosense, ...ambiguousi..das hat aber echt was von künstlicher Intelligenz. Wenn das jetzt Sprachprogramme genausogut könnten, wie der C++ Compiler...Ball...Blatt...ja, ich weiß was gemeint ist...;)



  • nachtfeuer schrieb:

    Erstmal:
    1. Kommt es als Anfänger nicht so genau auf jede Einzelheit an, sondern erstmal ein bißchen auswendiglernen, nachprogrammieren und auf einen grünen Zweig kommen.

    2. Sind Speichergeschichten al la Variable vs [Variable] (und natürlich &Variable) nicht immer einfach zu verstehen, man braucht eine gewissen Zeit, muss es sacken lassen, u.a. kommt man ja auch öfter mal durcheinander z.B. bezüglich Konvertierungen, Typenumwandlungen usw.

    Das alles spricht gegen dein verlinktes Material.

    nachtfeuer schrieb:

    Na klar, man kann bei dem Skript annehmen, dass in der Vorlesung und in Tutorial-Seminaren auch Debuggersessions gemacht werden, um den Code genauer einzuordnen und zu verstehen, da hast du schon recht.

    Wie auch immer: Als einziges Lehrmaterial ist das Material völlig ungeeignet. Es bringt Anfängern Low-Level-Gedöns schlecht bei, und die glauben dann wohl noch, dass "richtiges C++" so aussähe. Es enthält Fehler. Es macht deutlich, dass der Autor C++ nicht verstanden hat (siehe Folie 116). Sorry, da hat ein frisch gebackener Doktor, der sich hauptsächlich mit angewandter Mathematik zu beschäftigen scheint, aufgedrückt bekommen, Studenten C++ beizubringen, obwohl er es selbst nicht kann. Natürlich gibt es besseres Material zum Lernen von C++. Das ist gar keine Frage!

    nachtfeuer schrieb:

    Eine Zeichenkette sieht im Hexcode nicht viel anderes aus in verschiedenen Programmiersprachen, meistens sieht sie so oder so ähnlich aus:

    1E5B:0200  47 75 74 65 6E 20 4D 6F-72 67 65 6E 20 57 65 6C     Guten Morgen Wel
    1E5B:0210  74 21 20 41 75 73 67 65-73 63 68 6c 61 66 65 6e 3f  t!
    

    Relevanz?

    nachtfeuer schrieb:

    Operatorüberladung finde ich gut am Beispiel mit <<, aber dazu müsste man jetzt auch erstmal Shifts verstehen. Allerdings finde ich den Begriff etwas, na sagen wir mal, "technisch überhöht", ..aber ein besser Begriff fällt mir auf die Schnelle jetzt auch nicht ein, Multimeaning, Autosense, ...ambiguousi..das hat aber echt was von künstlicher Intelligenz. Wenn das jetzt Sprachprogramme genausogut könnten, wie der C++ Compiler...Ball...Blatt...ja, ich weiß was gemeint ist...;)

    WTF?!



  • Ist nachtfeuer Patrick Henning? 🤡



  • krümelkacker schrieb:

    Das alles spricht gegen dein verlinktes Material.

    Nicht wirklich.
    Das spricht jetzt eher dafür, wie oberflächlich du an diese Sache herangehst.
    Sich Einzelheiten außerhalb des Zusammenhangs herauspicken und dann im Kreis herumhüppen und rufen, "das ist kein C++, das ist kein C++, das ist blöder halbgarer low-level-scheiß", kann ich auch. Das wirkt auf mich aber kaum seriös, eher religiös. Da macht dann eine Diskussion auch keinen Sinn mehr, so ganz außerhalb der gegebenen Zusammenhänge.]



  • Vielleicht weißt du ja auch einfach nicht, wie man es hätte besser machen können. Schau mal in das Buch "Accelerated C++". Im Vorwort wird genau erklärt, warum was in welcher Reihenfolge drankommt. Da geht es um Produktivität & schnelle Erfolge, die du die Anfänger ja gerne erleben lassen möchtest. Das von dir verlinkte Material entspricht dem Gegenteil dieser Strategie, ist nicht selbsterklärend, zeigt Code welcher kein gültiges C++ ist (es gibt in C++ keine VLAs!), enthält andere Falschaussagen wie "int: Ganzzahl, 2 Bytes", zeigt die Verwendung von new[] ohne eine Spur von delete[], enthält ein sinnfreies Beispiel mit falschen Erklärungen/Schlussfolgerungen (siehe Folie 116). Das reicht mMn vollkommen aus, von dem Material abzuraten; denn es lässt stark an der Kompetenz des Autors in Sachen C++ zweifeln. Da muss ich nicht noch mehr Ungereimtheiten suchen.



  • Oh, an der Uni wollte ich Mathe-Info studieren. Ich hoffe ich muss mir so eine Vorlesung nicht anhören.
    Mit dem Skript würde ich definitiv nicht zu Hause lernen und das auch nicht grad empfehlen.



  • Für absolute Anfänger finde ich als Einstieg z.B.

    http://www.amazon.de/C++-Programmieren-mit-einfachen-Beispielen/dp/3827247705

    ganz gut.



  • Fl0 schrieb:

    Oh, an der Uni wollte ich Mathe-Info studieren. Ich hoffe ich muss mir so eine Vorlesung nicht anhören.
    Mit dem Skript würde ich definitiv nicht zu Hause lernen und das auch nicht grad empfehlen.

    Du wirst an so ziemlich jeder Uni noch viel schlechtere Vorlesungen in Kauf nehmen müssen.


Anmelden zum Antworten