Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Matrizen-Rechnungen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.11.2007, 20:26 Uhr
0xdeadbeef
Gott
(Operator)


Du hast bei der Initialisierung Spalten und Zeilen vertauscht. Du alloziierst col arrays der Länge line, willst dann aber line arrays der Länge col benutzen, und das verursacht dann einen segfault.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.11.2007, 21:10 Uhr
xXx
Devil


ehm und cross-posting + korrekte und wesentlich bessere Klasse schon in anderem Forum.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: