Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > Помогите решить задачку


Автор: recruit 18.11.2005, 03:26
Надо написать

Классы для операций (арифметических, обращения, транспонирования) с двумерными матрицами.

может у кого есть готовые, буду благодарен.

Автор: sergejzr 18.11.2005, 03:29
Это хорошая возможность набрать опыта в ООП. Советую сделать самому smile.

Перенесу эту домашку в центр помощи

Автор: darkart 18.11.2005, 14:42
Вот, вроде бы так...
Файл заголовка "Matrix.h":
Код

const int iDimension=2;
class CMatrix
{
private:
        float Data[iDimension][iDimension];
public:
        CMatrix();
        ~CMatrix(){}
        float Determinant();
        friend CMatrix operator+(CMatrix&,CMatrix&);
        friend CMatrix operator-(CMatrix&,CMatrix&);
        friend CMatrix operator-(CMatrix&);
        friend CMatrix operator*(CMatrix&,CMatrix&);
        friend CMatrix operator*(float,CMatrix&);
        friend CMatrix operator*(CMatrix&,float);
        friend CMatrix operator/(CMatrix&,float);
        friend CMatrix operator!(CMatrix&);
        friend CMatrix operator~(CMatrix&);
        void InputMatrix();
        void PrintMatrix();
};

Фйл "Matrix.cpp":
Код

#include<iostream.h>
#include"Matrix.h"
CMatrix::CMatrix()
{
        for(int i=0;i<iDimension;i++)
                for(int j=0;j<iDimension;j++)
                        Data[i][j]=0;
}
void CMatrix::InputMatrix()
{
        cout<<"Please enter matrix("<<iDimension<<"x"<<iDimension<<"):\n";
        for(int i=0;i<iDimension;i++)
                for(int j=0;j<iDimension;j++)
                        cin>>Data[i][j];
}
void CMatrix::PrintMatrix()
{
        for(int i=0;i<iDimension;i++)
        {
                for(int j=0;j<iDimension-1;j++)
                        cout<<Data[i][j]<<" ";
                cout<<Data[i][iDimension-1]<<"\n";
        }
}
CMatrix operator +(CMatrix& a,CMatrix& b)
{
        CMatrix Result;
        for(int i=0;i<iDimension;i++)
                for(int j=0;j<iDimension;j++)
                        Result.Data[i][j]=a.Data[i][j]+b.Data[i][j];
        return Result;
}
CMatrix operator -(CMatrix& a,CMatrix& b)
{
        return a+((-1)*b);
}
CMatrix operator -(CMatrix& a)
{
        return a*(-1);
}
CMatrix operator *(CMatrix& a,CMatrix& b)
{
        CMatrix Result;
        for(int i=0;i<iDimension;i++) 
                for(int j=0;j<iDimension;j++)
                        for(int k=0;k<iDimension;k++)
                                Result.Data[i][j]=Result.Data[i][j]+a.Data[i][k]*b.Data[k][j]; 
        return Result;
}
CMatrix operator *(float a,CMatrix& b)
{
        CMatrix Result;
        for(int i=0;i<iDimension;i++)
                for(int j=0;j<iDimension;j++)
                        Result.Data[i][j]=a*b.Data[i][j];
        return Result;        
}
CMatrix operator *(CMatrix& a,float b)
{
        return b*a;        
}
CMatrix operator /(CMatrix& a,float b)
{
        return (1/b)*a;
}
float CMatrix::Determinant()
{ 
        return Data[0][0]*Data[1][1]-Data[0][1]*Data[1][0];
}
CMatrix operator !(CMatrix& a)
{
        CMatrix Result;
        for(int i=0;i<iDimension;i++)
                for(int j=0;j<iDimension;j++)
                        Result.Data[i][j]=a.Data[j][i];
        return Result;        
}
CMatrix operator ~(CMatrix& a)
{        
        CMatrix Result;
        float m=1/a.Determinant();
        Result.Data[0][0]=a.Data[1][1];
        Result.Data[0][1]=-a.Data[1][0];
        Result.Data[1][0]=-a.Data[0][1];
        Result.Data[1][1]=a.Data[0][0];
        Result=(!Result)*m;
        return Result;
}

P. S.
Работает только с матрицами 2x2, если нужна другая размерность. то нужно переписать ф-цию нахождения определителя и операцию нахождения обратной матрицы.
Так же не проверяется равенство определителя 0.
P. P. S.
Если, что не так пиши.

Автор: Pakshin A. S. 18.11.2005, 19:59
Это нуно привязать к конкретному языку программирвоания или просто словами?

