[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.