(Besonderes) C++ Buch



  • Hi, wie der Titel schon sagt, such ich ein C++ Buch. Doch bevor hier jemand mit Links in den Bücher-Thread kommt, muss ich sagen, dass ich kein Buch suche, das die Grundlagen so "langweilig" erklärt, denn ich hab mir bereits ein wenig C mit einem Onlinetutorial beigebracht und dann durch ein größeres Opensourceprogramm mir C++ etwas angeeignet. Das mir einiges an Grundlagen deshalb fehlt ist mir klar; trotzdem will ich ungern Sachen wie Input/Output, Variablen usw. noch mal wiederholen, da es einfach keinen Reiz hat, weil ich es schon kenne (und kann). Trotzdem will ich natürlich die Grundlagen vervollständigen, deshalb dachte ich an ein Buch, dass C++ in einer Art Challenge vermittelt: Also eine Erklärung zu einem Thema und dann muss der Leser selbst Aufgaben lösen (in der Art, in der sie markuswenczel immer postet), um zu beweisen, dass er es verstanden hat und kann. In meinem Fall wäre das 1. der Reiz, die Basics noch mal intensiv zu wiederholen und ich mir so 2. ein solideres C++ Wissen aneigne.
    Kennt jemand ein solches Buch und kann dies empfehlen?


  • Mod

    Warum nicht einfach die entsprechenden Kapitel überspringen? Ein C++ Grundlagenbuch hat gerne 1000-1500 Seiten (wirklich nur Grundlagen die nötig sind um höhere Literatur zu verstehen), ich kann mir nicht vorstellen, dass du davon schon einen so erheblichen Teil kennst, dass sich so ein Buch nicht lohnen würde.

    Wenn du eine Herausforderung suchst: Zeig mal was du kannst. Schreibe ein Programm, welches beliebig viele Zeichenketten einliest, bis eine leere Zeichenkette eingegeben wird. Danach gibt es alle zuvor gespeicherten Zeichenketten zeichenweise untereinander aus.

    Beispieleingabe:

    asdfg
    qwert yuio
    z x c v
    

    Anschließende Ausgabe nach Eingabe einer leeren Zeile:

    a
    s
    d
    f
    g
    q
    w
    e
    r
    t
    
    y
    u
    i
    o
    z
    
    x
    
    c
    
    v
    

    Und nicht schummeln! Nötige Lektionen: Grundlegene Ein-/Ausgabe, Kontrollstrukturen, Zeichenketten, einfache komplexe Datenstrukturen.

    Und wie schätzt du die Schwierigkeit dieser Aufgabe ein? Zu leicht? Dann Sortiere die Zeichen vorher, und zwar alle Zeichen aller Zeichenketten. Immer noch zu leicht? Sortier lexikographisch (also A und a kommen von B und b).




  • Mod

    cooky451 schrieb:

    http://www.cplusplus.com/reference/clibrary/cstdlib/qsort/ 😃

    Das muss man 1. erst einmal kennen (das wollte ich testen) und 2. ist das nicht die optimale C++-Lösung zum Sortieren (das wollte ich auch testen) und ich bin daher erstaunt, dass du dieses vorschlägst.



  • Naja, mein Problem ist ja, dass ich ein Teil der Grundlagen bereits kenne. Aber eben ziemlich wirr, d.h. überall Lücken. Aber es macht (mir) keinen Spaß, Themen durchzuarbeiten, die ich als langweilig empfinde, weil ich sie schon kann - aber ich muss sie halt durcharbeiten, damit ich die Lücken füllen kann. Deswegen will ich auch eigentlich keine Kapitel überspringen.
    Ich habe auch eigentlich von einem Anfängerbuch gesprochen, aber eben eins, dass das jeweilige Themengebiet mit solchen Aufgabenstellungen abrundet. Dann kann ich das Kapitel überspringen bzw sofort zu den Aufgaben gehen. Falls ich diese beantworten kann, nächstes Thema; falls nicht, noch mal intensiv wiederholen.

    Genau solche Aufgaben (in etwa) hab ich mir vorgestellt!
    Ich denke den ersten Teil der Aufgabe habe ich gelöst? (Das mit dem sortieren muss ich mir noch mal anschauen) Aber ich denke auch, dass man am Code erkennen kann, dass ich mir das alles selbst beigebracht habe und deshalb auch viel Unsinn dabei ist.

    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    int main( int argc, char **argv )
    {
    	vector<string> v;
    	string :: iterator it;
    
    	while( true )
    	{
    		string s;
    
    		cout << "Eingabe: ";
    
    		getline( cin, s );
    
    		v.push_back( s );
    
    		cout << "Zeichenkette Nr. " << v.size( ) << endl << endl;
    
    		if( s.empty( ) || s == " " )
    		{
    			cout << "Leere Zeichenkette eingegeben! Ausgabe: " << endl;
    
    			for( unsigned int i = 0; i != v.size( ); ++i )
    			{
    				for( it = v.at( i ).begin( ); it != v.at( i ).end( ); ++it )
    				{
    					cout << *it << endl;
    				}
    			}
    		}
    	}
    
    	system( "PAUSE" );
    
    	return 0;
    }
    

  • Mod

    Das sieht ja richtig gut aus. Irgendwie hatte ich so etwas erwartet wie von den anderen selbsternannten Fortgeschrittenen, die ein schlechtes C++-Buch halb überflogen haben und dann grauenhaften Code schreiben. Der einzige Fehler ist, dass es bei mir nicht compiliert, da die cstdlib für system nicht eingebunden wurde. Für ein system, dass übrigens ohnehin niemals erreicht werden kann.

    Hmm, da muss was schwierigeres her, muss nachdenken.



  • Dann schreibe in Program, welches aus einem Eingabetext alle URLs extrahiert, in einem std::vector speichert, anschließend sortiert und ausgibt.

    Dabei ist alles eine URL, was mit http:// oder www. oder in Kombination http://www. beginnt. Das URL-Ende wird durch ein Zeichen eingeleitet, das keine Zahl und kein Zeichen ist, also z.B. ein Leerzeichen.



  • Ich denke, wir müssen die erlaubten Zeichen doch noch mal erweitern:
    a-Z, 0-9, Punkt(.), Semikolon(;), Fragezeichen(?), Slash(/), Bindestrich(-), Kaufmännisches Und(&), Gleichheitszeichen(=) sowie #

    Na ja, und das soll dann auch reichen. Ist ja nur eine Übung.



  • Also den Eindruck wollte ich nicht erwecken, dass ich mich für einen fortgeschrittenen Programmierer halte, da ich eben weiß, dass ich große Lücken habe.

    Danke für das Lob! 🙂
    Das mit dem system ist mir auch aufgefallen.. allerdings gehört das bei mir schon fast zu int main() wie das return 0; 😃
    Jedoch compilierts bei mir ohne cstdlib :o Benutze Visual C++ 2010 Express



  • supermix schrieb:

    Jedoch compilierts bei mir ohne cstdlib :o Benutze Visual C++ 2010 Express

    Der Grund ist:
    Du inkludierst iostream, das wiederum inkludiert istream, das inkludiert ostream, das inkludiert ios, das inkludiert xlocnum und das inkludiert schliesslich:
    climits
    cmath
    cstdio
    cstdlib
    streambuf

    😃

    P.S.: Wenn du kein Anfängerbuch lesen möchtest, dann lies dir doch "The C++ Programming Language" vom Stuppi durch. Einem absoluten Anfänger würde man das Buch sicherlich niemals empfehlen, aber jemandem der schon einige Grundkenntnisse besitzt sicherlich.
    Nach jedem Kapitel werden Aufgaben gestellt, die es teilweise auch in sich haben. Manchmal muss man nur Fehler finden, bestehenden code korrigieren oder ähnliches. Aber es werden auch wesentlich anspruchsvollere Aufgaben gestellt, für die man schon ne Weile braucht und die nicht so trivial sind.

    Kleines Beispiel (Chapter 10 - Classes):

    11. (*3) Define a class for analyzing, storing, evaluating, and printing simple arithmetic expressions consisting of integer constants and the operators +, ,
    *, and /. The public interface should look like this:
    class Expr {
    // ...
    public:
    Expr (char *);
    int eval();
    void print();
    };

    The string argument for the constructor Expr::Expr() is the expression. The function Expr::eval() returns the value of the expression, and Expr::print() prints a representation of the expression on cout. A program might look like this:
    Expr x("123/4+123*43");
    cout << "x = " << x.eval() << "\ n ";
    x.print();
    Define class Expr twice: once using a linked list of nodes as the representation and once using a character string as the representation. Experiment with different ways of printing the expression:
    fully parenthesized, postfix notation, assembly code, etc.





  • SeppJ schrieb:

    cooky451 schrieb:

    http://www.cplusplus.com/reference/clibrary/cstdlib/qsort/ 😃

    Das muss man 1. erst einmal kennen (das wollte ich testen) und 2. ist das nicht die optimale C++-Lösung zum Sortieren (das wollte ich auch testen) und ich bin daher erstaunt, dass du dieses vorschlägst.

    Hm.. vielleicht habe ich mich um diese Uhrzeit einfach im Forum geirrt, ich meine natürlich sort. 😉



  • inter2k3 schrieb:

    supermix schrieb:

    Jedoch compilierts bei mir ohne cstdlib :o Benutze Visual C++ 2010 Express

    Der Grund ist:
    Du inkludierst iostream, das wiederum inkludiert istream, das inkludiert ostream, das inkludiert ios, das inkludiert xlocnum und das inkludiert schliesslich:
    climits
    cmath
    cstdio
    cstdlib
    streambuf

    😃

    Aber SeppJ hat sicher den Code per Copy&Past übernommen und compiliert, d.h beim sollte doch der selbe Vorgang stattfinden, oder? Und falls er iostream übersehen hat, könnte er doch nicht einmal cout/cin nutzen, oder?

    inter2k3 schrieb:

    P.S.: Wenn du kein Anfängerbuch lesen möchtest, dann lies dir doch "The C++ Programming Language" vom Stuppi durch. Einem absoluten Anfänger würde man das Buch sicherlich niemals empfehlen, aber jemandem der schon einige Grundkenntnisse besitzt sicherlich.
    Nach jedem Kapitel werden Aufgaben gestellt, die es teilweise auch in sich haben. Manchmal muss man nur Fehler finden, bestehenden code korrigieren oder ähnliches. Aber es werden auch wesentlich anspruchsvollere Aufgaben gestellt, für die man schon ne Weile braucht und die nicht so trivial sind.

    Kleines Beispiel (Chapter 10 - Classes):

    11. (*3) Define a class for analyzing, storing, evaluating, and printing simple arithmetic expressions consisting of integer constants and the operators +, ,
    *, and /. The public interface should look like this:
    class Expr {
    // ...
    public:
    Expr (char *);
    int eval();
    void print();
    };

    The string argument for the constructor Expr::Expr() is the expression. The function Expr::eval() returns the value of the expression, and Expr::print() prints a representation of the expression on cout. A program might look like this:
    Expr x("123/4+123*43");
    cout << "x = " << x.eval() << "\ n ";
    x.print();
    Define class Expr twice: once using a linked list of nodes as the representation and once using a character string as the representation. Experiment with different ways of printing the expression:
    fully parenthesized, postfix notation, assembly code, etc.

    Also ich muss sagen, dass ich passen muss. Ich verstehe die Aufgabenstellung überhaupt nicht, was aber sicher zu einem Teil an dem Englisch nicht. Nicht dass ich kein Englisch kann, aber wenn einem etwas unklar ist und dann noch mal evt. unbekannte Begriffe dazukommen, dann hört es bei mir auf 😛

    SeppJ schrieb:

    Hmm, da muss was schwierigeres her, muss nachdenken.

    Also es soll nun eigentlich nicht so werden, dass ihr mir hier Aufgaben bringt und ich löse sie solange, bis mein Wissen dafür nicht mehr ausreicht, weil dann weiß ich immer noch nicht, welches Buch 😉
    Wenn euch das aber hilft, mich einzuschätzen, dann bin ich gern bereit, an meine Grenzen geführt zu werden 🙂

    @ghjghj: Wie soll man das verstehen?
    Eine URL ist alles, was mit den Ziffern A-Z, 0-9, den Zeichen: ., ;, ?, /, =, &, - und # endet?

    @Mike634: Wenn du dir meinen Anfangspost durchliest, dann wirst du sicher verstehen, was ich mit "besonders" meinte 😉 Nämlich ein (Anfänger-)Buch, dass das jeweilige Kapitel mit Aufgaben abschließt. So in etwa wie inter2k3 es vorgeschlagen hat!

    @alle: noch mal: ich will nicht den Eindruck erwecken, dass ich mich selbst für einen fortgeschrittenen Programmierer halte! Das bin ich bei weitem nicht und das weiß ich auch. Falls dieser Eindruck entstanden ist, tut es mir natürlich leid! 🙂



  • supermix schrieb:

    inter2k3 schrieb:

    supermix schrieb:

    Jedoch compilierts bei mir ohne cstdlib :o Benutze Visual C++ 2010 Express

    Der Grund ist:
    Du inkludierst iostream, das wiederum inkludiert istream, das inkludiert ostream, das inkludiert ios, das inkludiert xlocnum und das inkludiert schliesslich:
    climits
    cmath
    cstdio
    cstdlib
    streambuf

    😃

    Aber SeppJ hat sicher den Code per Copy&Past übernommen und compiliert, d.h beim sollte doch der selbe Vorgang stattfinden, oder? Und falls er iostream übersehen hat, könnte er doch nicht einmal cout/cin nutzen, oder?

    Er hat vermutlich einen anderen Compiler genutzt als du - ob und wie sich die System-Header gegenseitig einbinden, ist durch den Standard nicht festgelegt. Also darfst du dich auch nicht darauf verlassen, daß ein bestimmter Header indirekt eingebunden wird.



  • system sollte doch allgemein vermieden werden, nicht?



  • Zum Thema Buch nochmals:

    Das von Mike634 zuerst verlinkte Buch "Effektiv C++ programmieren" von Scott Meyers würde ich dir erstmal nicht empfehlen. Dies ist eher eine empfehlenswerte Lektüre, wenn du bereits ein Grundlagenbuch gelesen hast und mit der Sprach vertraut bist.

    Allerdings ist das zweite verlinkte Buch "vermutlich" genau das, was ich dir auch empfohlen habe. Ich kenne die deutsche Ausgabe zwar nicht, aber ein kurzer Blick in das Inhaltsverzeichnss zeigt, dass es zuminest genauso strukturiert ist die die englische Ausgabe. Ebenfalls scheinen wohl alle Kapitel mit den Kernaussagen und Übungen zu enden.

    Und du hast nicht das Problem, dass dir die englische Sprache das Verständniss erschwert. (Tip: versuch später trotzdem mal englische Literatur zu lesen. Meist ist es garnicht so schwierig und es ist nunmal so, dass die meiste Fachliteratur in englischer Sprache verfasst wird - daher hilfreich).



  • Vielleicht wäre "Der C++ Programmierer" von Ulrich Breymann etwas für Dich.

    Nach Aussage des Verlags/Autors ein Praxisbuch für Einsteiger und Profis.
    Es enthält u.a. 85 Übungsaufgaben nebst Lösungen.

    s. auch http://www.cppbuch.de/



  • Apropos C++-Buch. Kennt jemand ein gutes Buch, wie das von Bjarne Stroustrup (Die C++-Programmiersprache) mit C++0x?

    Hätte gerne mit drin, z.B. die neuen Lambda-Ausdrücke usw.

    Zur Zeit sind die Bücher über C++0x ja ziemlich rar.



  • Na das ist ja nicht mal standardisiert 😉 . Sollen sich die Autoren an den WD halten?



  • EOutOfResources schrieb:

    Na das ist ja nicht mal standardisiert 😉 . Sollen sich die Autoren an den WD halten?

    Der Final Draft ist schon seit März fertig und liegt gegenwärtig der ISO zur Standardisierung vor.

    Das heißt, alle Sprachstandards sind bereits fertig. Auch bei anderen Sprachen, wie Java oder C# sind die Bücher lange vor der endgültigen Verabschiedung erschienen.

    Es kommt sogar noch dicker. Compilerhersteller, wie Microsoft haben bereits Produkte draussen, die C++0x teilweise unterstützen. Da staunste, wat!


Log in to reply