Problem bei Kreisflächenberechnung



  • Hallo Leute,

    ich habe ein kleines Problem:

    #include<stdio.h>
    
    int main(void) {
    
    	printf("Kreisumfänge:\n\n");
    
    	int r=20;					// r steht für Radius
    	double pi=3.1425;
    	double i;
    
    	for (r=20, i=pi*r*r;r<41;r++) {
    
    		printf("%lf*%i*%i=%lf\n", pi, r, r, i );
    		i=pi*r*r;
    
    	}
    
    	return 0;
    

    Die erste Rechnung für r=20 wird korrekt ausgegeben:
    3,1425*20*20=1257,0000

    Die zweite Rechnung für r=21 ergibt aber auch 1257:
    3,1425*21*21=1257,0000

    Und ab der dritten Rechnung ist das Ergebnis um eins verschoben:
    3,1425*22*22=1385,....

    wobei dieses Ergebnis eigentlich für r=21 rauskommen müßte...

    Woran liegt das?
    Wie kann ich das ändern?

    lg student 08/15



  • Das liegt daran, dass du das i für r=20 einmal im Schleifenkopf und dann nochmal am Ende der for-Schleife berechnest.



  • Nun, dein Programm macht in der Schleife folgendes:
    setzte r auf 20, setzte i auf fläche eines kreises mit radius 20
    prüfe ob r < 41
    gebe alles aus
    setzte i auf fläche eines kreises mit radius 20
    erhöhe r
    prüfe ob r < 41
    gebe alles aus r ist 21, aber i hat den wert von radius 20!
    setzte i auf fläche eines kreises mit radius 21
    ...
    Du siehst das Problem?



  • Ja, jetzt wo du es sagst:

    Vielen Dank.

    Aber wie löse ich das Problem? Wenn ich i nicht im Schleifenkopf erwähne, sondern nur im Anweisungsblock, dann meldet der Compiler, daß i nicht initialisiert sei.

    lg



  • student 08/15 schrieb:

    Aber wie löse ich das Problem? Wenn ich i nicht im Schleifenkopf erwähne, sondern nur im Anweisungsblock, dann meldet der Compiler, daß i nicht initialisiert sei.

    Dann berechnet i doch vor der Ausgabe.



  • Stimmt, du hast recht...

    ich muß im anweisungsblock nur die Formel und den print-Befehl tauschen...

    Ich habe es gerade ausprobiert. So komme ich auf die richtigen Ergebnisse...

    Vielenvielen Dank...

    lg student 08/15



  • student 08/15 schrieb:

    Stimmt, du hast recht...

    ich muß im anweisungsblock nur die Formel und den print-Befehl tauschen...

    Ich habe es gerade ausprobiert. So komme ich auf die richtigen Ergebnisse...

    Vielenvielen Dank...

    lg student 08/15

    In dem Programm ist einiges doppelt und/oder an der falschen Stelle.

    const  double pi=3.1425; 
    
    int main(void) 
    {
      int r;                   // r steht für Radius 
      double i; 
    
      printf("Kreisumfänge:\n\n");
    
      for(r=20; r<41; r++) { 
        i=pi*r*r;
        printf("%lf*%i*%i=%lf\n", pi, r, r, i ); 
        }
    }
    

    Wobei man sich das l in %lf auch sparen koennte...

    Ausserdem koennte man M_PI aus math.h einbinden und sich die Deklaration von pi sparen.



  • Übrigens ist PI nicht 3,1425 sondern 3,1416 (gerundet) siehe hier https://de.wikipedia.org/wiki/Kreiszahl



  • Videonauth schrieb:

    Übrigens ist PI nicht 3,1425 sondern 3,1416 (gerundet) siehe hier https://de.wikipedia.org/wiki/Kreiszahl

    Doch! Pi hat den Wert 3,1425, wenn man die Zahl auf vier Kommastellen genau berechnet. Runden ist hier unüblich und macht auch keinen Sinn. Abschneiden zu 3,1425 ist korrekt.
    Es ist in diesem Fall eben nicht wie z. B. beim Geld, wo runden Sinn macht, weil es ja keine halben Cents gibt...


  • Mod

    Besserwisser schrieb:

    Doch! Pi hat den Wert 3,1425, wenn man die Zahl auf vier Kommastellen genau berechnet. Runden ist hier unüblich und macht auch keinen Sinn. Abschneiden zu 3,1425 ist korrekt.
    Es ist in diesem Fall eben nicht wie z. B. beim Geld, wo runden Sinn macht, weil es ja keine halben Cents gibt...

    Jede Aussage in diesem Zitat ist kompletter Unsinn.



  • Eigentlich sollten solche Konstanten garnicht im Code stehen.

    Dafür gibts ja schliesslich die entsprechenden include-Dateien.

    Das hatte ich aber "damals" auch schon angemerkt.



  • M_PI ist aber nicht im Standard enthalten.


Anmelden zum Antworten