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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2018, 21:25   #11
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Ошибка все таже - нет оператора присваивания и конструктора копирования. Вы два раза освобождаете одну и туже память.
p51x вне форума Ответить с цитированием
Старый 07.12.2018, 17:01   #12
TSwallow
Пользователь
 
Регистрация: 13.11.2018
Сообщений: 29
По умолчанию

Вроде правильно всё сделал.
Код:
#include <iostream>
#include <ctime>
#include <cassert>

using namespace std;

class matrix {
	friend ostream& operator << (std::ostream&, const matrix&); // используется для вывода в main
public:
	matrix(int row, int col);								
	~matrix();
	void fill();											
	matrix(const matrix& m);
	void show(matrix m);
	matrix operator + (const matrix& m);
	matrix operator * (const matrix& m);
	matrix operator = (const matrix& m);
protected:
	int r, c;
	int** mat;
};


matrix::matrix(int row, int col) : r(row), c(col) // конструктор
{
	srand(time(0));//используется для установки начала последовательности
	mat = new int*[r];// динамическое выделение памяти под объект типа int
	assert(mat); // assert используется для проверки при исполнении программы
	for (int i = 0; i < r; i++)
	{
		mat[i] = new int[c];
		assert(mat[i]); // assert используется для проверки при исполнении программы
	}
}

void matrix::fill() //Создание рандомной матрици. Использовал для того, чтобы не вводить матрици в ручную;
{
	for (int i = 0; i < this->r; i++)
	{
		for (int j = 0; j < this->c; j++)
		{
			this->mat[i][j] = rand() % 15 + 1;//Создаёт матрица из рандомных чисел
		}
	}
}

matrix::~matrix() //Деструктор
{
	for (int i = 0; i < r; i++)
	{
		delete[] mat[i];
	}
	delete[] mat;
}

ostream & operator << (ostream & out, const matrix & m) { // Оператор << используется для вывода матриц в main
	for (int i = 0; i < m.r; i++)
	{
		for (int j = 0; j < m.c; j++) {
			out << m.mat[i][j] << "\t";
		}
		out << endl;
	}
	return out;
}


matrix matrix::operator + (const matrix& m) // оператор бинарного сложения 
{
	matrix summ(m.r, m.c);// Удерживает значение
	for (int i = 0; i < m.r; i++)
	{
		for (int j = 0; j < m.c; j++)
		{
			summ.mat[i][j] = m.mat[i][j] + mat[i][j];
		}
	}
	return summ;
}


matrix matrix::operator * (const matrix& m) // Оператор умножения
{
	matrix pr(m.r, m.c);// Удерживает значение
	for (int i = 0; i < m.r; i++)
	{
		for (int j = 0; j < m.c; j++)
		{
			pr.mat[i][j] = { };//Зануляю матрицу для вывода
			for (int n = 0; n < m.c; n++)
			{
				pr.mat[i][j] += m.mat[i][n] * mat[n][j];
			}
		}
	}
	return pr;
}

matrix matrix::operator = (const matrix& m)// Оператор присваивания
{
	c = m.c;
	r = m.r;
	mat = new int*[r]; 
	assert(mat);
	for (int i = 0; i < r; i++)
	{
		mat[i] = new int[c];
		assert(mat[i]);
	}

	for (int i = 0; i < r; i++)
	{
		for (int j = 0; j < c; j++)
		{
			mat[i][j] = m.mat[i][j];//присваивание
		}
	}
	return *this;
}

matrix::matrix(const matrix& m)// Конструктор копирования
{
	c = m.c;
	r = m.r;
	
	mat = new int*[r];
	assert(mat);
	for (int i = 0; i < r; i++)
	{
		mat[i] = new int[c];
		assert(mat[i]);
	}

	for (int i = 0; i < r; i++)
	{
		for (int j = 0; j < c; j++)
		{
			mat[i][j] = m.mat[i][j];
		}
	}

}

void matrix::show(matrix m) // show используется для вывода ответов в main
{
	for (int i = 0; i < m.r; i++)
	{
		for (int j = 0; j < m.c; j++) {
			cout << m.mat[i][j] << "\t";//вывод mat с выравниванием табуляцией 
		}
		cout << endl;
	}
}

int main()
{
	setlocale(LC_ALL, "Russian");
	int row, col;
	cout << "Введите кол-во строк: " << endl;
	cin >> row;
	cout << "Введите кол-во колонок: " << endl;
	cin >> col;
	cout << endl;
	
	cout << "Матрица A: " << endl;
	matrix m(row, col);
	m.fill();
	cout << m << endl;

	cout << "Введите кол-во строк: " << endl;
	cin >> row;
	cout << "Введите кол-во колонок: " << endl;
	cin >> col;
	cout << endl;

	cout << "Матрица B: " << endl;
	matrix m2(row, col);
	m2.fill();
	cout << m2 << endl;
	
	cout << "Сумма" << endl;//Cложение
	matrix m3(row, col);
	m3 = m + m2;
	m3.show(m3);

	cout << "Произведение" << endl;//Умножение
	matrix h3(row, col);
	h3 = m * m2;
	h3.show(h3);
}
TSwallow вне форума Ответить с цитированием
Старый 07.12.2018, 17:04   #13
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Ассерты бесполезны. Обычный new кидает исключения. Либо используйте nothrow вариант, либо ловите исключения.
p51x вне форума Ответить с цитированием
Старый 07.12.2018, 17:21   #14
TSwallow
Пользователь
 
Регистрация: 13.11.2018
Сообщений: 29
По умолчанию

Окей
TSwallow вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перемножение произвольных матриц (Visual studio 2013 c++). Нужна помощь Sabiks Помощь студентам 2 07.11.2017 15:50
подпрограмма сложения двух матриц Pascal ABC программирование Помощь студентам 2 04.06.2013 14:07
программа с использованием динамических матриц fatefighter Помощь студентам 1 19.10.2010 08:27
класс динамических матриц zoluxa Общие вопросы C/C++ 1 16.04.2010 21:30