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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2018, 23:52   #1
TSwallow
Пользователь
 
Регистрация: 13.11.2018
Сообщений: 29
Вопрос Нужна помощь. Программа сложения динамических матриц на с++.

В консоли не получается ввести элементы матрицы (Программа просто пропускает этот момент). Помогите пж решить эту проблему

Код:
#include "pch.h"
#include <iostream>
using namespace std;

class matrix
{
	double **a;
	int n, m;
public:
	matrix() 
	{
		a = new double*[n];
		for (int i = 0; i < n; i++)
		{
			a[i] = new double[m];
		}
	}
	
	void vvod()// Ввод строк и колонок
	{
		cout << "Введите количество строк: " << endl;
		cin >> n;
		cout << endl;
		cout << "Введите количество колонок: " << endl;
		cin >> m;
		cout << endl;
	}

	void mvvod()// Ввод матриц
	{
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < m; j++)
			{
				cin >> a[i][j];
			}
		}
		cout << endl;
	}

	matrix operator + (matrix x) // прегрузка для сложения
	{
		matrix c; // для удержания элемента
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < m; j++)
			{
				c.a[i][j] = 0;
				c.a[i][j] += x.a[i][j];
			}
		}
		return(c);
	}

	void conclusion()// Вывод ответа
	{
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < m; j++)
			{
				cout << " " << a[i][j] << " ";
			}
		}
		cout << endl;
	}

	~matrix()
	{
		for (int i = 0; i < n; i++)
			delete[]a[i];
		delete[]a;
	}

};
	int main()
	{
		setlocale(LC_ALL, "Russian");
		matrix a1, a2, a, b, c;
		a1.vvod();									// Ввод строк и колонок											
		cout << "Введите матрицу а: " << endl;
		a.mvvod();	// Вводит матрицу а
		cout << endl;
		
		a2.vvod();									// Ввод строк и колонок
		cout << "Введите матрицу b: " << endl;
		b.mvvod();	// Вводит матрицу б
		c = a + b;
		
		c.conclusion();								// Вывод ответа
	}

Последний раз редактировалось BDA; 14.11.2018 в 02:33.
TSwallow вне форума Ответить с цитированием
Старый 14.11.2018, 01:02   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Вы неправильно работаете с размерностью матриц. Сейчас Вы сначала размещаете матрицы и выделяете память под них, а потом только запрашиваете размер, да и то только для одной из матриц.
Black Fregat вне форума Ответить с цитированием
Старый 14.11.2018, 02:33   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Используйте кнопку # для оформления кода. Вторую тему удалил как кросспост.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 14.11.2018, 18:48   #4
TSwallow
Пользователь
 
Регистрация: 13.11.2018
Сообщений: 29
Восклицание Помогите исправить ошибку!!!

Необработанное исключение по адресу 0x00007FF8D02244EE (ucrtbased.dll) в TestMatrix2.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFFFFFFFFFFFFFFFF.

Код:
#include "pch.h"
#include <iostream>

using namespace std;

class matrix
{
	double **a;
	int n, m;
	
public:
	matrix(int row, int col);
	void vvod();
	void mvvod();
	matrix operator + (const matrix &x);
	void conclusion();
	~matrix();
};
	matrix::matrix(int row, int col)
	{
		int n = row; int m = col;
		a = new double*[n];
		for (int i = 0; i < n; i++)
		{
			a[i] = new double[m];
		}
	}

	void matrix::vvod()// Ввод строк и колонок
	{
		cout << "Введите количество строк: ";
		cin >> n;
		cout << endl;
		cout << "Введите количество колонок: ";
		cin >> m;
		cout << endl;
	}

	void matrix::mvvod()// Ввод матриц
	{
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < m; j++)
				cin >> a[i][j];
		}
		cout << endl;
	}
	void matrix::conclusion()// Вывод ответа
	{
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < m; j++)
			{
				cout << " " << a[i][j] << " ";
			}
		}
		cout << endl;
	}

	matrix matrix::operator + (const matrix &x) // прегрузка для сложения
	{
		matrix с(*this); // для удержания элемента
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < m; j++)
			{
				с.a[i][j] = 0;
				с.a[i][j] = x.a[i][j] + a[i][j];
			}
		}
		return(с);
	}

	matrix::~matrix()
	{
		for (int i = 0; i < n; i++)
			delete[]a[i];
		delete[]a;
	}

int main()
{
	setlocale(LC_ALL, "Russian");
	
	matrix a(3, 3), b(3, 3), c(3, 3);
	
	a.vvod();									// Ввод строк и колонок											
	cout << "Введите матрицу а: " << endl;
	a.mvvod();	// Вводит матрицу а
	cout << endl;

	b.vvod();									// Ввод строк и колонок
	cout << "Введите матрицу b: " << endl;
	b.mvvod();	// Вводит матрицу б
	c = a + b;
	
	cout << "Сумма: " << endl;
	c.conclusion();								// Вывод ответа
}
TSwallow вне форума Ответить с цитированием
Старый 14.11.2018, 19:27   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Какие именно данные вы вводите при запуске?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 14.11.2018, 21:08   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Код:
		int n = row; int m = col;
		a = new double*[n];
		for (int i = 0; i < n; i++)
		{
			a[i] = new double[m];
		}
