Berechnung der n-ten Wurzel mit Iterationsverfahren
-
Michael E. schrieb:
- Der User gibt eine Zahl ein (scanf müsste das sein).
- Du führst die Iteration aus (Stichwort while-Schleife).
- Du gibst das Ergebnis aus (printf).
In C# gibt es kein scanf und printf.
-
Mache das Heronverfahren innerhalb einer while schleife
-
Das Heron-Verfahren funktioniert aber nur für Quadratwurzeln, hier gehts es allgemein um die n-te Wurzel.
Im Endeffekt hast du doch bereits alles. Du musst nur die Werte vom Benutzer einlesen, die Formel in Programmcode umsetzen und wie beschrieben über eine while-Schleife das Ergebnis berechnen.
-
Ja das Einlesen bekomm ich ja vielleicht noch hin und while-Schleife ist schonmal ein gutes Stichwort, aber wie setze ich denn jetzt konkret die Formel im Programmcode um?
als Variablen sind vorgegeben:
n - für n-te Wurzel
a - Wert aus dem Wurzel zu ziehen ist
x1, x2 - Ergebnisse benachbarter Iterationsläufe
absdiff - absolute Differenz benachbarter Ergebnisse
genau - Genauigkeitsgrenze (10 hoch -8)
potenz
i, zaehl - Laufvariable und Iterationszähler
-
<WallOfText>
Ich könnte dir jetzt hier locker den Programmcode hinschreiben, das wird wohl nicht ganz den Sinn und Zweck der Aufgabe erfüllen. Du sollst dabei ja etwas lernen.Da du ja eine while-Schleife verwenden möchtest brauchst du in irgendeiner Weise eine Bedingung, wie lange die Schleife laufen soll. Diese Bedingung ist hier offensichtlich die Differenz zwischen dem aktuellen und dem vorherigen Iterationsschritt, die du dir also speichern musst.
Die Formel selbst in Programmcode umzusetzen dürfte jetzt nicht das große Problem sein, da die Schreibweise in der Aufgabenstellung ziemlich genau der im Programm entspricht. Einzig das Berechnen von xi^n-1 dürfte ein klein wenig anspruchsvoller werden, wenn du nicht die Bibliotheksfunktion Math.Pow verwenden willst/darfst.Probiere es einfach einmal aus. Wenn du ein Problem hast kannst du deinen Code ja hier posten, dann wird man dir sicher weiterhelfen. Aber so wie ich das Forum hier kenne wird ohne Eigeninitiative keiner helfen wollen.
</WallOfText>
-
Als totaler Anfänger ist es leider ein großes Problem Eigeninitiative zu entwickeln, denn in der Schule bekommt man nur Zettel mit Programmen zum Abschreiben vorgelegt, wo man dann nur kleine Veränderungen ausführt und in der Fachliteratur find ich zwar die Funktionen der einzelnen Befehle, jedoch tut sich bei mir nicht auf, wie ich das ganze zu einem funktionierendem Programm zusammensetze. Es ist leider auch nicht so dass ich den ganzen Tag Zeit habe mich damit zu beschäftigen und am Montag muss die Aufgabe bereits vorgelegt werden...
-
Also sowas hier wäre mein Ansatz aber dann bin ich echt schon aufgeschmissen... Bitte mal weiterhelfen!
#include <stdio.h>
#include <math.h>
#include <conio.h>main ()
{ int n, a, potenz, i, zaehl=0;
float x1=1, x2=0, absdiff=0, genau=0,00000008;printf("Wert für n: ");
scanf("%i", &n);
printf("Wert für a: ");
scanf("%i", &n);while (absdiff<=genau)
{
x2=1/n((n-1)*x1+(a/(x1 hoch n-1?));
absdiff=x1-x2;
}printf("x1= ", x1);
printf("zaehl= ", zaehl);
}
-
Das sieht doch eigentlich schon mal ganz gut aus. Ich kann auf Anhieb eigentlich nur drei kleine Fehler entdecken.
1. Die Laufbedingung deiner while-Schleife passt so nicht. Die Schleife soll ja laufen, so lange die Differenz [b}größer[/b] als die angegebene Genauigkeit ist.
2. Du brauchst eine Funktion zur Berechnung der Potenz. Steht ja auch im Hinweis deiner Aufgabe, dass man das am Besten durch mehrmaliges multiplizieren löst -> Schleife.
2 1/2. Du solltest das Ergebnis des aktuellen Iterationschrittes so zwischen speichern, dass er im nächsten Schritt wieder als x1 verfügbar ist.
3. Du musst bei der Ausgabe einen Formatbezeichner (%f) angeben, sonst wird nichts ausgegeben.
PS: Das hier ist das C#-Forum, einige Leute werden hier zwar auch Ahnung von C haben, aber besser aufgehoben wärst du bei ANSI C. Verwende das nächste Mal bitte die
[ code]
-Tags, das erleichtert das Lesen des Codes ungemein.
-
Also Punk 1 und 3 hab ich jetzt soweit abgeändert aber wie ich die beiden 2er Punkte angehe ist mir völlig unklar....Außerdem ergibt die Variable zaehl im Moment ja noch gar keinen Sinn und ich weiß auch nicht wozu die gut sein soll...
-
Ich habe gerade gesehen, dass du den Header math.h einbindest, dann kannst du dir umständliche Berechnung von x1^n-1 mit einer Schleife eigentlich auch sparen und die Funktion
pow
dafür benutzen.Wofür die Variable zeahl gut sein soll kann ich mir auch nicht so recht erklären. Entweder soll man damit die benötigten Iterationsschritte zählen oder sie ist wirklich für die Berechnung der Potenz mit einer Schleife gedacht.
-
Ja nee die include Geschichten hab ich nur hingeschrieben, weil die bis jetzt immer dabei waren.... in der Aufgabenstellung steht aber leider dass es mit einer while-schleife erledigt werden soll, weiß ja jetzt immer nochnicht wie ich die mache. anscheinend mit zaehl?
-
So hier der aktuelle Programmcode + Fehlermeldungen, hoffe mich bringt hier bald jemand ans Ziel, die Zeit läuft mir davon...
#include <stdio.h> #include <math.h> #include <conio.h> main () { int n, a, potenz, i, zaehl=0; float x1=1, x2=0, absdiff=0, genau=0.00000001; printf("Wert für n: "); scanf("%i", &n); printf("Wert für a: "); scanf("%i", &a); while (absdiff>genau) { x2=1/n((n-1)*x1+(a/(x1 hoch n-1?))); absdiff=x1-x2; } printf("x1= %f", x1); printf("zaehl= %f", zaehl); }
1>------ Erstellen gestartet: Projekt: p4_a1, Konfiguration: Debug Win32 ------ 1>Kompilieren... 1>p4_a1.c 1>e:\dokumente und einstellungen\willi\desktop\c testat\p4_a1.c(7) : warning C4305: 'Initialisierung': Verkürzung von 'double' in 'float' 1>e:\dokumente und einstellungen\willi\desktop\c testat\p4_a1.c(10) : warning C4996: 'scanf' wurde als veraltet deklariert 1> f:\programme\microsoft visual studio 8\vc\include\stdio.h(295): Siehe Deklaration von 'scanf' 1> Meldung: "This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details." 1>e:\dokumente und einstellungen\willi\desktop\c testat\p4_a1.c(12) : warning C4996: 'scanf' wurde als veraltet deklariert 1> f:\programme\microsoft visual studio 8\vc\include\stdio.h(295): Siehe Deklaration von 'scanf' 1> Meldung: "This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details." 1>e:\dokumente und einstellungen\willi\desktop\c testat\p4_a1.c(16) : error C2063: 'n': Keine Funktion 1>e:\dokumente und einstellungen\willi\desktop\c testat\p4_a1.c(16) : error C2146: Syntaxfehler: Fehlendes ')' vor Bezeichner 'hoch' 1>Das Buildprotokoll wurde unter "file://e:\Dokumente und Einstellungen\Willi\Desktop\C Testat\p4_a1\p4_a1\Debug\BuildLog.htm" gespeichert. 1>p4_a1 - 2 Fehler, 3 Warnung(en) ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
-
#include <stdio.h>
#include <math.h>main()
{
int n, i;
double x=1, a;
printf("Wert n fuer n-te Wurzel: ");
scanf("%i",&n);
printf("Wert von dem die n-te Wurzel gezogen werden soll: ");
scanf("%lf",&a);
if(a<0)
{
printf("nicht lösbar");
}
if(n==0)
{
printf("nicht lösbar");
}while((x=(x+1)/x)>=0,00000001)
x=1/n((n-1)x+(a/x ;
printf("\n x= %lf \n\n\n",x);
}wie sieht das aus? muss das gleich machen. fehlt nich was in der formel und so aber sonst das gerüst??
-
ich meinte es fehlt noch was in der formel
-
follfosten wer bist du? hast schon richtiges programm zum schreiben oder? woher? brauch das auch mal.
-
Ein kleiner, aber wichtiger Tip für deinen nächsten Thread Follfosten, wähle das Forum sorgfältiger aus.
Nur weil hier was von C steht, hat das noch lange nichts mit dem C zu tuen.
-
Also ich hab das Programm fertig, hab nämlich die gleiche aufgabenstellung...
Habs zwar auch nur bekommen aber man kann es dann einfacher verstehn...
jetzt brauchste es aber auch nicht mehr oder?