Matrizen-Programmieraufgaben
-
Roger292 schrieb:
Aber wie erstelle ich den eine Matrix mit einer Dimension die dann eingegeben wird.
Über Dynamische Speicherverwaltung. Stichwort malloc.
Das kommt aber später.Roger292 schrieb:
Wenn ich sie mit Matrix[dim][dim]initialisieren will, dann meckert der Compiler rum, dass er eine feste Größe haben will
Das geht erst ab C99 und nennt sich VLA (Variable Length Array)
Du kannst aber erstmal eine ausreichend große feste Matrix anlegen.
Du brauchst die ja nicht komplett ausnutzen.Roger292 schrieb:
Und das Ausgabeproblem hab ich auch noch.
Welches Problem?
Was soll rauskommen und was bekommst du raus?
-
Danke
Ne das mit der Ausgabe ist gelöst ;).
Und wenn ich mir das so anhöre, dann wollte der Prof das anscheinend so, dass man die einfach groß genug anlegt ;).
Mfg
RogerBei weiteren Fragen zu den anderen Aufagben melde ich mich ^^
-
So jez gehts weiter :D... Also ich muss das Programm jez erweitern um das hier :
Schreiben Sie eine void-Funktion, die als Parameter die eingegebene Matrix
und ihre Dimension hat sowie die zu berechnende inverse Matrix. Unterscheiden
Sie dabei zwischen den drei verschiedenen Fallen (eine, zwei oder drei Dimensionen)
mit einer switch-Anweisung.Switch-Anweisung ist kein Problem und die Berechnung der Inversen auch nicht. Aber ich hab kein schimmer wie der Funktionsprototyp aussehen soll.
Also void inverseberechnen(int dim,......) und dann hakt es bei mir.
Und wenn es eine void funktion ist, dann muss ich ja die Ausgabe der Inversen auch in der Funktion abwickeln, da ich ja nichts an main zurückgeben kann oder?
mfg
Roger
-
void inverseberechnen(int invmatrix[3][3], int matrix[3][3], int dim);
Da du da (die Zeiger auf) Arrays übergibst, kannst du die Matrizen aus der Funktion herraus manipulieren.
-
Ach doch so einfach? ^^
Hab es jez mit dem Funktionsprototypen versucht.. und noch die determinante hinzugefügt.Er kompiliert auch, aber sobald die Matrixelemente eingelesen wurden, crasht er.
Er gibt mir auch einige warning vonwegen formale und übergebene parameter stimmen nich überein.( Bei Param 1 und 2, also den Matrizen). Aber es wird int an int übergeben.
Hier die warnings:
1>c:\users\roger\documents\visual studio 2010\projects\praktikum4_4.2\praktikum4_4.2\aufgabe4.2.c(49): warning C4024: 'inverseberechnen': Unterschiedliche Typen für formalen und übergebenen Parameter 1 1>c:\users\roger\documents\visual studio 2010\projects\praktikum4_4.2\praktikum4_4.2\aufgabe4.2.c(49): warning C4047: 'Funktion': Anzahl der Dereferenzierungen bei 'int (*)[3]' und 'int' unterschiedlich 1>c:\users\roger\documents\visual studio 2010\projects\praktikum4_4.2\praktikum4_4.2\aufgabe4.2.c(49): warning C4024: 'inverseberechnen': Unterschiedliche Typen für formalen und übergebenen Parameter 2 1>c:\users\roger\documents\visual studio 2010\projects\praktikum4_4.2\praktikum4_4.2\aufgabe4.2.c(67): warning C4244: '=': Konvertierung von 'float' in 'int', möglicher Datenverlust 1>c:\users\roger\documents\visual studio 2010\projects\praktikum4_4.2\praktikum4_4.2\aufgabe4.2.c(49): warning C4700: Die nicht initialisierte lokale Variable "inverse" wurde verwendet. 1>c:\users\roger\documents\visual studio 2010\projects\praktikum4_4.2\praktikum4_4.2\aufgabe4.2.c(14): warning C4789: Das Ziel der Speicherkopie ist zu klein.
Und mein jetziger Code:
int main() { int dim =0; int matrix[3][3]; int inverse[3][3]; int i = 0; int j = 0; int determ = 0; void inverseberechnen(int inverse[3][3], int matrix[3][3], int dim, int determ); printf("Geben Sie die gewünschte Dimension der Matrize an: (1,2 oder 3)\n"); scanf("%d", &dim); matrix[3][3] = matrix[dim][dim]; // Übertragen der gewünschten Dimension auf die Matrix 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("%d", &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]; } inverseberechnen(inverse[3][3],matrix[3][3],dim, determ); return 0; } void inverseberechnen(int inverse[3][3], int matrix[3][3], int dim, int determ) { int i; int j; switch(dim) { 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 Determinante der Matrix:\n"); for(i=0;i<dim;i++) //Ausgabe der Matrix { printf("|\t"); for(j=0;j<dim;j++) { printf("%d\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("%d\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"); } }; }
mfg
Roger
-
Ich denke der aufruf muss so lauten:
inverseberechnen(inverse,matrix[3][3],dim, determ);
-
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]);