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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2009, 18:17   #1
ammaximus
 
Регистрация: 07.11.2006
Сообщений: 3
По умолчанию Конструктор, двумерный динам массив

Цитата:
Создать класс матрица Данный класс содержит указатель на double, размер строк и
столбцов и состояние ошибки. Определить конструктор без параметров, конструктор с
одним параметром и конструктор с двумя параметрами, деструктор. Определить методы
доступа: возвращать значение элемента (i,j) и адрес этого элемента. Определить функцию
печати. Определить функции сложения и вычитания (матрицы с матрицей), умножение
матрицы на матрицу. Определить умножение матрицы на число. Проверить работу этого
класса. В случае нехватки памяти, несоответствия размерностей, выхода за пределы
устанавливать код ошибки.
На этом месте я застрял. Помогите исправить ошибки и закончить.
Код:
#include <iostream.h>

class  matrix
	double *p;	
	int row;
	int column;
	bool flag;
	
public:
	matrix(){
		p=new double[1][1];
		p[0][0]=0.0;
		flag=false;
	}

	matrix (int i){
		column=i;
		row=j;
		p=new double [i][7];
		for (i=0; i<num; i++) for (int j=0; j<num; j++) p[i][j]=0.0;
		flag=false;
	}

	matrix (int i; int j){
		column=i;
		row=j;
		p=new double [i][j];
		for (i=0; i<num; i++) for (j=0; j<num; j++) p[i][j]=0.0;
		flag=false;
	}
	
	~matrix(){
		delete [] p;
	}

	float get(int i, int j){
	
		return p[i][j];
	}

	
	
	void print(){
		for (int i=0; i<num; i++) {
			for (int j=0; j<num; j++) cout << p[i][j];
			cout << endl;
		}
	};


	}

	void add(matrix target_matrix){
		for (int i=0; i<num; i++) for (int j=0; j<num; j++)  this->p[i][j]+=target_matrix.get(i,j)
	};

	void sub(matrix target_matrix){
		for (int i=0; i<num; i++) for (int j=0; j<num; j++)  this->p[i][j]-=target_matrix.get(i,j)
	};

	void mul(matrix target_matrix){
		for (int i=0; i<num; i++) for (int j=0; j<num; j++)  this->p[i][j]*=target_matrix.get(i,j)
	};
	void mul(int digit){
		for (int i=0; i<num; i++) for (int j=0; j<num; j++)  this->p[i][j]*=digit;
	};





};
int main(){
	matrix a;
	matrix b(7);
	matrix c(4,8);
	b.print();
	b.add(c,1,1);
	b.print();
	b.mul(c,1,1);

	return 0;
}
ammaximus вне форума Ответить с цитированием
Старый 29.01.2009, 20:14   #2
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Вопрос в студию. Где ошибки и какие именно.

