Matrizen-Programmieraufgaben
-
matrix[3][3] = matrix[dim][dim];
Was genau willst du hier machen? Ich nimm einfach mal an dass du deine Matrix auf deine geforderte Größe (1, 2 oder 3) "zuschneiden" willst oder? Alles was du hier machst ist einen Wert der hier "matrix[dim][dim]" drin sein soll in die matrix zu schreiben. Da du aber noch gar keine Werte an dieser Stelle eingegeben hast ist das völlig nutzlos. Falls ich mich irre korrigiere mich...
printf("ist %d.",&det);
Das & musst du hier weglassen!
-
int matrix[3][3]; printf("Geben Sie die gewünschte Dimension der Matrize an: (1,2 oder 3)\n"); scanf("%d", &dim); matrix[3][3] = matrix[dim][dim];
Das Element matrix[3][3] existiert noch nicht einmal.
Der höchste Index von Matrix ist [3-1][3-1] also [2][2]
Du kannst in C nicht Nachträglich die Größe eines Arrays ändern.
-
Ja stimm hast glaube ich recht neo...
Und das und muss natürlich da weg :D.Aber wie erstelle ich den eine Matrix mit einer Dimension die dann eingegeben wird.
Wenn ich sie mit Matrix[dim][dim]initialisieren will, dann meckert der Compiler rum, dass er eine feste Größe haben will
Und das Ausgabeproblem hab ich auch noch.
Mfg
Roger
-
Also es funktioniert jez mit dem Code hier:
int main() { int dim =0; int matrix[3][3]; int i = 0; int j = 0; int det = 0; 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 { det = matrix[0][0]; } else if(dim==2) { det = matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0]; } else { det = 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("Die Determinante der Matrix:\n"); i = 0; j = 0; for(i=0;i<dim;i++) { 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 %d.",det); return 0; }
Aber Matrix[3][3]=Matrix[dim][dim] macht ja nich das was ich will. Es verändert wahrscheinlich nichs am Programm, da es das Element [3][3] garnicht gibt.
Und es funktioniert anscheinend, da ich von Anfang an ne 3x3 Matrix erstellt habe und wenn ich nun nur eine 2x2 Matrix auffülle, greift ja die Determinantenformel für 2 Dimensionen und die anderen leeren Stellen werden nicht berücksichtigt. Deshalb wird es wohl funktionieren.Aber wie initialisiere ich denn eine Matrix, deren Dimension durch scanf festgelegt wird.
Mfg
Roger
-
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