Matrizen


  • Mod

    @(D)Evil: Hat es einen bestimmten Grund, hier die ***-Methode anzubringen? Die ist einfach nur böse.



  • Was für ne Methode? 😮



  • ich fange mal langsam an! bin noch neu in C++. Habe noch nicht so viele Erfahrungen mit operatoren überladen.

    Ich beginne mal mit meiner main.cpp.

    #include <iostream>
    #include "mat_rech.h"
    
    using namespace std;
    
    void skalar(Matrix &m1, Matrix &m2)
    {
    	int choice;
    	cout << "Welche Matrix soll mit einem Skalar multipliziert werden?"<<endl;
    	cout << "1. Matrix 1"<<endl;
    	cout << "2. Matrix 2" <<endl;
    	cin >> choice;
    	if(choice==1)
    		m1.skalar();
    	else if(choice == 2)
    		m2.skalar();
    }
    
    void multi(Matrix &m1, Matrix &m2)
    {
    	int choice;
    	cout << "1. A*B"<<endl;
    	cout << "2. B*A" <<endl;
    	cin >> choice;
    
    	if(choice==1)
    		m1.multi(m2);
    	else if(choice == 2)
    		m2.multi(m1);
    }
    
    int main (void)
    {
    	int x1, y1, x2,y2;
    	int wahl=0,skalar=0;
    
    	cout << "1. Matrix: Wieviele Spalten: ";
    	cin >> x1;
    	cout << "1. Matrix: Wieviele Zeilen: ";
    	cin >> y1;
    
    	cout << "2. Matrix: Wieviele Spalten: ";
    	cin >> x2;
    	cout << "2. Matrix: Wieviele Zeilen: ";
    	cin >> y2;
    
    	Matrix m1(x1,y1);
    	Matrix m2(x2,y2);
    
    	cout <<"1. Addition zweier Matrizen\n"
    		<<"2. Skalarmultiplikation\n"
    		<<"3. Matrizenmultiplikation\n" 
    		<<"4. Berechnung der Transponierten einer Matrix\n"
    		<<"Funktion auswaehlen: ";
    
    	cin >> wahl;
    
    	switch(wahl)
    	{
    	case 1:
    		m1.add(m2);
    		break;
    	case 2:
    		skalar(m1, m2);   // FEHLER beim compilieren
    		break;
    	case 3:
    		multi(m1, m2);
    		break;	
    
    	}
    
    	return 0;
    }
    

    Fehlermeldung: "Ausdruck ergibt keine Funktion, die 2 Argumente übernimmt"

    Nun wollte ich mal die "neuen" Referenzen nutzen und es gibt Probleme. Kannste mir sagen, was ich da falsch gemacht habe? 😕



  • sheddy, du hast auch eine lokale Variable mit Namen 'skalar' deklariert, d.h. diese überdeckt dann die Funktion.
    Also lösche die Variable oder benenne sie um.



  • okay danke!
    Jetzt mal eine andere Frage. Nämlich zu "const"

    int bla(const Mensch &m1, const Mensch &m2)
    

    Ist das ein konstantes Objekt oder eine konstante Referenz.
    Es ist doch ein konstantes Objekt,oder?!

    void bla(matrix const&)
    

    Das ist doch das gegenteil,oder?!

    Hierbei handelt sich doch um eine konstante Referenz oder?!



  • Es gibt keine konstante Referenz. (Was sollte das auch ausdrücken?)

    const A und A const ist das gleiche.



  • rüdiger schrieb:

    Es gibt keine konstante Referenz. (Was sollte das auch ausdrücken?)

    😕
    Referenzen sind IMMER konstant.



  • okay danke



  • so, jetzt noch einmal mein ganzes Programm:

    Wir haben Vektoren noch nicht gehabt, deshalb habe ich die Aufgabe mit Arrays gelöst.

    Ich denke, ich bin soweit fertig und will eigentlich nur noch mal einen testlauf machen, jedoch bricht das programm bei der Initialisierung der zweiten Matrix immer ab.

    Zu erst der Quellcode dann ein Bild des Fehlers:

    matrix.h

    #ifndef MATRIX
    #define MATRIX
    
    class Matrix{
    public:
    	Matrix(const int = 0,const int = 0);
    	~Matrix();
    	Matrix(const Matrix &);
    
    private:
    	int line, col;
    	long number;
    	long **matrix;
    
    public:	
    	Matrix& operator=(const Matrix &);
    	void init();
    	void skalar();
    	//Matrix& operator+(const Matrix &);
    	//Matrix& operator*(const Matrix &);
    	void matAdd(const Matrix &);
    	void matMul(const Matrix &);
    	void transponiert();
    	void print() const;
    };
    
    #endif
    

    matrix.cpp

    #include <iostream>
    #include "matrix.h"
    
    using namespace std;
    
    Matrix::Matrix(const int spalte, const int zeile):col(spalte),line(zeile)
    {
    
    	matrix = new long* [col];		// |1|2|3|4|5|6|7|8|9|10|
    
    	cout << "\tKonstruktor:"<< col << " Spalten erstellt!" <<endl;
    
    	for(int i=0; i < col; i++){		// spalten runter = zeilen
    		matrix[i]= new long [line];	
    
    	}
    
    	cout << "\tKonstruktor: " << line << " Zeilen erstellt!" <<endl;
    }
    
    Matrix::Matrix(const Matrix &matrix2)
    {
    
    	if(this != &matrix2)
    	{
    		for(int i=0; i < col; i++)
    			delete matrix[i];
    
    		delete [] matrix;	
    
    		matrix = new long* [matrix2.col];		// |1|2|3|4|5|6|7|8|9|10|
    
    		for(int i=0; i < matrix2.col; i++)		// spalten runter = zeilen
    			matrix[i]= new long [matrix2.line];			
    	}
    }
    
    Matrix::~Matrix()
    {
    	for(int i=0; i < col; i++)
    		delete matrix[i];
    
    	cout << "\tDestruktor: Zeilen geloescht!" <<endl;
    
    	delete [] matrix;
    
    	cout << "\tDestruktor: Spalten geloescht!"<<endl;
    }
    
    Matrix& Matrix::operator =(const Matrix &matrix2)
    {
    	if(this != &matrix2)
    	{
    		for(int i=0; i < col; i++)
    			delete matrix[i];
    
    		delete [] matrix;	
    
    		matrix = new long* [matrix2.col];		// |1|2|3|4|5|6|7|8|9|10|
    
    		for(int i=0; i < matrix2.col; i++){		// spalten runter = zeilen
    			matrix[i]= new long [matrix2.line];	
    
    		}
    	}
    
    	return *this;
    }
    
    void Matrix::init()
    {
    	cout << "Spaltenweise Initialisierung:"<<endl;
    	for(int i =0; i<line; i++)
    	{
    		cout <<endl;
    		for(int k=0;k<col;k++)
    		{
    			cout <<"Position ["<< i <<"][" << k << "]: ";
    			cin >> number;
    			matrix[i][k]= number;			
    		}		
    	}
    }
    
    void Matrix::skalar()
    {
    	int faktor;
    	cout << "Skalar eingeben: ";
    	cin >> faktor;
    
    	for(int i=0;i<col;i++)
    		for(int k=0;k<line;k++)
    			matrix[i][k]=faktor*matrix[i][k];
    
    }
    
    void Matrix::matAdd(const Matrix &matrix2) 
    {
    	if(col == matrix2.col && line == matrix2.line)
    	{
    		for(int i=0;i<line;i++)
    			for(int k=0;k<col;k++)					
    				matrix[i][k]+=matrix2.matrix[i][k];		
    	}
    	else
    		cout<< "Berechnung leider nicht möglich!"<<endl;
    }
    
    //Das Produkt zweier Matrizen ist nur dann definiert, 
    //wenn die Anzahl der Spalten der ersten Matrix gleich der Anzahl der linen der zweiten Matrix ist. A*B != B*A
    void Matrix::matMul(const Matrix &matrix2)
    {
    	long temp;
    	int col_new, line_new;
    	int line,col;
    	int x,y;
    
    	if(this->col == matrix2.line)
    	{
    		line=col=x=y=0;
    		col_new=line_new= (this->line*matrix2.col)/2;
    		Matrix matrix_new(col_new,line_new);
    
    		for(int i=0;i<this->line;i++)
    		{
    			temp=0;
    			col=0;
    			line++;
    			y=0;
    			for(int k=0;k<this->col;k++)
    			{				
    				temp+=matrix[i][k]*(matrix2.matrix[x][y]);
    
    				if(k==matrix2.line-1)
    				{
    					matrix_new.matrix[line][col]=temp;				//if(col != col_new-1)
    					col++;
    					if(y != matrix2.col-1)							
    					{							
    						k=temp=x=0;
    						y++;
    					}
    				}
    				x++;				
    			}
    
    		}
    
    		*this=matrix_new;
    	}
    	else
    		cout<< "Berechnung leider nicht möglich!"<<endl;
    
    }
    
    void Matrix::transponiert()
    {
    	Matrix matrix_new(line,col);
    
    	for(int i=0;i<line; i++)
    		for(int k=0; k <col; k++)
    		{
    			matrix_new.matrix[k][i]=matrix[i][k];
    		}
    
    	*this=matrix_new;	
    }
    
    void Matrix::print() const
    {
    	for(int i=0;i<line;i++)
    	{
    		for(int k=0;k<col;k++)
    		{
    			cout << " "<<matrix[i][k]; 
    		}
    		cout <<endl;
    	}
    }
    

    main.cpp

    #include <iostream>
    #include "matrix.h"
    
    using namespace std;
    
    void trans(Matrix &m1, Matrix &m2)
    {
    	int choice;
    	cout << "Matrix auswaehlen"<<endl;
    	cout << "1. Matrix 1"<<endl;
    	cout << "2. Matrix 2" <<endl;
    	cin >> choice;
    	if(choice==1)
    		m1.transponiert();
    	else if(choice == 2)
    		m2.transponiert();
    }
    
    void matrixskalar(Matrix &m1, Matrix &m2)
    {
    	int choice;
    	cout << "Matrix auswaehlen"<<endl;
    	cout << "1. Matrix 1"<<endl;
    	cout << "2. Matrix 2" <<endl;
    	cin >> choice;
    	if(choice==1)
    		m1.skalar();
    	else if(choice==2)
    		m2.skalar();
    }
    
    void multi(Matrix &m1, Matrix &m2)
    {
    	int choice;
    	cout << "1. A*B"<<endl;
    	cout << "2. B*A" <<endl;
    	cin >> choice;
    
    	if(choice==1)
    		m1.matMul(m2);
    	else if(choice == 2)
    		m2.matMul(m1);
    }
    
    int main (void)
    {
    	int x, y;
    	int choice=0;
    
    	cout << "1. Matrix Spalten: ";
    	cin >> x;
    	cout << "1. Matrix Zeilen: ";
    	cin >> y;
    
    	Matrix m1(x,y);
    	m1.init();
    
    	cout << "2. Matrix Spalten: ";
    	cin >> x;
    	cout << "2. Matrix Zeilen: ";
    	cin >> y;
    
    	Matrix m2(x,y);	
    	m2.init();
    
    	cout <<"1. Addition zweier Matrizen\n"
    		<<"2. Skalarmultiplikation\n"
    		<<"3. Matrizenmultiplikation\n" 
    		<<"4. Berechnung der Transponierten einer Matrix\n"
    		<<"Funktion auswaehlen: ";
    
    	cin >> choice;
    
    	switch(choice)
    	{
    	case 1:
    		m1.matAdd(m2);
    		break;
    	case 2:
    		matrixskalar(m1, m2);
    		break;
    	case 3:
    		multi(m1, m2);
    		break;	
    	case 4:
    		trans(m1,m2);
    		break;	
    	}
    
    	m1.print();
    	m2.print();
    
    	return 0;
    }
    

    Fehler

    Finde den Fehler nicht. 😕



  • einer der Fehler:

    matrix_new.matrix[k][i]=matrix[i][k];
    

    ...



  • nee, das habe ich bewusst so gemacht, weil die transponierte matrix eben transponiert ist!

    also 1. zeile in die 1. spalte.

    aber bis dahin komme ich ja nicht einmal.

    es muss ja schon irgendwo am anfang bei der initialisierung liegen!


  • Mod

    Sieht nicht so aus, als ob Kopierkonstruktor oder Zuweisungsoperator irgendwas kopieren.



  • hast recht, ändert trotzdem nix an meinem problem 😞


  • Mod

    matrix[i][k]= number;
    

    bei soviel code, bei dem man scrollen muss, schreib allen Text darüber oder darunter aber nicht sowohl als auch. sonst liest man schnell nur einen Teil...



  • ich überarbeite erst mal alles...habe ziemlich viele fehler gefunden 😕


Anmelden zum Antworten