Matrizen-Programmieraufgaben



  • Moin moin,

    Also ich hab folgendes Probelm, wahrscheinlich iwo einen kleinen Denkfehler.

    Folgender Code:

    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");
    
    		for(i=0;i<dim;i++)                                    // AUsgabe der Matrix                     
    	{   
    		printf("|\t");
    
    		for(j=0;j<dim;j++)
    
    		{
    			printf("%d\t",matrix[i][j]);
    
    			if(j==2)
    				printf("| \n");
    
    		}
    	};
    
    		printf("ist %d.",&det);
    
    	return 0;
    
    }
    }
    

    Also die Formatierte Ausgabe funktioniert irgendwie nich. Er gibt mir immer nur das erste Element.

    Also die Ausgabe soll so aussehen:

    Die Determinante der Matrix
    | 1.00 2.00 3.00|
    | 2.00 4.00 5.00|
    | 3.00 5.00 6.00|
    ist -1.

    Für das .00 müsste ich noch floats verwenden, wollte aber das Programm erstmal zum laufen bringen. 😉
    Und auch die Determinantenberechnung gibt, trotz vorgegebener Formel irgendwie Müll aus.

    Hoffe ihr könnt mir helfen.

    Mfg
    Roger


  • Mod

    j=2 ist eine Zuweisung, kein Vergleich. Aktiviere immer alle Warnoptionen deines Compilers und behandle Warnungen wie Fehler, solange du dir nicht ganz sicher bist, dass du es besser weißt.

    edit: Deine anderen Vergleiche sind auf die gleiche Weise falsch, daher nehme ich mal an, dass du es gar nicht weißt, wie es geht: In C vergleicht man mittels ==, nicht mit =.



  • klar.... Dummer Fehler.
    Den Fehler mach ich viel zu oft^^. Aber es funktioniert immernoch nich. Also immernoch die selben Fehler.



  • 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
    Roger

    Bei 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 nur inverse 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");
    
    		}
    	};
    
    	}
    

Anmelden zum Antworten