[Problem] Kreisberechnung mit Hilfe eines n-Ecks, Eingabe schlägt fehl



  • Hallo!
    Ich bin ein Neuling in Sachen C und hoffe wegen meiner, wahrscheinlich Noobigen, Fehler nicht ausgelacht zu werden) 😉

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    double kreisfl(double r, long rek ){
    	double h,A,D,K;
    	long i;
    	K=r/2;
    	i=0;
    	D=3;
    	A=0;
    	h=sqrt((r*r)-(K*K));
    	A=h*r*D;
    	D=D*2;
    	h=r-h;
    	A=A+(h*K*D);
    	K=sqrt((K*K)+(h*h));
    	while(i<=rek){
    		D=D*2;
    		h=r-sqrt((r*r)-((K/2)*(K/2)));
    		A=A+(h*K*D);
    		K=sqrt(((K/2)*(K/2))+(h*h));
    	}
    	return A;
    }
    
    int main(){
    	double r,flaeche,pii;
    	long rek;
    	printf("Bitte geben sie denn Radius und die Anzahl der Rekurionsstufen ein!\n");
    	scanf("%lf", &r);
    	printf("%lf",r);
    	scanf("%ld", &rek);
    	printf("%ld",rek);
    	printf("Bitte warten.....");
    	flaeche=kreisfl(r,rek);
    	pii=flaeche/(r*r);
    	printf("Die Fläche des Kreises beträgt %lf und Pi ist %lf.",flaeche,pii);
    	return 0;
    }
    

    Da schlägt, wie ihr selbst austesten könnt, schon die Eingabe für die Vraiable rek fehl. Kann mir jemand helfen?

    MfG

    Hannes



  • Bei der Eingabe kann ich keinen Fehler erkennen, aber hier:

    while(i<=rek){
            D=D*2;
            h=r-sqrt((r*r)-((K/2)*(K/2)));
            A=A+(h*K*D);
            K=sqrt(((K/2)*(K/2))+(h*h));
        }
    

    Wenn du hier natürlich i nicht hochzählst, endet es wohl in einer Endlosschleife.
    Füge also im while-Block

    ++i;
    

    ein



  • So, nun läufts, allerding snich so genau, nur 6 nachkommastellen. Kann mir jemand einen tipp geben, um bessere Genauigkeit zu erreichen?

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    long double kreisfl(long double r, long rek ){
    	double h,A,D,K;		//Deklaration
    	unsigned long i;	//Deklaration
    	K=r/2;			//
    	i=0;			//Definition
    	D=3;			//
    	A=0;			//
    	h=sqrt((r*r)-(K*K));	//Höhe des gleichseitigen Dreiecks errechnen
    	A=h*r*D;		//Fläche des Sechsecks errechnen
    	h=r-h;			//Zweite Höhe errechnen
    	A=A+(h*r*D);		//Fläche der aüßeren Dreicke addieren
    	K=sqrt((K*K)+(h*h));	//Kathete neu definieren
    	while(i<=rek){		//Schleife, die immer wieder die Flächen ausrechnet und addiert
    		D=D*2;
    		h=r-sqrt((r*r)-((K/2)*(K/2)));
    		A=A+(h*K*D);
    		K=sqrt(((K/2)*(K/2))+(h*h));
    		i++;
    	}
    	return A;		//Fläche zurückgeben
    }
    
    int main(){
    	long double r,flaeche,pii;
    	unsigned long rek;	// Rekursionsstufen
    	printf("Bitte geben sie denn Radius und die Anzahl der Rekurionsstufen ein!\n");
    	scanf("%Lf", &r);	//Input
    	scanf("%ld", &rek);	//Input
    	printf("Bitte warten.....\n\n");
    	flaeche=kreisfl(r,rek);
    	pii=flaeche/(r*r);	//Pi aus der Fläche errechnen
    	printf("Die Fläche des Kreises beträgt %Lf und Pi ist %Lf.\n",flaeche,pii);
    	return 0;
    }
    


  • indem du bei der Ausgabe statt

    %lf
    

    folgendes eingibst:

    %20.10lf
    

    Nun werden 20 Stellen ausgegeben, wovon 10 Nachkommastellen sind.


Anmelden zum Antworten