Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2010, 15:59   #1
Мари_Ланвейн
 
Регистрация: 20.05.2010
Сообщений: 4
Сообщение С++ (операторы)

программа, которая выполняет действия над матрицами, проблема в том, что только над квадратными, если вводить разную размерность строк и столбцов, то при умнажении матрицы на число программа вылетает
подскажите, что сделать, чтобы можно было работать с матрицами любого размера

вот код:
Код:
#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;
}

Последний раз редактировалось ACE Valery; 23.12.2010 в 21:11.
Мари_Ланвейн вне форума Ответить с цитированием
Старый 23.12.2010, 20:35   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Конструктор Matrix(x, y), а в operator* вызывается Matrix(y, x). И не забывай delete mas в деструкторе.
Somebody вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Операторы ( с ++) violettta Фриланс 13 10.12.2010 14:01
Операторы Viconte Помощь студентам 5 01.11.2010 16:34
Операторы выбора в С++ icejoker Помощь студентам 0 27.12.2009 17:15
операторы цикла pilot76 Помощь студентам 4 10.09.2009 19:08