программа, которая выполняет действия над матрицами, проблема в том, что только над квадратными, если вводить разную размерность строк и столбцов, то при умнажении матрицы на число программа вылетает
подскажите, что сделать, чтобы можно было работать с матрицами любого размера
вот код:
Код:
#include <iostream>
#include <algorithm>
#include <time.h>
using namespace std;
class Matrix
{
private:
int x, y; //x-ширина, y-высота
float **mas;
public:
//конструкторы
Matrix (void); //без параметров
Matrix (int x_, int y_); //с параметрами
Matrix (Matrix &A); //копировщик
~Matrix();//деструктор
//функции
void init_rand (int min, int max);// 1) функция заполнения рандомом (-100, 100)//
//перегрузка операторов
Matrix operator =(Matrix A);
Matrix operator +(Matrix A);
Matrix operator *(float a);
Matrix operator ^(Matrix A);
friend Matrix operator * (float a, Matrix A);
friend ostream & operator <<(ostream & str, Matrix A);
friend istream & operator >>(istream & str, Matrix &A);
};
Matrix::Matrix()
{
cout << "enter x,y:"<< endl;
cin >> x >> y;
mas = new float *[y];
for (int i=0; i<y; i++)
{
mas[i] = new float [x];
}
}
Matrix::Matrix(int x_, int y_)
{
x = x_;
y = y_;
mas = new float *[y];
for (int i=0; i<y; i++)
{
mas[i] = new float [x];
}
}
Matrix::Matrix(Matrix &A)
{
int i, j;
x = A.x;
y = A.y;
mas = new float *[y];
for (int i=0; i<y; i++)
{
mas[i] = new float [x];
}
for (i=0; i<y; i++)
{
for (j=0; j<x; j++)
{
mas[i][j] = A.mas[i][j];
}
}
}
Matrix::~Matrix()
{
for (int i=0; i<y; i++)
{
delete[] mas[i];
}
}
void Matrix::init_rand (int min, int max)
{
for (int j = 0; j < y; j++)
{
for (int i = 0; i < x; i++)
{
mas[j][i] = rand()%(max+1-min) + min + 1./(rand()%1+1);
}
}
}
Matrix Matrix:: operator =(Matrix A)
{
int i, j;
for(i=0; i<y; i++)
{
delete[] mas[i];
}
y=A.y;
x=A.x;
mas=new float *[y];
for (i=0; i<y; i++)
{
mas[i]=new float[x];
}
for (i=0; i<y; i++)
{
for (j=0; j<x; j++)
{
mas[i][j]=A.mas[i][j];
}
}
return *this;
}
Matrix Matrix:: operator +(Matrix A)
{
if ((x!=A.x)||(y!=A.y))
{
cout << "MATRIZI HAVE DIFFERENT SIZE,ADD NEVOZMOZHNO " << endl;
return *this;
}
else
{
Matrix mas_return(x, y);
for (int i=0; i<y; i++)
{
for (int j=0; j<x; j++)
{
mas_return.mas[i][j] = mas[i][j] + A.mas[i][j];
}
}
return mas_return;
}
}
Matrix Matrix:: operator *(float a)
{
int i,j;
Matrix mas_return (y,x);
for (i=0; i<y; i++)
{
for (j=0; j<x; j++)
{
mas_return.mas[i][j]=mas[i][j]*a;
}
}
return mas_return;
}
Matrix operator * (float a, Matrix A)
{
int i,j;
Matrix mas_return(A.y,A.x);
for (i=0; i<A.y; i++)
{
for (j=0; j<A.x; j++)
{
mas_return.mas[i][j]=a*A.mas[i][j];
}
}
return mas_return;
}
Matrix Matrix:: operator ^(Matrix A)
{
int i, j;
for(i=0; i<y; i++)
{
delete[] mas[i];
}
x = A.y;
y = A.x;
mas=new float *[y];
for (i=0; i<y; i++)
{
mas[i]=new float[x];
}
for (i=0; i<y; i++)
{
for (j=0; j<x; j++)
{
mas[i][j] = A.mas[j][i];
}
}
return *this;
}
ostream & operator <<(ostream & str, Matrix A)
{
int i,j;
for (i=0; i<A.y;i++)
{
for (j=0;j<A.x;j++)
{
str.width(2);
str << A.mas[i][j] << "\t" ;
}
str << endl;
}
str << endl;
return str;
}
istream & operator >> (istream & str, Matrix &A)
{
int i,j;
cout << "VVEDITE MATRIZY " << endl;
for (i=0; i<A.y; i++)
{
for(j=0; j<A.x; j++)
{
str >> A.mas[i][j];
}
}
return str;
}
int main()
{
srand( (unsigned)time( NULL ) );
Matrix A;
A.init_rand(0, 9);
cout << A << endl;
A ^ A;
cout <<"TRANSPONIROVANNAYA MATRIZA:" << endl << A << endl;
Matrix B;
B.init_rand(0, 9);
cout << B << endl;
A = A + B;
cout << "MATRIZA A=A+B: "<< endl << A << endl;
cout << "enter a: " << endl;
int a;
cin >> a;
A=A*a;
cout << A;
A=a*A;
cout << A;
return 0;
}