Programmierung einer do-while Schleife



  • Hallo,
    ich habe ein Programm geschrieben, was mit Hilfe von regula falsi den Zinsatz in der Rentenformel berechnet. Das funktioniert auch soweit, allerdings sollen auch die Iterationsschritte ausgegeben werden. Dabei ahbe ich den Zähler aber irgendwie falsch gesetzt.
    Jetzt sagte man mir auch, dass ich aus meiner for Schleife erst noch eine do-while Schleife machen soll.

    da meine Programmierkenntnisse nicht so berauschend sind, scheiter ich schon an der Änderung von for-Schleife zu do-while.

    Kann sich mal jemand meinen Code anschauen und mir erklären, wie ich daraus eine do-while Schleife mache und wo ich da den Zähler für die Iterationsschritte setzen muss?

    #include <stdio.h>
    #include <conio.h>
    #include <math.h>
    #include <ctype.h>
    
    void main (void)
    {										
    	float rn, n, r, q, q1, p;
    	int i;
    	i = 1.0;
    
    	printf ("\n\t Z i n s s a t z\n");
    	printf ("\t _______________\n\n\n\n");
    	printf ("\t Geben Sie bitte folgende Variablen an:\n\n\n");
    	printf ("\t Rentenendwert in Euro: \t"); scanf ("%f", &rn);
    	printf ("\t Rate in Euro: \t\t\t"); scanf ("%f", &r);
    	printf ("\t Laufzeit in Jahren: \t\t"); scanf ("%f", &n);
    
    	for (q = 1.001; q < 1000000; q += 0.001)
    	{
    		if ((pow(q,n) - ((rn / r) * q) + (rn / r - 1)) > 0)
    		break;
    	}	
    
    	do
    	{
    		q1 = ((((n - 1.0) * pow(q,n)) + 1.0) - rn / r) / ((n * pow(q,n - 1.0)) - (rn / r));	
    	}
    
    	while (fabs(q1 - q) > 0.1);
    	i++;
    
    	p = (q1-1.0)*100.0;
    
    	printf ("\n\n\t Iterationsschritte: \t\t\t%d", i);
    	printf ("\n\t Der Zinssatz betraegt: \t"); printf ("%10.2f", p); printf (" Prozent");
    }
    

    Wäre super, wenn mir da jemand helfen könnte.
    Danke



  • TRANSformator schrieb:

    ...

    Erste Bitte: Für C/C++ Code die entsprechenden Tags verwenden. Nachfolgendes ohne Gewähr (ungetestet)

    TRANSformator schrieb:

    Jetzt sagte man mir auch, dass ich aus meiner for Schleife erst noch eine do-while Schleife machen soll.

    da meine Programmierkenntnisse nicht so berauschend sind, scheiter ich schon an der Änderung von for-Schleife zu do-while.

    Vielleicht erst einmal die for-Schleife komplett erklärt:

    for(/*Initialisierung*/;/*Laufbedingung*/;/*Anweisung*/)
    {
        /*Schleifenrumpf*/
    }
    

    Die Initialisierung wird einmal im Vorfeld aufgerufen. Die Laufbedingung wird jedesmal beim Starten eines Schleifendurchgangs durchgeführt, die Anweisung zum Schluß des Schleifendurchganges...

    Nehmen wir mal dein Beispiel

    for (q = 1.001; q < 1000000; q += 0.001)
    

    Und schreiben dies mal etwas anders:

    {
        q = 1.001;
        for(;q < 1000000;)
        {
           /*Schleifenrumpf*/
           q += 0.001;
        }
    }
    

    Eine direkte Umstellung dieser Schleife zur do-while ist aber nicht möglich (Da die Eingangsprüfung durch eine Endprüfung ersetzt wird). Eine while-Schleife wäre 1:1 abbildbar:

    {
        q = 1.001;
        while(q < 1000000)
        {
           /*Schleifenrumpf*/
           q += 0.001;
        }
    }
    

    Ich gehe davon aus, das die do/while bei dir wie folgt aussehen müsste, da die Eingangsbedingung immer erfüllt ist:

    {
        q = 1.001;
        do
        {
           /*Schleifenrumpf*/
           q += 0.001;
        } while(q < 1000000)
    }
    

    Aber nichts desto trotz: Gleitkommazahlen sind nicht genau, daher sollte man niemals mit exakte Prüfungen gegen einen Wert machen. Theoretisch könnte der Wert den du als 1000000 annimmst, tatsächlich ein "999999.9999999999" oder so sein... Normalerweise arbeitet man bei double/float mit Deltavergleichen...



  • Danke erstmal für deine Antwort.

    #include <stdio.h>
    #include <conio.h>
    #include <math.h>
    #include <ctype.h>
    
    void main (void)
    {										
    	float rn, n, r, q, q1, p;
    	int i;
    	i = 1.0;
    
    	printf ("\n\t Z i n s s a t z\n");
    	printf ("\t _______________\n\n\n\n");
    	printf ("\t Geben Sie bitte folgende Variablen an:\n\n\n");
    	printf ("\t Rentenendwert in Euro: \t"); scanf ("%f", &rn);
    	printf ("\t Rate in Euro: \t\t\t"); scanf ("%f", &r);
    	printf ("\t Laufzeit in Jahren: \t\t"); scanf ("%f", &n);
    
    {
        q = 1.001;
        while(q < 1000000)
        {
    	if ((pow(q,n) - ((rn / r) * q) + (rn / r - 1)) > 0)
          	break; 
          q += 0.001;
        }
    } 
    
    	do
    	{
    		q1 = ((((n - 1.0) * pow(q,n)) + 1.0) - rn / r) / ((n * pow(q,n - 1.0)) - (rn / r));	
    	}
    
    	while (fabs(q1 - q) > 0.1);
    	i++;
    
    	p = (q1-1.0)*100.0;
    
    	printf ("\n\n\t Iterationsschritte: \t\t\t%d", i);
    	printf ("\n\t Der Zinssatz betraegt: \t"); printf ("%10.2f", p); printf (" Prozent");
    }
    
    #include <stdio.h>
    #include <conio.h>
    #include <math.h>
    #include <ctype.h>
    
    void main (void)
    {										
    	float rn, n, r, q, q1, p;
    	int i;
    	i = 1.0;
    
    	printf ("\n\t Z i n s s a t z\n");
    	printf ("\t _______________\n\n\n\n");
    	printf ("\t Geben Sie bitte folgende Variablen an:\n\n\n");
    	printf ("\t Rentenendwert in Euro: \t"); scanf ("%f", &rn);
    	printf ("\t Rate in Euro: \t\t\t"); scanf ("%f", &r);
    	printf ("\t Laufzeit in Jahren: \t\t"); scanf ("%f", &n);
    
    {
        q = 1.001;
        do
        {
           if ((pow(q,n) - ((rn / r) * q) + (rn / r - 1)) > 0)
           break;
           q += 0.001;
        } while(q < 1000000);
    } 
    
    	do
    	{
    		q1 = ((((n - 1.0) * pow(q,n)) + 1.0) - rn / r) / ((n * pow(q,n - 1.0)) - (rn / r));	
    	}
    
    	while (fabs(q1 - q) > 0.1);
    	i++;
    
    	p = (q1-1.0)*100.0;
    
    	printf ("\n\n\t Iterationsschritte: \t\t\t%d", i);
    	printf ("\n\t Der Zinssatz betraegt: \t"); printf ("%10.2f", p); printf (" Prozent");
    }
    

    Das ist nun einmal die while-Schleife und einmal die do-while nach deiner Vorgabe. Funktioniert einwandfrei;). Kannst du mir evtl. sagen, an welcher Stelle ich da den Zähler setzen müsste, um die Iterationsschritte zu zählen? So wie ich den bisher integriert habe, zählt er zwei Iterationschritte, was aber mathematisch gesehen bei dem regula falsi Verfahren nicht korrekt sein kann.

    Zum Deltavergleich: Ich bin absoluter Anfänger und kann damit jetzt auf Schlag nciht viel anfangen. Wie ersetze ich meine 1000000 denn durch einen Deltavergleich?

    Gruß


Anmelden zum Antworten