Wurzel nach Iterationsverfahren...
-
Hi,
ich bin noch ein ziemlicher Anfänger in C, deshalb bitte ich um Verzeihung für eventuelle peinliche Fehler
Ich soll ein Programm schreiben das die Wurzel aus einer bestimmten Zahl mit hilfe des Iterationsverfahren bestimmt.
Näheres dazu hier:
http://www.inf.hs-anhalt.de/~Breitschuh/html/msprog/Prak3/Prak3.htmSoweit bin ich gekommen, leider habe ich aber das Problem das mir für die Wurzel am Ende 0 ausgegeben wird. Wieso nur?
#include<stdio.h> #include<math.h> main() { int i,j, n; float xi,xd,save,test,x, a; printf("Dies ist ein Programm zur Berechnung der n-ten Wurzel aus a \n"); printf("Eingabe von n "); scanf("%i", &n); printf("Eingabe von a "); scanf("%f", &a); xi=1; i=0; test=0.0000001; xd=1; j=0; do { i=i+1; x=xi; save=xi; for(j=1;j<=i;j++) { x=xi*x; } xi=1/n*((n-1)*xi+(a/x)); xd=xi/save; } while(xd>test); printf("\n\n"); printf("Wurzel: %10.2f\n",xi); }
Ich weiß, ist sehr unübersichtlich...ich wäre euch aber unglaublich dankbar wenn ihr mir bei meinem Problem helfen könntet!
Gruß
Salax
-
Erstmal ist deine Berechnung von xin-1 falsch - der Exponent wächst mit jedem Schleifendurchlauf. Und zweitens sollte sich das Verhältnis xi/xi-1 nach Möglichkeit 1 nähern, wenn du dich dem Grenzwert näherst - du prüfst auf 0.
-
Ok danke für deine Antwort. Hatte wirklich ein paar dumme Fehler drin. Nach einer Nachtschicht hab ichs allerdings zum laufen bekommen!
#include<stdio.h> #include<math.h> main() { int i,j,n; float a1,a,b,c,xi,xd,save,test,x; printf("Programm zur Berechnung der n-ten Wurzel aus a mit Hilfe des Iterafionsverfahren"); printf("********************************************************************************"); printf("********************************************************************************\n\n"); printf("Eingabe von n \n"); scanf("%i", &n); printf("Eingabe von a \n"); scanf("%f", &a); xi=1; i=0; test=0.00000001; xd=1; j=0; if(a>0&n>0) { do { i=i+1; x=xi; save=xi; x=pow(xi,n-1); a1=(float)1/n; b=(n-1)*xi; c=a/x; xi=a1*(b+c); xd=xi-save; printf(" x%i = %f \n",i,xi); } while(fabs(xd)>test); printf("\n\n"); printf("Die %i.Wurzel aus %8.2f ist: %10.6f\n\n",n,a,xi); } else printf("Werte von a und n müssen größer 0 sein!\n\n"); }
Das einzige was ich jetzt noch bräuchte wäre eine Überprüfung ob der Nutzer eine Ganze Zahl für n eingibt. Was wäre dafür die beste Möglichkeit? Da n als Integer deklariert ist, bricht das Programm ab wenn man ne gebrochene Zahl eingibt. Eine Prüfung wäre mir jedoch lieber.
Danke im Vorraus!!
-
Wieso wird "V o r a u s" denn durch **** ersetzt?!
Naja egal
-
Entweder du pumpst nach dem Einlesen von n den Lesepuffer aus ("while(getc()!='\n');" oder du liest n als Gleitkommazahl ein und kappst hinterher die Nachkomma-Stellen:
float nf;int n; scanf("%f",&nf); n=nf;