Bücher "Der C++ Programmierer" VS "C++ in 21 Tagen" und C++ Standart



  • Hallo liebe Gemeinde.

    Ich wurde schon von ein paar Leuten, u. A. von SeppJ, daraufhin gewiesen, dass mein Programmierstil nicht dem C++ Standard entspricht.

    SeppJ formulierte es so:

    "Dein Stil ist übrigens tatsächlich das berüchtigte "C mit cout", welches in schlechten Büchern und von schlechten Dozenten als C++ verkauft wird."

    Mein Problem ist einfach, dass mir momentan nur das Buch "C++ in 21 Tagen" vorliegt.

    Zumindest habe ich folgenden Quellcode hinbekommen:

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    float Add(float x, float y) // Addition
    {
    	cout << endl;
    	cout << "Funktion Addition!" << endl;
    	cout << " x + y = z " << endl;
    	cout << endl;
    	return (x+y);
    }
    float Sub(float x, float y) // Subtraktion
    {
    	cout << endl;
    	cout << "Funktion Subtraktion!" << endl;
    	cout << " x - y = z " << endl;
    	cout << endl;
    	return (x-y);
    }
    float Mul(float x, float y) //Multiplikation
    {
    	cout << endl;
    	cout << "Funktion Multiplikation!" << endl;
    	cout << " x*y = z " << endl;
    	cout << endl;
    	return (x*y);
    }
    float Div(float x, float y) //Division
    {
    	cout << endl;
    	cout << "Funktion Division!" << endl;
    	cout << "x / y = z!" << endl;
    	float z = x/y;
    	cout << endl;
    	return (z);
    }
    float Wur(float x) // Wurzel
    {
    	cout << endl;
    	cout << "Funktion Wurzel!" << endl;
    	return (sqrt(x));
    }
    float Pot(float x, float y) // Potenz
    {
    	cout << endl;
    	cout << "Funktion Potenz!" << endl;
    	return (pow(x,y));
    }
    
    int main()
    {
    	cout << "Einsatz von Variablen!" << endl;
    	cout << "Wie gross waren gleich wieder die einzelnen Datentypen?" << endl;
    	cout << endl;
    	cout << "Greosse eines int:\t			"<< sizeof(int)			<<" Bytes.!" << endl;
    	cout << "Groesse eines short int:\t\t	"<< sizeof(short int)	<<" Bytes.!" << endl;
    	cout << "Groesse eines long int:\t\t\t	"<< sizeof(long int)	<<" Bytes.!" << endl;
    	cout << "Groesse eines char:\t\t		"<< sizeof(char)		<<" Bytes.!" << endl;
    	cout << "Groesse eines float:\t\t		"<< sizeof(float)		<<" Bytes.!" << endl;
    	cout << "Groesse eines double:\t\t		"<< sizeof(double)		<<" Bytes.!" << endl;
    	cout << "Groesse eines bool:\t\t		"<< sizeof(bool)		<<" Bytes.!" << endl;
    	cout << endl;
    	float a,b,c;
    	cout << "Nun wird gerechnet!" << endl;
    	cout << "Zwei Zahlen bitte!" << endl;
    	cin  >> a;
    	cin  >> b;
    	c=Add(a,b); // Aufruf der Funktion Addition
    	cout << "Nach Addition ist c = " << c << endl;
    	c=Sub(a,b); // Aufruf der Funktion Subtraktion
    	cout << "Nach Subtraktion ist c = " << c << endl;
    	c=Mul(a,b); // Aufruf der Funktion Multiplikation
    	cout << "Nach Multiplikation ist c = " << c << endl;
    	c=Div(a,b); // Aufruf der Funktion Division
    	cout << "Nach Division ist c = " << c << endl;
    	c=Wur(a); // Aufruf der Funktion Wurzel
    	cout << "Nach Wurzel ist c = " << c << endl;
    	c=Pot(a,b); // Aufruf der Funktion Potenz
    	cout << "Nach Potenz ist c = " << c << endl;
    	cout << endl;
    
    	return 0;
    }
    

    Mein Dozent pflegt folgenden Programmierstil:

    #include "Zufallszahl.h" 
    #include <time.h>													//Header-Datei für time bei srand
    #include <stdlib.h>													//Header-Datei für rand und srand
    #include <iostream>													//Header-Datei für "cin" und "cout"
    using namespace std;
    
    int main(void)
    	{
    		int zahl, einlesen;											//Variablen "Zahl" und "Einlesen" als Integer(da Zahlen) deklarieren
    		int versuche;												//Versuche ist auch Integer da die Versuche gezählt werden
    
    		srand((unsigned)time(NULL));
    		zahl=rand();												//Zahl über Zufallsgenerator erzeugt
    		zahl=zahl%1000+1;											//"rand() erzeugt eine Zufallszahl zwischen 2^0 und 2^15, deswegen 
    																	//%1000+1; %=Modulo -> keine Kommazahlen; 0 bis 1000
    
    		cout<<"Zufallszahl zwischen 1 und 1000 eingeben";
    		cin>>einlesen;
    
    		for(versuche=0; zahl!=einlesen; versuche++)					//Versuche muss mit =0 initialisiert werden
    		{
    				if( einlesen<zahl)
    					{
    						cout<<"Eingebene Zahl ist zu klein!";
    						cout<<"Erneute eingabe";
    						cin>> einlesen;
    					}
    
    				else if (einlesen>zahl)
    					{
    						cout<<"Eingebene Zahl ist zu gross!";
    						cout<<"Erneute eingabe!";
    						cin>> einlesen;
    					}
    
    				else (einlesen==zahl)
    				{
    					if(versuche<10)
    					{
    						cout<<"Weniger als 10 Versuche, Glueck gehabt/n/n";
    						cout<<"Anzahl der Versuche:/n/n"<<versuche<<endl;
    					}
    					else if(versuche==10)
    					{
    
    							cout<<"Prima, 10 Versuche, sie sind ueberlegt an das Problem herangegangen/n/n";
    					}		cout<<"Anzahl der Versuche:/n/n"<<versuche<<endl;
    
    					else (versuche>10)
    					}
    						cout<<"Mehr als 10 Versuche, sie haben mehr oder weniger im Nebel gestochert/n/n";
    						cout<<"Anzahl der Versuche:/n/n"<<versuche<<endl;
    
    					}
    				}
    		}
    		return 0;
    }
    

    Nun zu meiner Frage:

    Ist die Investition in das Buch "Der C++ Programmierer" gut? Ist das Buch wirklich besser als das Buch "C++ in 21 Tagen"? Was denkt ihr darüber, wenn mein Dozent es mir empfohlen hat? Weil ich dachte, dass das Buch "C++ in 21 Tagen" zum Einstieg in die Programmiersprache C++ für Anfänger gut ist.

    Herr Calo habe ich schon eine E-Mail geschrieben, dass ich ihm das Buch abkaufe, das er anscheinend nicht mehr braucht.

    Vielen Dank im Voraus für die Antworten.

    Gruß

    Max



  • Du weisst, das das nur für "deinen" Rechner gilt:

    cout << "Wie gross waren gleich wieder die einzelnen Datentypen?" << endl;
    

    Auf anderen Rechnern können da durchaus andere Ergebnisse heraus kommen.
    int kann z.B. 16, 32, 64bit oder exotischen Systemen noch andere Ergebnisse zeigen.



  • Nachtrag: entweder dir sind Tipfehler beim Quelltext des Dozenten unterlaufen oder hiess die Aufgabe: verbessern sie den Quelltext 😕



  • Nein, weder sind mir Tippfehler unterlaufen noch hieß die Aufgabe "Verbessern Sie den Quellcode".

    Damit wollte ich eigentlich "nur" zeigen, wie mein Dozent "drauf ist", sprich, wie er programmiert.

    Gruß



  • Dann versuch doch den Quelltext durch einen Compiler zu bekommen 😮

    Wenn du keinen Compiler findest, schreib mal was du an dem Quelltext ändern willst. Sonst schreib mal das Modell des Compilers.

    Zufälle und C++ da findet man ja so Einiges:
    http://www.cplusplus.com/reference/clibrary/cstdlib/rand/

    http://www.c-plusplus.net/forum/172876-full

    http://www.cplusplus.com/reference/algorithm/random_shuffle/

    nur das als kleine Auswahl.



  • Ist folgender Quellcode C++ Standart??

    //Name:		Maximilian Lesti
    //Datum:	28.04.2012
    //Thema:	Verwendung von Typedef
    
    #include <iostream>
    using namespace std;
    
    typedef int I;
    
    int main()
    {
    	I a,b,c;
    	cout << "Addition von Ganzzahlen!"<< endl;
    	cout << "Zwei Zahlen bitte!" << endl;
    	cin  >> a >> b;
    	c=a+b;
    	cout << "c nach Addition: " << c << endl;
    
    	return 0;
    }
    

    In der Zwischenzeit versuche ich den anderen Code zu compilieren/debuggen.

    Habe gerade eingesehen, dass ich mir doch das Buch "Der C++ Programmierer" von Herrn Calo kaufe. Wird wohl eine gute Investition sein.

    Weil bei dem Quellcode "Zufallsraten" fehlt die Header-Datei "Zufallszahl.h".



  • Sieht erstmal ganz gut aus, abgesehen von ein paar Dingen, die so nicht üblich sind.

    P.S.: Es heißt übrigens "Standard". Was du die ganze Zeit beschreibst, ist die "Art zu stehen". 😉



  • 314159265358979 schrieb:

    Sieht erstmal ganz gut aus, abgesehen von ein paar Dingen, die so nicht üblich sind.

    P.S.: Es heißt übrigens "Standard". Was du die ganze Zeit beschreibst, ist die "Art zu stehen". 😉

    Welche Dinge sind denn nicht so üblich??



  • f.-th. schrieb:

    Dann versuch doch den Quelltext durch einen Compiler zu bekommen 😮

    Hast du das gesehen oder hast du auch einfach einen Compiler genommen? Ohne Compiler habe ich es nicht gesehen 😃



  • #include <iostream>
    using namespace std;
    
    typedef int I; // Dass I ein schlechter Name für ein typedef ist, lass ich mal außen vor, schließlich wolltest du ja nur typedef ausprobieren.
    
    int main()
    {
    	I a,b,c; // Du brauchst du die Variablen hier doch alle noch nicht.
    	cout << "Addition von Ganzzahlen!"<< endl /* statt endl benutzt mal üblicherweise \n, außer man weiß was endl bedeutet und will auch wirklich endl. */;
    	cout << "Zwei Zahlen bitte!" << endl;
    	cin  >> a >> b;
    	c=a+b; // Wozu überhaupt eine Zwischenvariable?
    	cout << "c nach Addition: " << c << endl;
    
    	return 0; // main gibt automatisch 0 zurück, wenn kein return vorhanden ist. Das return ist hier unnötig.
    }
    

    Sähe dann so aus:

    #include <iostream>
    using namespace std;
    
    typedef int I;
    
    int main()
    {
        cout << "Addition von Ganzzahlen!\n"
             << "Zwei Zahlen bitte!\n";
    
        I a, b;
        cin >> a >> b;
    
        cout << "Die Summe der Zahlen lautet: " << a + b << '\n';
    }
    


  • Hier habt mich überredet, ein besseres Buch zu besorgen.

    Ich hoffe nur, dass ich es dann auch kapiere.



  • Teilweise gesehen - habs dann zu Kontrolle durch einen Compiler geschickt.

    Ein oder zwei Sachen hatte ich erwartet aber nicht so viel.

    "Zufallszahl.h" brauchst du gar nicht -> auskommentieren oder löschen und gut ist.
    Auf den Zufall hab ich nur hingewiesen, weil extra nach C++ gefragt wurde. Da wird zwar der C-Stil ( Header )genutzt, aber an der Stelle läuft das Programm.

    Dann kann man noch die Quelltextwiederholungen deutlich reduzieren.
    Daraus folgend kann man noch einige Klammer weglassen - muss man aber nicht.
    Die Schleife würde ich auch so nicht lassen.

    Ihr seht schon da würde ich einiges dran schrauben. Andere Programmierer durchaus andere Teile des Quelltextes.



  • Ich muss ehrlich zugeben, dass ich wirklich keine Ahnung davon habe, was Du damit meinst.

    Anscheinend hapert es bei mir schon an den Grundlagen.



  • Wie soll man da die Quelltextwiederholung reduzieren (außer z.B manchmal bei else die Bedingung weg lassen, das einleisen aus den if's herausnehmen) ? Das Programm besteht ja größten Teils aus Ausgaben. Man Könnte natürlich so Dinge machen wie:

    std::array<std::string, 3> meldungen = {"Weniger als 10 Versuche...", "Genau 10 Versuche", "Mehr als 10 Versuche"};
    std::cout << meldungen[(versuche - 10) / std::abs(versuche-10) + 1] << std::endl;
    

    Ob das allerdings guter Stil ist 🤡 😃

    EDIT: Ach da wird ja auch noch jedes mal Anzahl der Versuche ausgegeben.



  • pyhax schrieb:

    Wie soll man da die Quelltextwiederholung reduzieren (außer z.B manchmal bei else die Bedingung weg lassen, das einleisen aus den if's herausnehmen) ? Das Programm besteht ja größten Teils aus Ausgaben.

    Da lässt sich schon ohne großen Aufwand Einiges rausholen:

    #include <ctime>
    #include <cstdlib>
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	srand((unsigned)time(NULL));
    	int zahl = rand() % 1000 + 1;
    	cout<<"Zufallszahl zwischen 1 und 1000 eingeben";
    	int versuche = 1;
    	int einlesen;
    	while((cin >> einlesen) && einlesen != zahl)
    	{
    		cout << "Eingegebene Zahl ist zu " << (einlesen < zahl ? "klein" : "gross") << "!\nErneute Eingabe!";
    		++versuche;
    	}
    
    	if(versuche < 10)
    		cout << "Weniger als 10 Versuche, Glueck gehabt/n/n";
    	else if(versuche == 10)
    		cout << "Prima, 10 Versuche, sie sind ueberlegt an das Problem herangegangen/n/n";
    	else
    		cout << "Mehr als 10 Versuche, sie haben mehr oder weniger im Nebel gestochert/n/n";
    
    	cout<<"Anzahl der Versuche:/n/n"<<versuche<<endl;
    }
    

    Beachte z.B., dass im Originalcode ein if-Konstrukt stand, dessen else-Teil eigentlich hinter die Schleife gehört hätte. Durch Umstrukturieren hab ich jetzt ne geringere Tiefe und somit besser verständlichen Code.



  • Michael hat das ja schon umgesetzt.
    Hier noch eine Variante:

    #include <ctime>                                                    //Header-Datei für time bei srand
    #include <cstdlib>                                                    //Header-Datei für rand und srand
    #include <iostream>                                                    //Header-Datei für "cin" und "cout"
    using namespace std;
    
    int main(void)
    {
        int zahl, einlesen;                                            //Variablen "Zahl" und "Einlesen" als Integer(da Zahlen) deklarieren
        int versuche;                                                //Versuche ist auch Integer da die Versuche gezählt werden
    
        srand((unsigned)time(NULL));
        zahl=rand();                                                //Zahl über Zufallsgenerator erzeugt
        zahl=zahl%1000+1;                                            //"rand() erzeugt eine Zufallszahl zwischen 2^0 und 2^15, deswegen
        //%1000+1; %=Modulo -> keine Kommazahlen; 0 bis 1000
    
        cout<<"Zufallszahl zwischen 1 und 1000 eingeben";
        cin>>einlesen;
    
        for(versuche=0; zahl!=einlesen; versuche++)                    //Versuche muss mit =0 initialisiert werden
        {
            if( einlesen<zahl)
                cout<<"Eingebene Zahl ist zu klein!";
            else if(einlesen>zahl)
                cout<<"Eingebene Zahl ist zu gross!";
    
            cout<<"Erneute eingabe!";
            cin>> einlesen;
        }
    
        if(versuche<10)
            cout<<"Weniger als 10 Versuche, Glueck gehabt/n/n";
        else if(versuche==10)
            cout<<"Prima, 10 Versuche, sie sind ueberlegt an das Problem herangegangen/n/n";
        else 	// (versuche>10)
            cout<<"Mehr als 10 Versuche, sie haben mehr oder weniger im Nebel gestochert/n/n";
    
        cout<<"Anzahl der Versuche:/n/n"<<versuche<<endl;
    }
    


  • Wat will man auch auf so etwas reagieren:

    Wer schnell und komprimiert die Grundlagen von C++ lernen will, ohne durch Nebensächliches oder unterhaltende Elemente abgelenkt zu werden, liegt mit diesem Buch richtig. Das Buch vermittelt hierzu das nötige Basiswissen für weiter gehende C++-Programmiervorhaben. Beginnend mit Grundlagen wie Ein- und Ausgabe, dem Umgang mit Variablen und Arrays sowie arithmetischen Operationen über Schleifen und Verzweigungen bis hin zu den berühmt-berüchtigten Zeigern erfährt der Leser auch, was es mit der objektorientierten Programmierung, mit Klassen, Objekten und Methoden auf sich hat. Den Abschluss macht ein Kapitel über die Fehlerbehandlung. Weitergehende Details wie die Programmierung grafischer Oberflächen beispielsweise werden nicht behandelt. Alle Kapitel werden durch Testfragen abgeschlossen. Diese Fragen sind in drei Schwierigkeitsgrade eingeteilt. Positiv ist, dass das Buch vollkommen Betriebssystem-unabhängig abgefasst ist. PC-WELT 2011

    🙄


Anmelden zum Antworten