Автор: darkart 18.11.2005, 20:43
Писал же уже вроде...:
Вот примерно так...
файл заголовка "Matrix.h":
Код

const int iDimension=2;
class CMatrix
{
private:
        float Data[iDimension][iDimension];
public:
        CMatrix();
        ~CMatrix(){}
        float Determinant();
        friend CMatrix operator+(CMatrix&,CMatrix&);
        friend CMatrix operator-(CMatrix&,CMatrix&);
        friend CMatrix operator-(CMatrix&);
        friend CMatrix operator*(CMatrix&,CMatrix&);
        friend CMatrix operator*(float,CMatrix&);
        friend CMatrix operator*(CMatrix&,float);
        friend CMatrix operator/(CMatrix&,float);
        friend CMatrix operator!(CMatrix&);
        friend CMatrix operator~(CMatrix&);
        void InputMatrix();
        void PrintMatrix();
};

Файл "Matrix.cpp"
Код

#include<iostream.h>
#include"Matrix.h"
CMatrix::CMatrix()
{
        for(int i=0;i<iDimension;i++)
                for(int j=0;j<iDimension;j++)
                        Data[i][j]=0;
}
void CMatrix::InputMatrix()
{
        cout<<"Please enter matrix("<<iDimension<<"x"<<iDimension<<"):\n";
        for(int i=0;i<iDimension;i++)
                for(int j=0;j<iDimension;j++)
                        cin>>Data[i][j];
}
void CMatrix::PrintMatrix()
{
        for(int i=0;i<iDimension;i++)
        {
                for(int j=0;j<iDimension-1;j++)
                        cout<<Data[i][j]<<" ";
                cout<<Data[i][iDimension-1]<<"\n";
        }
}
CMatrix operator +(CMatrix& a,CMatrix& b)
{
        CMatrix Result;
        for(int i=0;i<iDimension;i++)
                for(int j=0;j<iDimension;j++)
                        Result.Data[i][j]=a.Data[i][j]+b.Data[i][j];
        return Result;
}
CMatrix operator -(CMatrix& a,CMatrix& b)
{
        return a+((-1)*b);
}
CMatrix operator -(CMatrix& a)
{
        return a*(-1);
}
CMatrix operator *(CMatrix& a,CMatrix& b)
{
        CMatrix Result;
        for(int i=0;i<iDimension;i++) 
                for(int j=0;j<iDimension;j++)
                        for(int k=0;k<iDimension;k++)
                                Result.Data[i][j]=Result.Data[i][j]+a.Data[i][k]*b.Data[k][j]; 
        return Result;
}
CMatrix operator *(float a,CMatrix& b)
{
        CMatrix Result;
        for(int i=0;i<iDimension;i++)
                for(int j=0;j<iDimension;j++)
                        Result.Data[i][j]=a*b.Data[i][j];
        return Result;        
}
CMatrix operator *(CMatrix& a,float b)
{
        return b*a;        
}
CMatrix operator /(CMatrix& a,float b)
{
        return (1/b)*a;
}
float CMatrix::Determinant()
//определитель
{ 
        return Data[0][0]*Data[1][1]-Data[0][1]*Data[1][0];
}
CMatrix operator !(CMatrix& a)
//транспонированная матрица
{
        CMatrix Result;
        for(int i=0;i<iDimension;i++)
                for(int j=0;j<iDimension;j++)
                        Result.Data[i][j]=a.Data[j][i];
        return Result;        
}
CMatrix operator ~(CMatrix& a)
//обратная матрица
{        
        CMatrix Result;
        float m=1/a.Determinant();
        Result.Data[0][0]=a.Data[1][1];
        Result.Data[0][1]=-a.Data[1][0];
        Result.Data[1][0]=-a.Data[0][1];
        Result.Data[1][1]=a.Data[0][0];
        Result=(!Result)*m;
        return Result;
}

P. S.
Работает только для размерности = 2. Для иной размерности нужно переписать ф-цию нахождения определителя и операцию по нахождению обратной матрицы.

Автор: darkart 18.11.2005, 22:22
Блин, думал глюки, вот такая же http://forum.vingrad.ru/index.php?showtopic=71181

Автор: recruit 19.11.2005, 01:03

Цитата(lonely @ 18.11.2005, 19:59)
Это нуно привязать к конкретному языку программирвоания или просто словами?


да к С++

Добавлено @ 01:04
Цитата(darkart @ 18.11.2005, 20:43)
Писал же уже вроде...:
Вот примерно так...
файл заголовка "Matrix.h":

код C++



Надо n/n помоги с определителем, если сможешь, пожалуйста

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)