000
28.11.2007, 19:54 Uhr
power
|
Moin!
Ich habe folgende Aufgabe:
Zitat: |
In dieser Aufgabe sollen Sie eigenständig aus einer gegeben Problemstellung eine Klasse Matrix implementieren. Die Klasse Matrix soll eine zweidimensionale Matrix enthalten und folgenden Operationen ermöglichen: • Addition zweier Matrizen • Skalarmultiplikation • Matrizenmultiplikation • Berechnung der Transponierten einer Matrix
Die Matrix enthält nur Elemente vom Typ long. Um diese Aufgabe zu lösen gehen Sie wie folgt vor: 1. Rufen Sie sich die mathematischen Hintergrund in Erinnerung 2. Überlegen Sie sich welche Attribute und Funktionen benötigt werden 3. Zeichnen Sie ein Diagramm Ihrer Klasse 4. Implementieren Sie Ihre Klasse 5. Schreiben Sie ein geeignetes Hauptprogramm, welches die Funktionen Ihrer Klasse demonstriert.
|
mein Programm sieht jetzt wie folgt aus:
matrix.h
C++: |
#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
C++: |
#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 << "Zeilenweise Initialisierung:"<<endl; for(int i =0; i<line; i++) { for(int k=0;k<col;k++) { cout <<"Position ["<< i <<"][" << k << "]: "; cin >> number; matrix[i][k]= number; } cout <<endl; } }
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
C++: |
#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 << "\n2. 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; }
|
Ich will nun noch ein paar testläufe starten um die einzelnen funktionen zu testen.
Jedoch komme ich nicht einmal bis zur Auswahl der verschiedenen funktionen.
Ich gebe z.b. Beispiel diese Werte ein, die unter Matrizenmultiplikation stehen ein. Matrizen Zahlen
Jeodch bei der Initialiserung der zweiten Matrix stürzt mir das Programm ab. Manchmal funktioniert es, aber nicht mit diesen zahlen.
hier ist ein Bild des Fehlers: Fehler
Kann mir jemand sagen, wo der fehler liegt? Beim compilieren gibt es keinen Fehler, erst während der laufzeit. |