Matrizen-Programmieraufgaben
-
Bei den Fehlermeldungen steht doch alles dabei.
Zeilennummer und die Beschreibung auf deutsch.Zeile 9 ist an der Stelle verkehrt. die gehört vor main().
Und nimm endlich Zeile 14 raus.
Du hast da kein int sondern ein int[3][3].
Großer Unterschied.
Nochmal:inverse[3][3]
ist ein Element (das noch nicht mal existiert). Da gehört einfach nurinverse
hin.
Das Kapitel über Arrays und Zeiger (evtl Strings) nochmal durcharbeiten.Zeile 67:
Was kommt raus wenn du 1 durch eine Zahl > 1 teilst. Was ist die zugehörige int dazu?
-
@pyhax
Fast. Laut dritter Warnung tritt ein Problem auch bei Parameter 2 auf.
Die Lösung überlasse ich Roger.
-
Ich versuchs mal ;).
Melde mich wenns klappt.
So Fehlermeldungen sind weg. Ab der Dimension 2 gibt mir die Inverse seher komische Werte raus aber ich guck mal ob ich den Fehler finde.
Danke euch.
-
DirkB schrieb:
@pyhax
Fast. Laut dritter Warnung tritt ein Problem auch bei Parameter 2 auf.
Die Lösung überlasse ich Roger.Ah, stimmt
Jetzt sehe ich es auch
-
Ah jez hab ich matrix, inverse und determ in floats umgewandelt und kommt immer determinante = 0 raus :D...
Und printf/scanf sind aufeinmal nicht mehr deklariert o.O.Ich dreh hier gleich am Rad ^^
-
Zeig doch mal den umgewandelten Code ...
-
Und die Datei kann nicht zum schreiben geöffnet werden o.O
void inverseberechnen(float inverse[3][3], float matrix[3][3], int dim, float determ); int main() { int dim =0; float matrix[3][3]; float inverse[3][3]; int i = 0; int j = 0; float determ = 0; printf("Geben Sie die gewünschte Dimension der Matrize an: (1,2 oder 3)\n"); scanf("%lf", &dim); for(i=0;i<dim;i++) // Auffüllen der Matrix über zwei for-Schleifen Zeile für Zeile { for(j=0;j<dim;j++) { printf("Geben Sie Element [%d][%d] ein:\n", i,j); scanf("%lf", &matrix[i][j]); } }; if (dim==1) // Berechnung von detMatrix { determ = matrix[0][0]; } else if(dim==2) { determ = matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0]; } else { determ = matrix[0][0]*matrix[1][1]*matrix[2][2]+ matrix[0][1]*matrix[1][2]*matrix[2][0]+ matrix[0][2]*matrix[1][0]*matrix[2][1]- matrix[2][0]*matrix[1][1]*matrix[0][2]- matrix[2][1]*matrix[1][2]*matrix[0][0]- matrix[2][2]*matrix[1][0]*matrix[0][1]; } printf("%lf",determ); if(determ==0.0f) printf("det ist 0\n"); else inverseberechnen(inverse,matrix,dim, determ); return 0; } void inverseberechnen(float inverse[3][3], float matrix[3][3], int dim, float determ) { int i; int j; switch(dim) //Berechnung der Inversen { case 0: inverse[0][0] = 1.0f/determ; case 1: { inverse[0][0] = +matrix[1][1]/determ; inverse[0][1] = -matrix[0][1]/determ; inverse[1][1] = +matrix[0][0]/determ; inverse[1][0] = -matrix[1][0]/determ; } case 2: { inverse[0][0] = +(matrix[1][1]*matrix[2][2]-matrix[1][2]*matrix[2][1])/determ; inverse[0][1] = -(matrix[0][1]*matrix[2][2]-matrix[2][1]*matrix[0][2])/determ; inverse[0][2] = +(matrix[0][1]*matrix[1][2]-matrix[1][1]*matrix[0][2])/determ; inverse[1][0] = -(matrix[1][0]*matrix[2][2]-matrix[1][2]*matrix[2][0])/determ; inverse[1][1] = +(matrix[0][0]*matrix[2][2]-matrix[0][2]*matrix[2][0])/determ; inverse[1][2] = -(matrix[0][0]*matrix[1][2]-matrix[1][0]*matrix[0][2])/determ; inverse[2][0] = +(matrix[1][0]*matrix[2][1]-matrix[1][1]*matrix[2][0])/determ; inverse[2][1] = -(matrix[0][0]*matrix[2][1]-matrix[0][1]*matrix[2][0])/determ; inverse[2][2] = +(matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0])/determ; } } printf("Die Inverse der Matrix:\n"); for(i=0;i<dim;i++) //Ausgabe der Matrix { printf("|\t"); for(j=0;j<dim;j++) { printf("%f\t",matrix[i][j]); if(dim==3 && j==2) printf("| \n"); else if (dim==2 && j==1) printf("| \n"); else if (dim ==1 && j==0) printf("| \n"); } }; printf("ist:\n"); for(i=0;i<dim;i++) //Ausgabe der Inversen { printf("|\t"); for(j=0;j<dim;j++) { printf("%f\t",inverse[i][j]); if(dim==3 && j==2) printf("| \n"); else if (dim==2 && j==1) printf("| \n"); else if (dim ==1 && j==0) printf("| \n"); } }; }
-
Roger292 schrieb:
Ah jez hab ich matrix, inverse und determ in floats umgewandelt und kommt immer determinante = 0 raus :D...
HAst du auch den Formatstring von
scanf
undprintf
geändert?
Und nimm gleich double statt float.
Bei
scanf
ist es dann %lf und beiprintf
%fRoger292 schrieb:
Und printf/scanf sind aufeinmal nicht mehr deklariert o.O.Ich dreh hier gleich am Rad ^^
Hast du
#include <stdio.h>
?Sonst zeig den aktuellen Code
-
Schau mal nach, ob noch eine Instanz von deinem Programm läuft.
Sonst kann der Compiler keine neue .exe schreiben.Du hast die Formatstrings bei scanf und printf voll durcheinander.
Zeile 16. dim ist ein int. Wie heißt der Formatspecifier für int?
-
Sooo wasn heute los mit mir o.O? Ja stdio.h is jez drin -.-
Und Zeile 17 ein %d.( Ausversehen geändert, als ich den ganzen kram auf float ändern wollte.) Immer diese dummen kleinen Fehler.
Beim schließen des Fensters hatte sich der Prozess nich richtig geschlossen. Jez kann er kompilieren.
Aber die Determinantenrechnung scheint noch einen Bug zu haben.( sie ist immer 0) Wie hab ich das denn hinbekommen? -.-
mfg Roger
PS: Tut mir Leid, dass heute irgendwie nichts bei mir klappt
-
Roger292 schrieb:
Aber die Determinantenrechnung scheint noch einen Bug zu haben.( sie ist immer 0)
Wie kommst du darauf.
Auch wenn du dim = 1 machst und als Wert 4 eingibst?
Mach doch mal eine Funktion
float Determinante(float matrix[3][3], int dim);
, baust die ein, testest die und postest dann mal das Ergebnis. (Code und Ausgabe)
-
Ja auch wenn ich dim 1 mache...
Aber ich versuche das mal mit der Funktion.
-
#include <stdio.h> void inverseberechnen(float inverse[3][3], float matrix[3][3], int dim, float determ); float Determinante(float matrix[3][3], int dim); int main() { int dim =0; float matrix[3][3]; float inverse[3][3]; int i = 0; int j = 0; float determ = 0; printf("Geben Sie die gewünschte Dimension der Matrize an: (1,2 oder 3)\n"); scanf("%d", &dim); for(i=0;i<dim;i++) // Auffüllen der Matrix über zwei for-Schleifen Zeile für Zeile { for(j=0;j<dim;j++) { printf("Geben Sie Element [%d][%d] ein:\n", i,j); scanf("%lf", &matrix[i][j]); } }; Determinante(matrix,dim); printf("%f",determ); if(determ==0.0f) printf("det ist 0\n"); else inverseberechnen(inverse,matrix,dim, determ); return 0; } void inverseberechnen(float inverse[3][3], float matrix[3][3], int dim, float determ) { int i; int j; switch(dim) //Berechnung der Inversen { case 0: inverse[0][0] = 1.0f/determ; case 1: { inverse[0][0] = +matrix[1][1]/determ; inverse[0][1] = -matrix[0][1]/determ; inverse[1][1] = +matrix[0][0]/determ; inverse[1][0] = -matrix[1][0]/determ; } case 2: { inverse[0][0] = +(matrix[1][1]*matrix[2][2]-matrix[1][2]*matrix[2][1])/determ; inverse[0][1] = -(matrix[0][1]*matrix[2][2]-matrix[2][1]*matrix[0][2])/determ; inverse[0][2] = +(matrix[0][1]*matrix[1][2]-matrix[1][1]*matrix[0][2])/determ; inverse[1][0] = -(matrix[1][0]*matrix[2][2]-matrix[1][2]*matrix[2][0])/determ; inverse[1][1] = +(matrix[0][0]*matrix[2][2]-matrix[0][2]*matrix[2][0])/determ; inverse[1][2] = -(matrix[0][0]*matrix[1][2]-matrix[1][0]*matrix[0][2])/determ; inverse[2][0] = +(matrix[1][0]*matrix[2][1]-matrix[1][1]*matrix[2][0])/determ; inverse[2][1] = -(matrix[0][0]*matrix[2][1]-matrix[0][1]*matrix[2][0])/determ; inverse[2][2] = +(matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0])/determ; } } printf("Die Inverse der Matrix:\n"); for(i=0;i<dim;i++) //Ausgabe der Matrix { printf("|\t"); for(j=0;j<dim;j++) { printf("%f\t",matrix[i][j]); if(dim==3 && j==2) printf("| \n"); else if (dim==2 && j==1) printf("| \n"); else if (dim ==1 && j==0) printf("| \n"); } }; printf("ist:\n"); for(i=0;i<dim;i++) //Ausgabe der Inversen { printf("|\t"); for(j=0;j<dim;j++) { printf("%f\t",inverse[i][j]); if(dim==3 && j==2) printf("| \n"); else if (dim==2 && j==1) printf("| \n"); else if (dim ==1 && j==0) printf("| \n"); } }; } float Determinante(float matrix[3][3], int dim) { float determ=0; if (dim==1) // Berechnung von detMatrix { determ = matrix[0][0]; } else if(dim==2) { determ = matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0]; } else { determ = matrix[0][0]*matrix[1][1]*matrix[2][2]+ matrix[0][1]*matrix[1][2]*matrix[2][0]+ matrix[0][2]*matrix[1][0]*matrix[2][1]- matrix[2][0]*matrix[1][1]*matrix[0][2]- matrix[2][1]*matrix[1][2]*matrix[0][0]- matrix[2][2]*matrix[1][0]*matrix[0][1]; } return determ; }
Augabe Determinante = 0.0000
Ich versteh das nicht... Es wär ja nicht ganz so ärgelich, wenn es morgen nicht fertig sein müsste.
-
Du solltest das Ergebnis von
Determinante(matrix,dim);
auch deiner Variablen determ zuweisen. (Zeile 30)Wegen Zeile 26:
`Nochmal zu scanf():Einlesen von float : %f // Nein, hier ist kein kleines L
Einlesen von double: %lf // Ja, hier ist ein kleines L
Nochmal zu printf():
Ausgabe von float : %f // Nein, hier ist kein kleines L
Ausgabe von double: %f // Nein, hier ist auch kein kleines L
`
Sonst mach ein paar Kontrollausgaben ala
printf("Bin jetzt in else (dim = 3) determ = %f matrix[0][0] = %f\n", determ, matrix[0][0]);
-
Jo mal gucken... Das mit %lf und %f hab ich auch gerade geändert^^ .
EDIT: Ok das mit der Determinante geht jetzt, aber es ist mir schleierhaft, warum es vorher nicht ging, also als es noch nicht in einer Funktion war.
Dann hab ich es ja fast. Die Inverse passt nämlich noch gar nicht. Ganz wirre Ausgabe mit sehr langen Zahlen.
Mal gucken wo der Fehler liegen könnte, denn die Formel ist eigentlich ausm Anhang kopiert. Vielleicht helfen ein paar Kontrollausgaben.
mfg
Roger
-
Also er Springt aufjedenfall in de richtigen Case für jedes dim...
Und es wird jedes Element der Inversen richtig ausgerechnet.Also hängt es irgendwo in der Ausgabe.
switch(dim) //Berechnung der Inversen { case 1: inverse[0][0] = 1.0f/determ; case 2: { inverse[0][0] = +matrix[1][1]/determ; printf("CASE2 ELEMENT 00 %f",inverse[0][0]); inverse[0][1] = -matrix[0][1]/determ; printf("CASE2 ELEMENT 01 %f",inverse[0][1]); inverse[1][1] = +matrix[0][0]/determ; printf("CASE2 ELEMENT 11 %f",inverse[1][1]); inverse[1][0] = -matrix[1][0]/determ; printf("CASE2 ELEMENT 10 %f",inverse[1][0]); } case 3: { inverse[0][0] = +(matrix[1][1]*matrix[2][2]-matrix[1][2]*matrix[2][1])/determ; inverse[0][1] = -(matrix[0][1]*matrix[2][2]-matrix[2][1]*matrix[0][2])/determ; inverse[0][2] = +(matrix[0][1]*matrix[1][2]-matrix[1][1]*matrix[0][2])/determ; inverse[1][0] = -(matrix[1][0]*matrix[2][2]-matrix[1][2]*matrix[2][0])/determ; inverse[1][1] = +(matrix[0][0]*matrix[2][2]-matrix[0][2]*matrix[2][0])/determ; inverse[1][2] = -(matrix[0][0]*matrix[1][2]-matrix[1][0]*matrix[0][2])/determ; inverse[2][0] = +(matrix[1][0]*matrix[2][1]-matrix[1][1]*matrix[2][0])/determ; inverse[2][1] = -(matrix[0][0]*matrix[2][1]-matrix[0][1]*matrix[2][0])/determ; inverse[2][2] = +(matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0])/determ; }
Die Kontrollprintfs geben die richtigen Werte aus!
EDIT: Es klappt jetzt. Wieder ein SEHR DUMMER FEHLER das break; hinter jedem case hat gefehlt, der lief immer alle 3 cases durch -.-
So jetzt nur noch ein LGS lösen und dann bin ich fertig, aber das sollte kein Problem sein^^.
mfg Roger
-
So ich hoffe es ist noch wer da...
Ein letztes mal muss ich euch noch belästigen:
Hab das Problem, dass die eingelesenen Werte eines Vektors irgendwie nicht gespeichert werden.
Es handelt sich um den Vektor inhomogen:
#include <stdio.h> void inverseberechnen(double inverse[3][3], double matrix[3][3], int dim, double determ); double Determinante(double matrix[3][3], int dim); double matrixmultiplikation(double inverse[3][3],double inhomogen[3],double geloest[3],int dim); int main() { int dim =0; double matrix[3][3]; double inverse[3][3]; double inhomogen[3]; double geloest[3]; int i = 0; int j = 0; double determ = 0; printf("Geben Sie die gewünschte Dimension der Matrix an: (1,2 oder 3)\n"); scanf("%d", &dim); for(i=0;i<dim;i++) // Auffüllen der Matrix über zwei for-Schleifen Zeile für Zeile { for(j=0;j<dim;j++) { printf("Geben Sie Element [%d][%d] ein:\n", i,j); scanf("%lf", &matrix[i][j]); } }; for(i=0;i<dim;i++) // Einlesen des inhomogenen Anteils { printf("Geben Sie Element [%d] des inhomogenen Anteils ein:\n", i); scanf("%lf", &inhomogen[i]); }; printf("HOMO 0 %d",inhomogen[0]); // Kontrolle ob gespeichert printf("HOMO 1 %d",inhomogen[1]); printf("HOMO 2 %d",inhomogen[2]); determ=Determinante(matrix,dim); if(determ==0) printf("Determinante ist 0. Es gibt keine Inverse und keine Lösung.\n"); else { inverseberechnen(inverse,matrix,dim,determ); matrixmultiplikation(inverse,inhomogen,geloest,dim); printf("Die Lösung des Gleichungsystems\n"); for(i=0;i<dim;i++) //Ausgabe der Matrix { printf("|\t"); for(j=0;j<dim;j++) { printf("%f\t",matrix[i][j]); if(dim==3 && j==2) printf("|\tx%d\t%d\n",i+1,inhomogen[i]); else if (dim==2 && j==1) printf("|\tx%d\t%d\n",i+1,inhomogen[i]); else if (dim ==1 && j==0) printf("|\tx%d\t%d\n",i+1,inhomogen[i]); } }; } return 0; } void inverseberechnen(double inverse[3][3], double matrix[3][3], int dim, double determ) { switch(dim) //Berechnung der Inversen { case 1: {inverse[0][0] = 1.0f/determ; break; } case 2: { inverse[0][0] = +matrix[1][1]/determ; inverse[0][1] = -matrix[0][1]/determ; inverse[1][1] = +matrix[0][0]/determ; inverse[1][0] = -matrix[1][0]/determ; break; } case 3: { inverse[0][0] = +(matrix[1][1]*matrix[2][2]-matrix[1][2]*matrix[2][1])/determ; inverse[0][1] = -(matrix[0][1]*matrix[2][2]-matrix[2][1]*matrix[0][2])/determ; inverse[0][2] = +(matrix[0][1]*matrix[1][2]-matrix[1][1]*matrix[0][2])/determ; inverse[1][0] = -(matrix[1][0]*matrix[2][2]-matrix[1][2]*matrix[2][0])/determ; inverse[1][1] = +(matrix[0][0]*matrix[2][2]-matrix[0][2]*matrix[2][0])/determ; inverse[1][2] = -(matrix[0][0]*matrix[1][2]-matrix[1][0]*matrix[0][2])/determ; inverse[2][0] = +(matrix[1][0]*matrix[2][1]-matrix[1][1]*matrix[2][0])/determ; inverse[2][1] = -(matrix[0][0]*matrix[2][1]-matrix[0][1]*matrix[2][0])/determ; inverse[2][2] = +(matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0])/determ; break; } } } double Determinante(double matrix[3][3], int dim) { double determ=0; if (dim==1) // Berechnung von detMatrix { determ = matrix[0][0]; } else if(dim==2) { determ = matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0]; } else { determ = matrix[0][0]*matrix[1][1]*matrix[2][2]+ matrix[0][1]*matrix[1][2]*matrix[2][0]+ matrix[0][2]*matrix[1][0]*matrix[2][1]- matrix[2][0]*matrix[1][1]*matrix[0][2]- matrix[2][1]*matrix[1][2]*matrix[0][0]- matrix[2][2]*matrix[1][0]*matrix[0][1]; } return determ; } double matrixmultiplikation(double inverse[3][3],double inhomogen[3],double geloest[3],int dim) { switch(dim) //Berechnung der Lösungen { case 1: {geloest[0] = inhomogen[0]; break; } case 2: { geloest[0] = inverse[0][0]*inhomogen[0]+inverse[0][1]*inhomogen[1]; geloest[1] = inverse[1][0]*inhomogen[0]+inverse[1][1]*inhomogen[1]; break; } case 3: { geloest[0] = inverse[0][0]*inhomogen[0]+inverse[0][1]*inhomogen[1]+inverse[0][2]*inhomogen[2]; geloest[1] = inverse[1][0]*inhomogen[0]+inverse[1][1]*inhomogen[1]+inverse[1][2]*inhomogen[2]; geloest[3] = inverse[2][0]*inhomogen[0]+inverse[2][1]*inhomogen[1]+inverse[2][2]*inhomogen[2]; break; } return 0; } }
Der Compiler gibt mir auch keinen Fehler aus. Bei der Kontrollabfrage der Elemente kommt 0 raus.
Mfg
Roger
-
double inhomogen[3]; printf("HOMO 0 %d",inhomogen[0]);
Du schreibst jetzt 100 mal: "%d ist für dezimal Integer. %f ist für float/doubel\n"
-
Roger292 schrieb:
Der Compiler gibt mir auch keinen Fehler aus. Bei der Kontrollabfrage der Elemente kommt 0 raus.
Dann schalte die Warnungen für den Compiler an.
Sowas erkennt der Compiler und gibt eine Warnung aus.
-
oh Gott . Das ist wirklich nicht mein Tag gut, das er in 1 Minute vorbei ist
Ok ich suche mal die Compiler warning optionen.