Frage zum Buch "C++ Primer" (Lösungen der Übungsaufgaben)



  • Hallo alle miteinander!

    Ich würde furchtbar gerne C++ lernen und habe momentan nur die Möglichkeit, dies mit Hilfe von Büchern (und eventuell Tutorials) zu erreichen.
    Ich habe mich nun für das Buch "C++ Primer" (4. Auflage; deutsche Übersetzung) entschieden, da ich im Internet oft gelesen habe, dass es "zur Zeit die beste C++-Bibel auf dem Markt" sei.

    Seit 2 Tagen arbeite ich nun damit und ich bin gerade auf Seite 38 angekommen.
    In dem Buch gibt es zum Abschluss der einzelnen Kapitel immer einige Übungsaufgaben, die es zu lösen gilt, allerdings sind weder im Buch, noch auf der angegeben Website, die Lösungen zu den Aufgaben zu finden. Mit Google bin ich leider auch nicht fündig geworden...

    Bislang habe ich noch alles hinbekommen, aber nun hänge ich bei einer Aufgabe fest und habe keine Ahnung, wie ich diese lösen soll. Dadurch werde ich nun gehindert, im Buch weiter zu arbeiten. 😕
    Bei manchen Aufgaben wird man auch einfach nur vor eine Frage gestellt, die man sich anscheinend selbst beantworten soll, jedoch wird mir nicht erklährt, ob meine Antwort auf die Frage nun die richtige ist oder nicht... Und so bleiben mir letztendlich dauernd irgendwelche Fragen offen, was die ganze Motivation etwas drosselt.

    Das Buch macht auf mich irgendwie ein bisschen den Eindruck, als wäre es als Unterrichtsbuch für Informatikstudenten gedacht, die ihre Rückfragen direkt an den unterrichtenden Professor stellen sollen (bzw. dass dieser dann auch die gelösten Übungsaufgaben auf ihre Richtigkeit überprüft).
    Soweit ich informiert bin, sollte das Buch aber auch zum vollständig selbstständigen Lernen der Sprache genutzt werden können...

    Weiß jemand von euch zufällig, ob/wo man die Lösungen zu den Aufgaben finden kann??



  • Frag doch einfach hier im Forum, wenn du eine Aufgabe nicht gelöst bekommst.



  • Hallo,
    zumindest für die dritte Ausgabe gibt es ein Answer Book: http://www.amazon.ca/Primer-Answer-Book-Clovis-Tondo/dp/0201309939

    Wenn du konkrete Fragen hast, kannst du diese natürlich auch hier im Forum stellen.



  • hmm, also es ist Toll das du versucht alle Übungsbeispiele zu lösen, nur kann man Fachliteratur nicht wie einen Roman von Anfang bis Ende lesen! Außerdem ist es Sinnvoll wenn du dir das ganze Buch einma durchliest, um mal einen Überblick zu bekommen und dann immer wieder und dabei tiefer in die Materie gehst.

    hth Joe



  • Hallo,

    erstmal sorry, dass ich mich jetzt erst wieder melde... Ich war letzte Woche leider etwas gestresst und hatte nach der Arbeit immer nicht mehr die Zeit dazu gefunden.

    Michael E. schrieb:

    Frag doch einfach hier im Forum, wenn du eine Aufgabe nicht gelöst bekommst.

    Das Angebot nehme ich gerne entgegen...
    Also in dem letzten Kapitel wurden kurz die while- und die *for-*Anweisungen behandelt...
    Als Beispiele wurden folgende Codes gezeigt, die jeweils ein kleines Programm erstellen, dass die Zahlen von 1 bis einschließlich 10 addiert:

    //while-Anweisung:
    
    #include <iostream>
    int main ()
    {
    int sum = 0, val = 1;
    while (val <= 10) {
    sum += val;
    ++val;
    }
    std::cout << sum << std::endl;
    return 0;
    }
    
    //for-Anweisung:
    
    #include <iostream>
    int main ()
    {
    int sum = 0;
    for (int val =1; val <= 10; ++val)
    sum += val;
    std::cout << sum << std::endl;
    return 0;
    }
    

    Und anhand dieser zwei Beispiele soll man nun insgesamt 5 Übungsaufgaben lösen, wovon ich bislang 4 bewältigen konnte, allerdings hänge ich bei folgender Aufgabe fest (Zitat):

    "Schreiben Sie ein Programm, dass mit Hilfe einer while-Schleife die Zahlen von 10 bis 0 absteigend ausgibt. Schreiben Sie das Programm dann mit einer for-Schleife neu."

    Meiner Ansicht nach wäre der logische Ablauf der, dass man dem Programm den "Startwert" 11 gibt und es dann in einzelnen Schritten jeweils +(-1) zu dem Wert addieren lässt, so dass es jeweils immer die einzelnen Zwischenergebnisse (10, 9, 8, 7, ...) ausgibt. Halt so lange, bis die Rechnung bei dem Ergebnis 0 angekommen ist.
    Nur weiß ich jetzt nicht, wie ich diesen Vorgang in die C++-Sprache übersetzen soll...
    Mit dem, was mir das Buch bis jetzt beigebracht hat, konnte ich zwar ein kleines Programm schreiben, dass die Rechnung durchführt, allerdings hatte es mir nur das letzte Endergebnis (0) ausgegeben. Ich weiß nicht, wie ich es anstellen soll, dass mir auch alle Zwischenergebnisse - also jeder einzelne Rechenschritt - ausgegeben wird...

    Dies ist der Code, den ich zu der Aufgabe bis jetzt erstellt habe:

    #include <iostream>
    int main ()
    {
    int val1 = 11, val2 = -1;
    while (val1 >= 1) {
    val1 += val2;
    }
    std::cout << val1 << std::endl;
    return 0;
    }
    

    Wäre echt super, wenn mir jemand dabei helfen könnte...
    Und sorry, dass ich hier diese Anfängerfragen stelle, aber ich kenne privat leider keine Programmierer, die mir helfen könnten und wüsste auch nicht, an welches andere Forum ich mich wenden sollte.

    Und danke schonmal für alle bisherigen Antworten...



  • naja, um diese aufgabe zu "bewältigen" muss man sich halt überlegen, was in deinem programm mehrmals, und was nur einmal ausgeführt wird...
    einfach: alles was in den geschweiften klammern im

    while(1){
    /*wird mehrmals ausgeführt*/
    }
    //wird wieder nur einmal ausgeführt
    

    bzw

    for(;;){
    /*wird mehrmals ausgeführt*/
    }
    //wird wieder nur einmal ausgeführt
    

    blöcken steht, wird mehrmals ausgeführt, alles andere nicht.

    zweitens: neben dem operator++ sind für ganze zahlen in cpp genauso operator-- zum decrementieren definiert. also statt jedes mal -1 zu addieren, kannst du auch 1 subtrahieren...

    also machst du folgendes:

    #include <iostream>
    
    int main(){
    
    //die for(){}-variante:
    for(int counter=10; counter>=0; counter--){
      std::cout<<counter<<std::endl; //wird jedes mal ausgegeben
    }
    
    std::cout<<std::endl; //wird nur einmal ausgeführt (leerzeile)
    
    //oder mit while:
    int i=10;
    while(i>=0){
     std::cout<<i<<std::endl;
     i--;
    }
    
    return 0;
    }
    

    good luck have fun... 👍



  • Andrey schrieb:

    alles was in den geschweiften klammern im

    while(1){
    /*wird mehrmals ausgeführt*/
    }
    //wird wieder nur einmal ausgeführt
    

    bzw

    for(;;){
    /*wird mehrmals ausgeführt*/
    }
    //wird wieder nur einmal ausgeführt
    

    blöcken steht, wird mehrmals ausgeführt

    Aha, also dass alles in den geschweiften Klammern mehrmals durchgeführt wird, wurde im Buch noch gar nicht erwähnt... Sowas muss man natürlich ertsmal wissen. 🙄
    Also hätte ich bei meinem Code einfach nur die "std::cout"-Zeile noch mit vor die vorletzte geschweifte Klammer setzen müssen (Position 7 und 8 müssen quasi nur den Platz tauschen).

    OK, vielen dank für die Aufklährung...



  • also in den geschweiften klammern der while bzw. for blöcke... nicht irgendwelche "geschweifte klammer"
    das ist wie in mathe:

    ohne klammer:
    5*a+b+c+d=a+a+a+a+a+b+c+d
    ist was anderes als mit klammern:
    5*(a+b+c+d)=a+b+c+d+a+b+c+d+a+b+c+d+a+b+c+d+a+b+c+d
    

    in etwa genauso in cpp:

    for(int i=0; i<5; i++) 
     a();
     b();
     c();
    
    //entschpricht
    a(); a(); a(); a(); a(); b(); c();
    
    for(int i=0; i<5; i++){
     a();
     b();
     c();
    }
    
    //entspricht:
    a(); b(); c(); a(); b(); c(); a(); b(); c(); a(); b(); c(); a(); b(); c();
    

    wobei in cpp die reihenfolge immer eine rolle spielt... kP wie mans noch anschaulicher erklären soll 😃



  • @Droog: hier mal ein kleines Progrämmchen mit for, while, break, if zum Spielen:

    #include <iostream>
    #include <conio.h>
    #include <cmath> 
    using namespace std;
    
    bool isPrim_Brutal( long long kandidat )
    {
       bool prim = true;
       for( long long i=2; i<=kandidat-1; ++i )
       {
          if( kandidat%i == 0 )
          {
             prim = false;
             break;
          }
       }
       return prim;
    }
    
    bool isPrim_Sieb(long long kandidat) 
    {
        long long i = 2;
        if ( !(kandidat%i) ) 
            return false;
        else i=3;
        do
        { 
            if (!(kandidat%i)) 
                return false;
            i+=2;
        } 
        while ( i*i <= kandidat );
        return true;
    } 
    
    int main()
    {
        long long a,b;
        cout << "Zahl1: ";
        cin >> a;
        cout << "Zahl2: ";
        cin >> b;
        for( long long i=a; i<b; ++i )
    //    if( isPrim_Brutal(i) )
        if( isPrim_Sieb(i) )
            cout << i << '\t';  
        cout << endl << "Fertig!" << endl;
        getch();
    }
    


  • Also in der Theorie erscheinen mir diese Übungsaufgaben im Buch extrem simpel, aber bei der Umsetzung hakt's dann doch öfters. 😕

    Ich bin nun bei einer Aufgabe, in der man ein Programm schreiben soll, dass den Benutzer zunächst auffordert, zwei Zahlen einzugeben und das dann die größere der beiden Zahlen wieder ausgibt...

    Nun habe ich dazu eben mal folgenden Code erstellt:

    #include <iostream>
    int main ()
    {
    	std::cout << "Geben Sie zwei Zahlen ein:" << std::endl;
    	int v1, v2;
    	std::cin >> v1 >> v2;
    	int lower, upper;
    	if (v1 <= v2) {
    		v1 = lower;
    		v2 = upper;
    	} else {
    		v2 = lower;
    		v1 = upper;
    	}
    	std::cout << upper << std::endl;
    	return 0;
    }
    

    Aber wenn ich da nun zwei verschiedene Zahlen eingebe, wird mir nicht die größere von beiden ausgegeben, sondern immer "4194304". (?)

    Kann mir jemand sagen, wo mein Fehler liegt?

    P.S. @ Erhard Henkes:
    Vielen dank für deinen Beitrag, aber den Code verstehe ich leider noch nicht ganz... Ich befasse mich erst seit einigen Tagen mit C++.
    Mein "Lehrbuch" hat 1006 Seiten und ich bin erst auf Seite 41 angekommen... Ich habe da also noch einiges vor mir. ^^



  • Schau mal, du willst ja das die größere Zahl in upper steht, aber wird upper je was zugewiesen 😉

    Stattdessen änderst du hier deine eigenen Variablen:

    v1 = upper;
    v2 = upper;
    

    Das müssen anders aussehen. Kommst bestimmt selber drauf 🙂

    Zudem kann man das Programm bissl vereinfachen. Du könntest dir die upper und lower Variablen sparen und direkt im "if-Bereich" die Ausgabe mit cout machen.

    Viel Spaß noch auf deinem Weg...

    @Erhard: 😮 Das einem Neuling .... *schäm*



  • KasF schrieb:

    Schau mal, du willst ja das die größere Zahl in upper steht, aber wird upper je was zugewiesen 😉

    Stattdessen änderst du hier deine eigenen Variablen:

    v1 = upper;
    v2 = upper;
    

    Das müssen anders aussehen. Kommst bestimmt selber drauf 🙂

    Aah... ich hab's falsch formuliert. :o

    Anstatt:

    if (v1 <= v2) {
            v1 = lower;
            v2 = upper;
        } else {
            v2 = lower;
            v1 = upper;
        }
    

    ...müsste es folgendermaßen aussehen:

    if (v1 <= v2) {
            lower = v1;
            upper = v2;
        } else {
            lower = v2;
            upper = v1;
        }
    

    Da muss man ja wirklich extrem sorgfältig arbeiten! :o
    In der Mathematik ist es ja im Grunde genommen egal, ob man sagt 5+5=10 oder 10=5+5... Aber in C++ ist das dann wohl doch etwas zu ungenau definiert.

    KasF schrieb:

    Zudem kann man das Programm bissl vereinfachen. Du könntest dir die upper und lower Variablen sparen und direkt im "if-Bereich" die Ausgabe mit cout machen.

    Oh, da hast du eigendlich recht... Darauf bin ich noch gar nicht gekommen:

    #include <iostream>
    int main ()
    {
        std::cout << "Geben Sie zwei Zahlen ein:" << std::endl;
        int v1, v2;
        std::cin >> v1 >> v2;
        if (v1 <= v2) {
           std::cout << v2;
        } else {
            std::cout << v1;
        }
        return 0;
    }
    

    ...Das mit den lower-/upper-Variablen ist wirkich etwas umständlicher.

    OK, vielen dank... Ich habe hier in den letzten 2 Tagen von euch wieder einiges dazu gelernt.
    Ich werde mir diese Regeln gut einprägen.



  • Nur kurz zu deinem "ungenauer definiert" Das ist nicht richtig.

    = ist in c++ eine ZUWEISUNG. Es heiszt: das was links steht hat jetzt den Wert von dem, wo rechts steht.

    Das = aus der Mathematik schreibt sich in C++ ==.



  • Shinja schrieb:

    Das = aus der Mathematik schreibt sich in C++ ==.

    Das würde ich doch ein wenig anders sehen 🙂
    Das in == in C++ fragt ob die beiden Ausdrücke rechts und links identisch sind, wobei das nicht der Fall sein muss.

    Beim = in Mathe jedoch, wird ausgedrückt das sie gleich sind.
    Ich würde das = in Mathe schon eher als = in C++ sehen, aber erst nachdem die Anweisung durchgeführt wurde. :p



  • Auch wieder wahr. Trotzdem wuerde ich das == noch naeher am mathematischen = sehen als die Zuweisung in C++. Eine Zuweisung MACHT etwas, das mathematische = nicht. Naja, Ansichtssache, sagen wir einfach: das mathematische gleich gibt es in der Form nicht, hehe.


Anmelden zum Antworten