Это что за ... копипаста? Вы размерность не сохраняете.

И главное - пишите конструктор копирования. Вы два раза удаляете массив, т.к. копируете указатель.
p51x вне форума Ответить с цитированием
Старый 14.11.2018, 21:57   #7
TSwallow
Пользователь
 
Регистрация: 13.11.2018
Сообщений: 29
Подмигивание Нормально всё. Я сам решил уже)

Я ЛОХОНУЛСЯ И ОНА РАБОТАЕТ НЕ ПРАВИЛЬНО
Код:
#include "pch.h"
#include <iostream>
using namespace std;

class matrix
{
private:
	double **a;
	int n, m;
	unsigned int rows; unsigned int cols;
public:
	matrix() { int c, g; };
	matrix(unsigned int rows, unsigned int cols);
	void set();
	void print();
	matrix operator + (const matrix x);
	~matrix();
};

	matrix::matrix(unsigned int rows, unsigned int cols)
	{
		n = rows; m = cols;
		a = new double*[n];
		for (int i = 0; i < n; i++)
			a[i] = new double[m];
	}
	matrix::~matrix(){};


	void matrix::set() // Заполение 
	{
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < m; j++)
			{
				cin >> a[i][j];
			}
		}
		cout << endl;
	}

	void matrix::print() // Вывод 
	{
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < m; j++)
			{
				cout << " " << a[i][j] << " ";
			}
			cout << endl;
		}
	}

	matrix matrix::operator + (const matrix x)
	{
		matrix c(*this);
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < m; j++)
			{
				c.a[i][j] = x.a[i][j] + a[i][j];
			}
		}
		return c;
	}


int main()
{
	setlocale(LC_ALL, "Russian");
	matrix a1(3, 3), a2(3, 3),  c,  g;
	cout << "Введите матрицу а: " << endl;
	a1.set();
	cout << "Введите матрицу b: " << endl;
	a2.set();
	c = a1 + a2;

	cout << "Сумма: " << endl;
	c.print();

	system("Pause");
	return 0;
}

Последний раз редактировалось TSwallow; 14.11.2018 в 22:25.
TSwallow вне форума Ответить с цитированием
Старый 14.11.2018, 22:09   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Ну да, память не чистим - прога не падает - профит... Я б такой код завернул и отправил думать.
p51x вне форума Ответить с цитированием
Старый 14.11.2018, 22:19   #9
TSwallow
Пользователь
 
Регистрация: 13.11.2018
Сообщений: 29
По умолчанию


Забыл память удалить и она заработала)))
Вот я дурак
Пойду повешусь

Последний раз редактировалось TSwallow; 14.11.2018 в 22:36.
TSwallow вне форума Ответить с цитированием
Старый 23.11.2018, 20:40   #10
TSwallow
Пользователь
 
Регистрация: 13.11.2018
Сообщений: 29
Печаль Застрял на этой теме. Никак не разберусь как это в классах делать.

В чём моя ошибка? Никак не получается сделать без краша.
Код:

#include "pch.h"
#include <iostream>
#include <fstream>

using namespace std;

class matrix {
protected:
	double **a;
	size_t n, m;

public:
	matrix() : a(nullptr), n(0), m(0) { };

	void allocate(size_t rows, size_t cols);
	void read(istream &ifst);
	void write(ostream &ofst);

	void check_allocated() const {
		if (a == nullptr)
			throw runtime_error("память не выделена");
	}

	size_t rows() const {
		check_allocated();
		return n;
	}

	size_t cols() const {
		check_allocated();
		return m;
	}

	void clear() {
		for (size_t i = 0; i < n; i++)
			delete[] a[i];
		delete[] a;
	}

	matrix operator + (const matrix& rhs);
	~matrix();
};

matrix::~matrix() {
	if (a == nullptr)
		return;
	
		clear();
}

void matrix::allocate(size_t rows, size_t cols) {
	if (nullptr != a) {
		clear();
	}

	n = rows; m = cols;
	a = new double*[n];
	for (int i = 0; i < n; i++)
		a[i] = new double[m];
}

void matrix::read(istream &ifst) {
	check_allocated();
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			ifst >> a[i][j];
		}
	}
}

void matrix::write(ostream &ofst) {
	check_allocated();
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			ofst << " " << a[i][j] << " ";
		}
		ofst << endl;
	}
}

matrix matrix::operator + (const matrix& rhs)
{
	check_allocated();
	rhs.check_allocated();

	if (n != rhs.rows() || m != rhs.cols())
		throw runtime_error("размер матрицы должен быть равен");

	matrix c;
	c.allocate(n, m);
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			c.a[i][j] = rhs.a[i][j] + a[i][j];
		}
	}

	return c;
}



int main()
{
	setlocale(LC_ALL, "Russian");

	matrix a1, a2, c;
	a1.allocate(3, 3);
	a2.allocate(3, 3);

	cout << "<ДЛЯ БИНАРНОЙ СУММЫ> " << endl;
	cout << "Введите матрицу а: " << endl;
	a1.read(std::cin);
	cout << "Введите матрицу b: " << endl;
	a2.read(std::cin);
	cout << endl;

	c = a1 + a2;

	cout << "Сумма(бинарная): " << endl;
	c.write(std::cout);
	cout << endl;

	system("Pause");
}
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