Anfängerprobleme - Schleife und Co



  • Guten Tag.
    Ich bin momentan dabei mit dem Buch "C++ Lernen und professionell anwenden" C++ zu lernen.

    Die ersten Kapitel waren soweit gut verständlich und haben mir auch keine Probleme bereitet. Allerdings gelange ich so langsam an den Punkt, bei dem die ersten Fragen aufkommen und da erhoffe ich mir hier ein wenig Hilfe (bin übrigens gerade im Thema Schleifen, da werden sicherlich noch weitere Fragen kommen).

    Auf S. 118 heißt es:

    #include <iostream>
    #include <iomanip>
    using namespace std;

    int main ()
    {
    long euro, maxEuro;
    double kurs;

    cout << "\n* * * KURSTABELLE Euro - US-$ * * *\n\n";
    cout << "\nBitte den Preis von einem Euro in US-$ eingeben: ";

    cin >> kurs;
    cout << "\nBitte die Obergrenze für Euro eingeben: ";
    cin >> maxEuro;

    cout << '\n'
    << setw(12) << "Euro" << setw(20) << "US-$" << "\t\tKurs: " << kurs << endl;

    cout << fixed << setprecision(2) << endl;

    long lower, upper, step;

    for( lower=1, step=1; lower <= maxEuro; step*= 10, lower = 2step)
    //Die innere Schleife gibt einen "Block" aus:
    for( euro = lower, upper = step+10;euro <= upper && euro <= maxEuro; euro+=step)
    cout << setw(12) << euro << setw(20) << euro
    kurs << endl;

    return 0;

    }

    In der Aufgabe heißt es nun diese in eine while-Schleife umzubauen. Da ich hier meine Schwierigkeiten hatte (bin nun mal ganz am Anfang und auch ohne jegliche Hilfe, lediglich das Buch), habe ich versucht diese erst einmal ganz nachzuvollziehen.
    Hier werde ich z.B. aus folgender Funktion nicht schlau:
    step*=10
    Meines Wissens nach ist das ja nicht anderes als step = step 10
    Bei den definierten Werten also 1 = 1
    10
    Dies würde dann für lower = 2*step gleich 20 ergeben.
    Mit dem neuen Start der Funktion würde dies dann ja die 20 nehmen zum weiterrechnen und wir bewegen und schnell in einem sehr hohen Zahlenbereich, was ja nicht passt. Bei der Funktion werden ja sowieso 1-er Schritte gegangen, wieso könnte man nicht einfach bei step = 1 bleiben? (beim ausprobieren hat dies im Grunde eine Endlosschleife ergeben).
    Könnte mir da jemand auf die Sprünge helfen? Vermutlich scheine ich die ganze Funktion ein wenig Missverstanden zu haben, hätte da jemand eine verständliche Erklärung für?

    Bedanke mich bereits einmal für eure hilfreichen Antworten.

    Gruß



  • Chelikoo schrieb:

    weiterrechnen und wir bewegen und schnell in einem sehr hohen Zahlenbereich, was ja nicht passt.

    Nicht? Haste als maxEuro auch mal was hübsch großes wie hundert Millionen eingegeben?



  • Dann rechnet er bei mir ohne Ende durch.
    Verstehen tue ich es deshalb jetzt trotzdem nicht.

    Wenn ich als Obergrenze z.B. 15 Eingebe geht er bis zu 11 Euro.
    Im Grunde müsste er nach einem Durchgang ja aber schon bei 20 sein (s.o. wie ich die Funktion verstanden habe)


  • Mod

    Chelikoo schrieb:

    Wenn ich als Obergrenze z.B. 15 Eingebe geht er bis zu 11 Euro.
    Im Grunde müsste er nach einem Durchgang ja aber schon bei 20 sein (s.o. wie ich die Funktion verstanden habe)

    Das was in der for-Schleife als dritter Ausdruck steht, wird erst nach jedem Schleifendurchgang ausgewertet. Im ersten Durchgang ist step also 1 und upper entsprechend 11.



  • Ok, probier mal
    upper = step*****10
    also dort * statt +

    ps: Das Buch hat keinen so tollen Ruf.



  • Hast Du das richtig abgeschrieben?
    Für mich macht das ganze auch keinen Sinn.
    Die Idee mit dsn großen Zahlen ist sicher, dass die Tabelle für 1-10 in Einerschritteen, für 10-100 in Zehnerschritten, für 100-1000 in Tausenderschritten u.s.w. ausgegeben wird. Sonst wird dei Tabelle viel zu groß. Das funtioniert aber mit dem Code nicht richtig.
    Das Problem ist meiner Meinung nach, das hier versucht wird, zuviele Dinge gleichzeitg in einer Zeile zu machen. Da sieht man dann nicht mehr durch.

    // Du hast Recht , lower ist beim 2 Schleifendurchlauf 20 beim dritten 200, beim vierten 2000.  
    for( lower=1, step=1; lower <= maxEuro; step*= 10, lower = 2*step)
        //Die innere Schleife gibt einen "Block" aus:
        // Beim ersten Schleifendurchlauf ist lower=1 und uppper = 11 -> passt so.
        // Beim zweiten Schleifendurchlauf ist lower=20 und uppper = 20 -> war wohl nicht so gedacht.
        // Danach ist lower immer größer als upper, also wird nicht mehr ausgegeben. ->war wohl anders gedacht
        for( euro = lower, upper = step+10;euro <= upper && euro <= maxEuro; euro+=step)
            cout << setw(12) << euro << setw(20) << euro*kurs << endl;
    

    Edit: Rechtschreibung



  • DJohn schrieb:

    Das Problem ist meiner Meinung nach, das hier versucht wird, zuviele Dinge gleichzeitg in einer Zeile zu machen. Da sieht man dann nicht mehr durch.

    Jo. An so verwirrendem Code scheitern auch Profis. Echt hammer. Und in der Praxis kommt sowas gar nicht mal vor, weil man Progger, die sowas bauen, teert und federt und aus der Stadt jagt.



  • Hab den Code ein wenig aufgeräumt.

    #include <iostream>
    #include <iomanip>
    using namespace std;
    
    int main() {
    //Variablen so spät wie möglich anlegen
    	cout << "\n* * * KURSTABELLE Euro - US-$ * * *\n\n";
    	cout << "\nBitte den Preis von einem Euro in US-$ eingeben: ";
    	double kurs;
    	cin >> kurs;
    
    	cout << "\nBitte die Obergrenze für Euro eingeben: ";
    	long maxEuro;
    	cin >> maxEuro;
    
    //kein endl, wenn '\n' voll reicht. 
    	cout << '\n';
    	cout << setw(12) << "Euro" << setw(20) << "US-$" << "\t\tKurs: " << kurs << "\n\n";
    
    	cout << fixed << setprecision(2);
    
    	cout << '\n';
    
    //Schleifen ohne Schmerzen
    	cout << setw(12) << 1 << setw(20) << kurs << '\n';
    //Schleifenvariablen schleifenlokal
    	for(long step=1; step<=maxEuro; step*= 10)
    //Triviale Optimierungen ruhig dem Compiler zumuten
    		for(long euro = 2*step; euro <= 10*step && euro <= maxEuro; euro+=step)
    			cout << setw(12) << euro << setw(20) << euro* kurs << '\n';
    }
    

    Oder ganz im Sinne von P&P, aber mit Restlesbarkeit

    for(long euro = 1,step=1,upper=10; euro <= maxEuro; euro==upper&&(step*=10,upper=10*step),euro+=step)
    		cout << setw(12) << euro << setw(20) << euro* kurs << '\n';
    


  • Also das mit der veränderten Ausgabe hat schon einmal geklappt, danke schon einmal dafür.
    Allerdings ergibt das für mich momentan noch kein Sinn. Und den Logikfehler (bei mir) finde ich momentan auch noch nicht.
    for( lower=1, step=1; lower <= maxEuro; step*= 10, lower = 2*step)
    D.h. im ersten Durchgang:
    step = 1, lower =1,
    Nach dem 2.:
    step = 10, lower= 20
    step = 100, lower= 200
    step = 1000 lower= 2000
    usw.
    Was sorgt nun bei der Ausgabe dafür, dass 10,20,30 ausgegeben wird und nicht in der oben angegebenen schrittweise?

    Ich danke euch schon einmal für eure großzügige Hilfe, vermutlich werdet ihr mich in Zukunft nun öfter sehen.

    Also das Buch fand ich zu Anfang ziemlich gut, allerdings scheinen mir die Aufgaben im Gegensatz zu den leichten Erklärungen ziemlich schwer. Gefühlt wird einem also 1+1 erklärt und anschließend nach der Wurzel aus 231546812 gefragt 😃
    Auch saß ich schon einmal eine Stunde am verzweifeln am Anfang des Buches, indem es void main() hieß... Als Anfänger steht man da natürlich erst einmal auf dem Schlauch.
    Das Problem ist, das es so viele verschiedene Buchvorschläge gibt und jeder was anderes behauptet. Vermutlich werde ich aber wirklich umsteigen müssen, glücklicherweise bin ich erst bei S. 160 angelangt, sodass ich nicht allzu viel Wiederholung im neuen Buch haben sollte.



  • Chelikoo schrieb:

    Das Problem ist, das es so viele verschiedene Buchvorschläge gibt und jeder was anderes behauptet. Vermutlich werde ich aber wirklich umsteigen müssen, glücklicherweise bin ich erst bei S. 160 angelangt, sodass ich nicht allzu viel Wiederholung im neuen Buch haben sollte.

    Achte nicht auf Amazon-Rezensionen und nicht auf Bewertungen von Anfängern.



  • Chelikoo schrieb:

    Was sorgt nun bei der Ausgabe dafür, dass 10,20,30 ausgegeben wird und nicht in der oben angegebenen schrittweise?

    Also mit meinem Bugfix von 21:33:13 Uhr hats bei mir wunderbar geklappt.



  • Ok ich glaube ich steige so langsam durch die Funktion durch.
    Danke euch dafür!

    Werde mir vermutlich dann als nächstes erst einmal ein neues Buch anschaffen.

    Kleine Frage am Rande: Habe versucht mich anzumelden, Capcha-code falsch eingegeben und nun ist e-mail adresse und benutzername belegt... e-mail ist nicht angekommen.



  • Chelikoo schrieb:

    Was sorgt nun bei der Ausgabe dafür, dass 10,20,30 ausgegeben wird und nicht in der oben angegebenen schrittweise?

    Hallo Chelikoo,

    in dem Code stehen 2 Schleifen!
    - eine äußere Schleife: Bestimmt lower, upper und step
    - eine innere Schleife: Gibt von lower bis upper alles mit Schrittweite step aus. Und dort steht:

    euro+=step
    


  • Danke DJohn, gerade diesen Schritt hatte ich erst einmal auch nicht beachtet, erscheint mir jetzt aber - endlich - logisch.


  • Mod

    Chelikoo1 schrieb:

    Kleine Frage am Rande: Habe versucht mich anzumelden, Capcha-code falsch eingegeben und nun ist e-mail adresse und benutzername belegt... e-mail ist nicht angekommen.

    Wende dich am Besten an das Forentechnikforum oder benutze das Kontaktformular (einer von den Links rechts oben).


  • Mod

    Wende dich am Besten an das Forentechnikforum

    Du Kasper, du.



  • Dieter Baer "Schrödinger programmiert C++" von Gallileo kannste auch voll vergessen, ich hätte mit viel Geld gespart hätte ich das vorher gewusst, hab halt leider nich reingeschaut 😞 Ich kann die aber keinen Tip geben welches gut ist (hab mir kein neues geholt mach jetz alles mit tut´s aus´m netz die sind gratis:))


Anmelden zum Antworten