ПыСы: в конструкторе список параметров пишется черз запятую
Код:
matrix (int i, int j){
MaTBeu вне форума Ответить с цитированием
Старый 29.01.2009, 20:15   #3
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

вот пример дальше сам делай
Код:
#include <iostream>
using namespace std;

class matrix
{
public:
	matrix():row(1),col(1)
	{
		m_matrix = arrCreate(row,col);
		m_matrix[0][0] = 0.0;
	}
	matrix(int _row,int _col): row(_row), col(_col)
	{
		m_matrix = arrCreate(row,col);
		for(int i = 0; i < row; ++i)
			for(int j = 0; j < col; ++j)
				m_matrix[i][j] = 0.0;
	}
	matrix(int x): row(x), col(x)
	{
		m_matrix = arrCreate(row,col);
		for(int i = 0; i < row; ++i)
			for(int j = 0; j < col; ++j)
				m_matrix[i][j] = 0.0;
	}
	~matrix()
	{
		arrFree(m_matrix,this->row);
	}

	//доступ к елементу матрицы
	double &Elem(int i,int j)
	{
		return m_matrix[i][j];
	}

	//доступ к елементу матрицы
	double &operator ()(int i,int j)
	{
		return Elem(i,j);
	}

	void outMatrix()
	{
		arrOut(m_matrix,row,col);
	}
private:
	double **arrCreate(int _row, int _col)
	{
		double **arr = new double*[_row];
		for(int i = 0; i < _row; ++i)
			arr[i] = new double[_col];
		return arr;
	}
	void arrFree(double **arr,int _row)
	{
		for(int i = 0; i < _row; ++i)
			delete[] arr[i];
		delete[] arr;
	}

	void arrOut(double **arr, int _row, int _col) const
	{
		for(int i = 0; i < _row; ++i)
		{
			cout<<"[ ";
			for(int j = 0; j < _col; ++j)
				cout<<arr[i][j]<<" ";
			cout<<"]"<<endl;
		}
	} 

	double **m_matrix;
	int row;
	int col;
};

int main()
{
	matrix mat0(2,3);
	matrix mat1(5);
	mat0.Elem(1,2) = 15.3;
	mat1(4,4) = 16.2;
	cout<<mat0.Elem(1,2)<<endl;
	cout<<mat1(4,4)<<endl;

	cout<<"matrix mat0(2,3) out:"<<endl;
	mat0.outMatrix();
	cout<<endl<<"matrix mat1(5) out:"<<endl;
	mat1.outMatrix();
	return 0;
}
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 30.01.2009, 02:42   #4
Pendulum
 
Регистрация: 15.01.2008
Сообщений: 4
По умолчанию

С Вашего позволения выскажу несколько замечаний.

1.я бы использовал в конструкторе параметры по умолчанию. Естественно равные 1. тогда бы легко можно было задать вектор или скаляр
2. Для операций с матрицами использовал бы operator+() и пр. (В том числе и для умножения на число). Причем неплохо бы проверять размерности матриц.
3.Еще следует перегрузить функции ввода/вывода. (Вместо функции печати). Тогда бы вся демонстрация и проверка работы класса matrix заняла всего бы одну строчку:
Код:
cout << A+B << A*B << a*A << endl;
4.
Цитата:
Код:
for (i=0; i<num; i++) for (int j=0; j<num; j++) p[i][j]=0.0;
Кто такой num? мне не очевидно
5.
Цитата:
Код:
p=new double [i][j];
Здесь бы я проверял указатель на пустоту.
6.
Цитата:
Код:
for (i=0; i<num; i++) for (j=0; j<num; j++) p[i][j]=0.0;
Сомнительное использование входных параметров конструктора (т.е. размерности матрицы )в качестве индексов.
7. В задании говорится о коде возврата своего для каждой ошибки, как я понял. Поэтому в флаге здесь толку мало. Я бы ввел переменную типа int для хранения типа ошибки. Т.е. 0 - для успеха, 1 - нехватка памяти, 2 - несоответсвие размерности и т.д. Причем сделал бы ее разделяемой, т.е. одной для всех матриц, т.е. static, потому что она может характеризовать всю ситуацию, а не конкретную матрицу. (Нельзя же обвинять А, если она не совпадает по размерности с В ? )

Код:
class matrix {
static int err; 
...
};
Как вы считаете?

Если бы я был преподавателем, который выдал это задание, я потребовал бы исполнения изложенных пунктов на его месте.
Pendulum вне форума Ответить с цитированием
Старый 30.01.2009, 03:43   #5
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Цитата:
Сообщение от Pendulum Посмотреть сообщение
5.
Код:
p=new double [i][j];
Здесь бы я проверял указатель на пустоту.
Вроде здесь уже нет смысла проверять указатель на пустоту,
так как само выделение памяти есть не правельное.

и в классе изначально нельзя указателю присвоить NULL(0) тоесть
Код:
class x
{
public:
   x()
   {
      p = NULL;//нормально
      //p = 0;     //нормально
   }
private:
   int *p;//нормально
   //int *p = NULL;//ошибка
   //int *p = 0;     //ошибка
};
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....

Последний раз редактировалось ISergeyN; 30.01.2009 в 04:35.
ISergeyN вне форума Ответить с цитированием
Старый 31.01.2009, 04:04   #6
breate
Пользователь
 
Аватар для breate
 
Регистрация: 30.12.2008
Сообщений: 78
По умолчанию RE

Цитата:
Сообщение от ISergeyN Посмотреть сообщение
Вроде здесь уже нет смысла проверять указатель на пустоту,
так как само выделение памяти есть не правельное.

и в классе изначально нельзя указателю присвоить NULL(0) тоесть
согласен указатель на пустоту прверять не надо да и как бы ему присваевается новый адрес от оператора нью
а вот над переменными класа я бы задумался толи опечатка толи на самом деле ошибка *p двумерные массивы так не описывают
и с перегрузкой я согласен не сложно написать

Код:
friend ostream & operator <<(ostream &os, matrix &mx)
{
for(inr i=0; i<mx.nrow; i++)
{
for (int j=0; j<mx.ncol;j++)
os<<mx.p[i][j]
os<<endl;
return os;
}
ну я думаю перегрузка остальных оператороров не имеет смысла описывать приметив

а на счет создания массива, сначала сделал бы связаный список в который бы складывал элементы а потом от туда с подсчетом их количества выводил в матрицу и после подсчёта элементов предлагал бы сетки если они не введены зарание если хотите я напишу свои идеи, на эту тему выложу тут или отправлю на мыло если не увижу нового поста пиши сюда breate.by@gmail.com


}
Моя работа - Создание сайтов

Последний раз редактировалось MaTBeu; 02.02.2009 в 19:49.
breate вне форума Ответить с цитированием
Старый 08.02.2009, 19:16   #7
ammaximus
 
Регистрация: 07.11.2006
Сообщений: 3
По умолчанию

matrix():row(1),col(1)

Что за конструкция? Что означают двоеточия после имени функции?
ammaximus вне форума Ответить с цитированием
Старый 08.02.2009, 19:28   #8
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

В конструкторе после двоеточия пишут строку инициализации. Это всеравно что написать
Код:
matrix()
{
   row = 1;
   col = 1;
}
Просто для сокращения кода. Инициализировать так можно только данные-члены класса.
MaTBeu вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
двумерный массив Ринат_1987 Помощь студентам 2 19.01.2009 15:43
Двумерный массив Wi1D Помощь студентам 12 10.12.2008 00:55
Двумерный массив Wi1D Помощь студентам 0 10.12.2008 00:29
Двумерный массив в С++ Draid Помощь студентам 2 07.03.2008 22:06