.j
-
.j
-
Wenn du Rekursion benutzen willst, musst du dir zuerst eine Abbruchbedingung in der Funktion selbst überlegen.
-
.j
-
So wie ich es geschrieben habe. Wenn du prinzipiell nicht weißt, was Rekursion ist, lass es bleiben, ich erkläre dir hier nicht auch noch diese Grundlagen.
Beim Implementieren der Abbruchbedingung musst du dir sowieso einige Gedanken machen, z.B. über die Argumente des rekursiven Aufrufs, dann sollte dir einiges klarer werden.
-
.j
-
Dein k sollte sich auch entsprechend verändern, indem du z.B. k-1 in den nächsten Rekursionsschritt reingibst.
-
.j
-
Juli84 schrieb:
Dann gibt er mir zwar zwei Ableitungen aus, also P' und P'', aber das sind beides die selben. Ich weiß wirklich nicht weiter.
Dann machst du was falsch, die Idee ist richtig
Aber ich hab keine Lust mich in deinen Code reinzudenken, sorry.
Kleiner Tipp, debuggs einfach durch. Dann siehst du doch sofort, wo etwas anderes passiert, als du erwartest.
-
Das Problem ist, dass du f übergibst und das Ergebnis in f_strich erwartest.
Und das macht jeder Aufruf von Ableitung.
Da in f aber die Ursprungsfunktion steht, wird auch immer von dieser die Ableitung berechnet.Kopier vor dem Aufruf von ableitung das Array von f nach f_strich.
Dann rechnest du in ableitung nur noch mit f_strich.a_strich[i] = a_strich[i] * i;
Dann steht in a_strich die erste Ableitung.
Nach dem nächsten aufruf steht da dann die 2. Ableitung.
-
.j
-
Falsche Stelle.
Ich meinte mita_strich[i] = a_strich[i] * i;
die Zeile 16. Also in ableitung.Du musst in main dein Array a nach a_strich kopieren. So bei Zeile 76.
(Jedes Element einzeln)*
Danach rufst du ableitung auf.Nochwas:
stattint *ptr1 = a; int *ptr2 = a_strich; ableitung(ptr1, ptr2, k, n);
kannst du auch gleich
ableitung(a, a_strich, k, n);
schreiben.
*Es geht auch mit memcpy, aber mach es erstmal einzeln.
-
Also das hier ist jetzt mein kompletter Quelltext:
#include<stdio.h> #include<string.h> void ableitung(int* f, int* f_strich, int k, int n) { int i; int s; printf("P"); s = 1; while(s <= k) { printf("'"); s++; } printf("(x) = "); i = n; while(i >= 0) { f_strich[i] = f_strich[i] * i; if(f_strich[i] == 0) { printf(""); } else if(i == 1) { printf("%d", f_strich[i]); } else if(i == 0) { printf(""); } else { printf("%d*x^%d + ", f_strich[i], i-1); } i--; } printf("\n"); if(k > 1) { ableitung(f, f_strich, k-1, n); } else { return; } } int main(void) { int n; int i; int f[11]; int k; int f_strich[11]; printf("Bitte den Grad n des einzulesenden Polynoms angeben (0 <= n <= 10): "); scanf("%d", &n); i = 0; while(i <= n) { printf("Bitte den Koeffizienten a%d eingeben: ", i); scanf("%d", &f[i]); i++; } printf("P(x) = "); i = n; while(i >= 0) { if(f[i] == 0) { printf(""); } else if(i == 1) { printf("%d*x + ", f[i]); } else if(i == 0) { printf("%d", f[i]); } else { printf("%d*x^%d + ", f[i], i); } i--; } printf("\n"); printf("Die wievielte Ableitung von P soll bestimmt werden?: "); scanf("%d", &k); int *ptr1 = f; int *ptr2 = f_strich; memcpy(f_strich, f, sizeof(f)); ableitung(ptr1, ptr2, k, n); return 0; }
Das hier ist die Ausgabe:
Bitte den Grad n des einzulesenden Polynoms angeben (0 <= n <= 10): 5 Bitte den Koeffizienten a0 eingeben: 3 Bitte den Koeffizienten a1 eingeben: 2 Bitte den Koeffizienten a2 eingeben: 0 Bitte den Koeffizienten a3 eingeben: 0 Bitte den Koeffizienten a4 eingeben: 4 Bitte den Koeffizienten a5 eingeben: 5 P(x) = 5*x^5 + 4*x^4 + 2*x + 3 Die wievielte Ableitung von P soll bestimmt werden?: 2 P''(x) = 25*x^4 + 16*x^3 + 2 P'(x) = 125*x^4 + 64*x^3 + 2
Aber das SOLLTE die Ausgabe sein:
Bitte den Grad n des einzulesenden Polynoms angeben (0 <= n <= 10): 5 Bitte den Koeffizienten a0 eingeben: 3 Bitte den Koeffizienten a1 eingeben: 2 Bitte den Koeffizienten a2 eingeben: 0 Bitte den Koeffizienten a3 eingeben: 0 Bitte den Koeffizienten a4 eingeben: 4 Bitte den Koeffizienten a5 eingeben: 5 P(x) = 5*x^5 + 4*x^4 + 2*x + 3 Die wievielte Ableitung von P soll bestimmt werden?: 2 P''(x) = 100*x^3 + 48*x^2
Irgendwas läuft also noch schief.
-
Hallo Juli, wie ist die Universität in Wuppertal denn so?
-
Ich glaube nicht, dass es
void ableitung(int* a, int* a_strich, int k, int n)
sein soll, sondern
void ableitung(int* a, int* a_strich, int k, int n)
ohne dem int n.
-
Meinte natürlich
void ableitung(int* a, int* a_strich, int k)
xP
-
Nach der Ableitung ist der Grad des Polynoms kleiner und das absolute Glied fällt weg.*
Da musst du dann deine Funktion etwas umstellen.
Erst berechnen von 1 bis nf_strich[i-1] = f_strich[i] * i; // i = 1 ... n n = n-1; // :warning:
und dann ausgeben von n bis 0;
Dabei solltest du dann nochmal die Zeile 36 ansehen, ob die so bleiben kann.Du kannst ja mal überlegen, warum das zwei Schritte sein müssen.
*kam mir gestern schon etwas merkwürdig vor