Zeiger Wert zurückgeben
-
Hallo zusammen,
ich hoffe mir kann jemand helfen bei meiner Arbeit!? Ich komm einfach nicht weiter...die Aufgabenstellung:Eine zweidimensionale Matrix x ist als globale Variable definiert. Schreiben Sie eine Funktion
int eigen(double *e1, double *e2)
zur Berechnung der Eigenwerte dieser Matrix. Die beiden Ergebnisse sollen mittels Zeiger zurückgegeben werden.
Für die beiden Eigenwerte e1,2 der Matrix gilt:(siehe meinen C-code)
Falls die Eigenwerte berechnet werden konnten, beträgt der Rückgabewert 1. Falls keine Eigenwerte berechnet werden konnten, weil ein negativer Wert unter der Wurzel steht, beträgt der Rückgabewert 0.
Erstellen Sie ein vollständiges Programm (inkl. Funktion main), welches zunächst alle Elemente der Matrix x mit zufälligen Zahlenwerten belegt, anschließend die beiden Eigenwerte berechnet und diese schließlich auf dem Bildschirm ausgibt. Meine Lösung bis jetzt ist --->#include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> int eigen(double *e1, double *e2) { double x[2][2]; *e1 = (((x[1][1] + x[0][0]) / 2) + (sqrt((((x[1][1] + x[0][0]) / 2) * ((x[1][1] + x[0][0]) / 2)) + (x[1][0] * x[0][1]) - (x[0][0] * x[1][1])))); *e2 = (((x[1][1] + x[0][0]) / 2) - (sqrt((((x[1][1] + x[0][0]) / 2) * ((x[1][1] + x[0][0]) / 2)) + (x[1][0] * x[0][1]) - (x[0][0] * x[1][1])))); } void main(void) { double a, b, c, d, x[2][2]; int rueck, E1, E2, uwurzel; time_t t; time(&t); srand((unsigned int)t); a = rand() % 100; b = rand() % 100; c = rand() % 100; d = rand() % 100; x[0][0] = a; x[0][1] = b; x[1][0] = c; x[1][1] = d; /*printf("Zufallszahlen:\n\na=%3.1fl b=%3.1fl\nc=%3.1fl d=%3.1fl\n\n", a,b,c,d);*/ uwurzel = ((d + a / 2) * (d + a / 2) + (c*b) - (a*d)); if (uwurzel > 0) { rueck=1; } else { rueck=0; } if (rueck=1) { eigen(&E1, &E2); printf("Eigenwert1= %.1d\nEigenwert2= %.1d\n", E1, E2); } else { printf("Eigenwert konnte nicht berechnet werden!\n"); } }
-
Und was ist nun dein konkretes Problem und wieso übergibst du der Funktion eigen zwei Zeiger auf ints obwohl die Funktion Zeiger auf double erwartet?
-
Ok stimmt, E1 und E2 gehören noch hoch zu double.
mein Problem ist das keine Eigenwerte rausbekomme, d.h. irgendwo ist ein Felher drinnen oder es muss was zugeschrieben werden oder das ganze Programm ist komplett falsch geschrieben.
Bin grad mal 2 Wochen beim C Programmieren dabei und hab deswegen auch kaum Übung darin
-
Apleks schrieb:
Meine Lösung bis jetzt ist --->
Schön, aber wo ist dein Problem?
Warte mal, da war doch was:
Apleks schrieb:
Eine zweidimensionale Matrix x ist als globale Variable definiert.
Wo ist die?
Apleks schrieb:
Falls die Eigenwerte berechnet werden konnten, beträgt der Rückgabewert 1. Falls keine Eigenwerte berechnet werden konnten, weil ein negativer Wert unter der Wurzel steht, beträgt der Rückgabewert 0.
Wo ist der Test für die Wurzel?
Wo ist der Rückgabewert?Und sollte die Überprüfung für die Wurzel nicht in der Funktion stattfinden?
%fl ist ein merkwürdiger Formatspecifier. Warum willst du nach der Zahl noch ein kleines L haben?
-
Dir ist klar, dass die Matrix x in der Funktion eigen nix mit der Matrix x in der main Methode zu tun hat?
-
DirkB schrieb:
Eine zweidimensionale Matrix x ist als globale Variable definiert. Wo ist die?
Wo ist der Test für die Wurzel?
Wo ist der Rückgabewert?Und sollte die Überprüfung für die Wurzel nicht in der Funktion stattfinden?
%fl ist ein merkwürdiger Formatspecifier. Warum willst du nach der Zahl noch ein kleines L haben?
Die Globale Variable habe ich jetzt dazu getan..stimmt recht gehabt!
test bei der Wurtzel ist in main() und der Rückgabe wert auch. Sollte diese Überprüfung bei eigen() stehen? Falls die Überprüfung in der funktion stehen sollte, wie weiße ich von der Funktion eigen() auf die a,b,c,d konstanten von der main()??
Das fl ist doch für einen double Wert...so hab ich es zumindest gelernt double --> %flHandwerker2013 schrieb:
Dir ist klar, dass die Matrix x in der Funktion eigen nix mit der Matrix x in der main Methode zu tun hat?
Ja das weiß ich aber ich muss der Funktion doch irgendwie sagen das sie auf die a,b,c,d werte der main() Matrix zeigen soll und dann die Eigenwerte ausrechnen und wiedergeben?
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> double x[2][2]; /*Globale Matrix*/ int eigen(double *e1, double *e2) { *e1 = (((x[1][1] + x[0][0]) / 2) + (sqrt((((x[1][1] + x[0][0]) / 2) * ((x[1][1] + x[0][0]) / 2)) + (x[1][0] * x[0][1]) - (x[0][0] * x[1][1])))); *e2 = (((x[1][1] + x[0][0]) / 2) - (sqrt((((x[1][1] + x[0][0]) / 2) * ((x[1][1] + x[0][0]) / 2)) + (x[1][0] * x[0][1]) - (x[0][0] * x[1][1])))); } void main(void) { double a, b, c, d; int rueck, E1, E2, uwurzel; time_t t; time(&t); srand((unsigned int)t); a = rand() % 100; b = rand() % 100; c = rand() % 100; d = rand() % 100; x[0][0] = a; x[0][1] = b; x[1][0] = c; x[1][1] = d; /*printf("Zufallszahlen:\n\na=%3.1fl b=%3.1fl\nc=%3.1fl d=%3.1fl\n\n", a,b,c,d);*/ uwurzel = ((d + a / 2) * (d + a / 2) + (c*b) - (a*d)); if (uwurzel > 0) { rueck=1; } else { rueck=0; } if (rueck=1) { eigen(&E1, &E2); printf("Eigenwert1= %.1d\nEigenwert2= %.1d\n", E1, E2); } else { printf("Eigenwert konnte nicht berechnet werden!\n"); } }
-
Apleks schrieb:
Sollte diese Überprüfung bei eigen() stehen? Falls die Überprüfung in der funktion stehen sollte, ...
Die Funktion soll das alles überprüfen.
Ein Rückgabewert wird nicht dadurch zum Rückgabewert, dass man ihn rueck nennt.Apleks schrieb:
Ja das weiß ich aber ich muss der Funktion doch irgendwie sagen das sie auf die a,b,c,d werte der main() Matrix zeigen soll und dann die Eigenwerte ausrechnen und wiedergeben?
Wozu hast du denn die Zeilen 27 bis 30?
Apleks schrieb:
Das fl ist doch für einen double Wert...so hab ich es zumindest gelernt double --> %fl
Dann schau noch mal in deinen Unterlagen nach.
Beiprintf
ist der Formatspecifier %f fürfloat
unddouble
. Oft wird bei double %lf genommen, da dies beiscanf
so ist.Und %d steht für dezimal int. Wenn du da eine double-Variable angibst, kommt Mist raus.
-
Apleks schrieb:
Handwerker2013 schrieb:
Dir ist klar, dass die Matrix x in der Funktion eigen nix mit der Matrix x in der main Methode zu tun hat?
Ja das weiß ich aber ich muss der Funktion doch irgendwie sagen das sie auf die a,b,c,d werte der main() Matrix zeigen soll und dann die Eigenwerte ausrechnen und wiedergeben?
Wenn du die globale Matrix nutzt, dann musst du der Funktion das nicht "sagen". Willst du aber mit einer x-beliebigen 2x2 Matrix in deiner Funktion arbeitet, so erweitere deine Argumente einfach um eine 2x2Matrix des Typs double, also z.B so:
int eigen(double *e1, double *e2, double x[][2]) { *e1 = (((x[1][1] + x[0][0]) / 2) + (sqrt((((x[1][1] + x[0][0]) / 2) * ((x[1][1] + x[0][0]) / 2)) + (x[1][0] * x[0][1]) - (x[0][0] * x[1][1])))); *e2 = (((x[1][1] + x[0][0]) / 2) - (sqrt((((x[1][1] + x[0][0]) / 2) * ((x[1][1] + x[0][0]) / 2)) + (x[1][0] * x[0][1]) - (x[0][0] * x[1][1])))); }
-
DirkB schrieb:
Die Funktion soll das alles überprüfen.
Ein Rückgabewert wird nicht dadurch zum Rückgabewert, dass man ihn rueck nennt.
Wozu hast du denn die Zeilen 27 bis 30?
Dann schau noch mal in deinen Unterlagen nach.
Beiprintf
ist der Formatspecifier %f fürfloat
unddouble
. Oft wird bei double %lf genommen, da dies beiscanf
so ist.
Und %d steht für dezimal int. Wenn du da eine double-Variable angibst, kommt Mist raus.Ich muss die funktion doch mit etwas "füttern" damit sie mir wiederrum etwas ausspuckt?! Deshalbt auch die Zeilen 27-30...da definiere ich was in der Matrix ein a,b,c,d ist, sonst weiß das programm ja nicht was in der Matrix welchen Wert hat bzw. versuch dann auch in der Funktion dies so hin zu schreiben...
Das mit dem fl bzw. lf hast recht gehabt! Genau deswegen bin ich hier..immer was neuen bzw. aus fehlern lernenHandwerker2013 schrieb:
Wenn du die globale Matrix nutzt, dann musst du der Funktion das nicht "sagen". Willst du aber mit einer x-beliebigen 2x2 Matrix in deiner Funktion arbeitet, so erweitere deine Argumente einfach um eine 2x2Matrix des Typs double, also z.B so:
Das habe ich mir auch überlegt ABER ich darf die Funktion nicht ändern bedeutet ich muss bei
int eigen(double *e1, double *e2)
bleiben
Oh man, hab mir das alles einfacher Vorgestellt
-
Du schreibst die Werte von a b c d in die Matrix. Dann sind die da drin.
Was meinst du, auf was die Funktion dann zugreift?
Auf die Elemente der Matrix. Und da stehen die Werte drin.
(Du hast ha eine globale Matrix. Die ist von überall sichtbar)
-
Na dann benutze halt weiter die globale Matrix, wenn die Vorgabe da keinen Spielraum lässt. Warum machst du eigentlich aus dem hier:
if (uwurzel > 0) { rueck=1; } else { rueck=0; } if (rueck=1) { eigen(&E1, &E2); printf("Eigenwert1= %.1d\nEigenwert2= %.1d\n", E1, E2); } else { printf("Eigenwert konnte nicht berechnet werden!\n"); }
nicht das?
if (uwurzel > 0) { eigen(&E1, &E2); printf("Eigenwert1= %.1d\nEigenwert2= %.1d\n", E1, E2); } else { printf("Eigenwert konnte nicht berechnet werden!\n"); }
-
Dabei fällt mir gerade auf, dass du bestimmt:
if (rueck == 1)
anstellen von
if (rueck=1)
schreiben wolltest.
-
Suuuuper habs hinbekommen. Jetzt klappts.
Danke für die Hilfe!!!#include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> double x[2][2]; int eigen(double *e1, double *e2) { int uwurzel, rueck; uwurzel = ((x[1][1] + x[0][0] / 2.0) * (x[1][1] + x[0][0] / 2.0) + (x[1][0] * x[0][1]) - (x[0][0] * x[1][1])); if (uwurzel > 0) { *e1 = (((x[1][1] + x[0][0]) / 2) + (sqrt((((x[1][1] + x[0][0]) / 2) * ((x[1][1] + x[0][0]) / 2)) + (x[1][0] * x[0][1]) - (x[0][0] * x[1][1])))); *e2 = (((x[1][1] + x[0][0]) / 2) - (sqrt((((x[1][1] + x[0][0]) / 2) * ((x[1][1] + x[0][0]) / 2)) + (x[1][0] * x[0][1]) - (x[0][0] * x[1][1])))); } else { return 0; } } void main(void) { double a, b, c, d, E1, E2; int rueck, uwurzel, eigen(E1, E2); time_t t; time(&t); srand((unsigned int)t); a = rand() % 100; b = rand() % 100; c = rand() % 100; d = rand() % 100; x[0][0] = a; x[0][1] = b; x[1][0] = c; x[1][1] = d; eigen(&E1, &E2); printf("Eigenwert1= %.1lf\nEigenwert2= %.1lf\n", E1, E2); return 0; }
-
Handwerker2013 schrieb:
Warum machst du eigentlich aus dem hier:
nicht das?Weil das nicht im Sinne der Aufgabe ist.
Du wertest den Rückgabewert von eigen nicht aus.
Den Umweg über a, b, c, d musst du auch nicht gehen.
Warum schreibst du nicht
sqrt(uwurzel)
?
Und bist du sicher, das du mit dem Typ für uwurzel richtig liegst?Die Deklaration von eigen gehört auch nicht in
main
.
-
Du wertest den Rückgabewert von eigen nicht aus.
Den Umweg über a, b, c, d musst du auch nicht gehen.
Warum schreibst du nicht
sqrt(uwurzel)
?
Und bist du sicher, das du mit dem Typ für uwurzel richtig liegst?Die Deklaration von eigen gehört auch nicht in
main
.Wie meinst du das mit dem Auswerten des Rückgabewertes von eigen? Was wäre der Lösungsvorschlag?
Den Umweg über a,b,c,d....was wäre der kürzere Weg?
Stimmt die Deklaration von eigen hab ich rausgenommen aus main() und von int uwurzel habe ich ein double uwurzel gemacht wobei ich denke das das egal ist da ich nur schauen will ob uwurzel negative ist oder nicht.
Warum ich nichtsqrt(uwurzel)
schreibe ist, dass mich der Wurzelwert nicht interessiert sondern nur das, was unter der Wurzel steht.
-
Na sowas hier:
if(eigen(&E1, &E2)) printf("Eigenwert1= %.1lf\nEigenwert2= %.1lf\n", E1, E2); else printf("Fehlermeldung\n");
-
Ich habe es nicht getestet:
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> double x[2][2]; int eigen(double *e1, double *e2) { int uwurzel = ((x[1][1] + x[0][0] / 2.0) * (x[1][1] + x[0][0] / 2.0) + (x[1][0] * x[0][1]) - (x[0][0] * x[1][1])); if (uwurzel > 0) { *e1 = (((x[1][1] + x[0][0]) / 2) + (sqrt((((x[1][1] + x[0][0]) / 2) * ((x[1][1] + x[0][0]) / 2)) + (x[1][0] * x[0][1]) - (x[0][0] * x[1][1])))); *e2 = (((x[1][1] + x[0][0]) / 2) - (sqrt((((x[1][1] + x[0][0]) / 2) * ((x[1][1] + x[0][0]) / 2)) + (x[1][0] * x[0][1]) - (x[0][0] * x[1][1])))); return 1; } else { return 0; } } void main(void) { double E1, E2; time_t t; time(&t); srand((unsigned int)t); x[0][0] = rand() % 100; x[0][1] = rand() % 100; x[1][0] = rand() % 100; x[1][1] = rand() % 100; if (eigen(&E1, &E2)) printf("Eigenwert1= %.1lf\nEigenwert2= %.1lf\n", E1, E2); else printf("Fehlermeldung\n); return 0; }
-
double uwurzel = ((x[1][1] + x[0][0] / 2.0) * (x[1][1] + x[0][0] / 2.0) + (x[1][0] * x[0][1]) - (x[0][0] * x[1][1])); if (uwurzel > 0) { *e1 = (((x[1][1] + x[0][0]) / 2) + sqrt(uwurzel)); // da war es gemeint *e2 = (((x[1][1] + x[0][0]) / 2) - sqrt(uwurzel)); // und hier auch
Und noch ein paar Kleinigkeiten:
int main(void) // main gibt ein int zurück. Immer { double E1, E2; srand(time(NULL)); // reicht ... printf("Eigenwert1= %.1f\nEigenwert2= %.1f\n", E1, E2); // Wie schon gesagt: %f (ohne l) ist für double und float ...
-
Na, dann fasse ich mal als Handwerker zusammen(ungetestet):
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> double x[2][2]; int eigen(double *e1, double *e2) { double uwurzel = ((x[1][1] + x[0][0] / 2.0) * (x[1][1] + x[0][0] / 2.0) + (x[1][0] * x[0][1]) - (x[0][0] * x[1][1])); if (uwurzel > 0) { *e1 = (((x[1][1] + x[0][0]) / 2) + sqrt(uwurzel)); *e2 = (((x[1][1] + x[0][0]) / 2) - sqrt(uwurzel)); return 1; } else { return 0; } } int main() { double E1, E2; srand(time(NULL)); x[0][0] = rand() % 100; x[0][1] = rand() % 100; x[1][0] = rand() % 100; x[1][1] = rand() % 100; if (eigen(&E1, &E2)) printf("Eigenwert1= %.1f\nEigenwert2= %.1f\n", E1, E2); else printf("Fehlermeldung\n); return 0; }
-
Schreibfehler korrigiert(ungetestet):
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> double x[2][2]; int eigen(double *e1, double *e2) { double uwurzel = ((x[1][1] + x[0][0] / 2.0) * (x[1][1] + x[0][0] / 2.0) + (x[1][0] * x[0][1]) - (x[0][0] * x[1][1])); if (uwurzel > 0) { *e1 = (((x[1][1] + x[0][0]) / 2) + sqrt(uwurzel)); *e2 = (((x[1][1] + x[0][0]) / 2) - sqrt(uwurzel)); return 1; } else { return 0; } } int main() { double E1, E2; srand(time(NULL)); x[0][0] = rand() % 100; x[0][1] = rand() % 100; x[1][0] = rand() % 100; x[1][1] = rand() % 100; if (eigen(&E1, &E2)) printf("Eigenwert1= %.1f\nEigenwert2= %.1f\n", E1, E2); else printf("Fehlermeldung\n"); return 0; }