Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] операции с матрицами на С+

Ответить
Настройки темы
C/C++ - [решено] операции с матрицами на С+

Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: Drongo
Дата: 17-01-2010
Описание: [noparse]...[/noparse]
Вложения
Тип файла: rar FAQ.rar
(712 байт, 11 просмотров)
Доброго времени суток вам! Товарисчи, помогиииите пожалуйста! завтра сдавать курсач. села писать. тема простая - операции с матрицами на С++(естессно с классами) под дос. пишу, поочередно все проверяя, запускаю на Turbo C (т.к. на ентом же будет запускать препод). на данном этапе вылазит ошибка:

EROR '<Tomat<int>::operator + (Tomat<int>,Tomat<int>) must be declared with one parameter

плз! что нужно сделать???

Отправлено: 18:20, 17-01-2010

 

Аватара для ganselo

Старожил


Сообщения: 232
Благодарности: 90

Профиль | Сайт | Отправить PM | Цитировать


В операторе + второй параметр лишний, т.к operator + является методом класса, а не френдом.

Пример:
Tomat<int> a, b, c;

c = a + b;

Тип возвращаемого знач operator +(Tomat<int> b)
{
//тут a (из примера выше) - это будит this.
}

-------
К величайшему сожалению "история учит нас тому, что она ничему не учит".

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:58, 17-01-2010 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


В тексте следующие ошибки:
  • не определены переменные stlb, str
  • оператор+ про который сказал ganselo
Недочёты в структуре:
  • лучше передавать тяжёлые для копирования объекты по ссылке const Tomat&
  • в main() ввод, ввод, сложили, ввод, вычли, ввод, конец программы? это так и задумывалось?
  • хранить в классе информацию о размерности матриц
Стиль:
  • зачем мешать iostreams и stdio? прочитать элементы матрицы можно тоже через cin, вывести через cout
  • ни одного комментария в тексте. Вы сами понимаете вашу(?) программу?
  • ещё советую ввод сделать через friend istream& operator>>(istream&, Tomat&) а вывод через friend ostream& operator<<(ostream&, const Tomat&), тогда в программе вывод будет
    Код: Выделить весь код
    cout << "введите матрицу:\n";
    cin >> mat1;
    // перепутать невозможно с
    cout << "ваша матрица:\n" << c;
Код: Выделить весь код
(1) какая скобка за что отвечает? а если я захочу добавить что-то - куда писать?
   Tomat() {int i,j;
        for(i=0; i<10; i++)
         {for(j=0; j<10; j++)
          {a[i][j]=0;}} };

(2) а вот так вопросы возникают?
   Tomat()  
   {
      // * можно было воспользоваться функцией memset
      // memset(a, 0, sizeof(a)*100), но параметр шаблона
      // может иметь непростой конструктор, и я тем попорчу память
      // * можно было использовать шаблон fill(a, a+100, Tchto()), но я
      // его ещё не знаю
      for(int i=0; i<10; i++)
      {
          for(int j=0; j<10; j++)
          {
              a[i][j]=Tchto(); // это нужно чтобы использовать более сложные объекты,
              // например сomplex<> или любой другой, наделёный операциями +, -
              // к примеру пусть есть set<string>, у которого есть операции + (слияние)
              // и - (разница). Тогда можно использовать Tomat<set<string> > >
              // вдруг мне понадобится в жизни когда-нибудь, крестики-нолики писать?
          }
      }
   }; // Tomato()
Это сообщение посчитали полезным следующие участники:

Отправлено: 00:48, 18-01-2010 | #3


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Спасибо за комментарии. В ходе написания программы, правда, сама вдуплила почему не работает перегрузка операторов. Я, наверно, не отметила, что я совсем начинающий в этом деле, поэтому очень часто лажаю.
Цитата pva:
и одного комментария в тексте. Вы сами понимаете вашу(?) программу? »
программа моя(такого бреда другой человек бы не написал), времени писать комменты не было, да и прога маленькая.
Цитата pva:
в main() ввод, ввод, сложили, ввод, вычли, ввод, конец программы? это так и задумывалось? »
нет. я,вроде, объясняла, что это только первых шаг, намётки, так сказать, проверка на работоспособность того, что уже написано. По заданию прога должна выдавать меню, в котором предлагается сложить, вычесть, перемножить, транспонировать, возвести в степень, умножить на число, определить тип матрицы.
Цитата pva:
зачем мешать iostreams и stdio? прочитать элементы матрицы можно тоже через cin, вывести через cout »
а я просто непоследовательный человек...
Цитата pva:
ещё советую ввод сделать через friend istream& operator>>(istream&, Tomat&) а вывод через friend ostream& operator<<(ostream&, const Tomat&), »
я с этим не оч знакома. где посоветуете почитать, чтоб доходчиво было объяснено?

Отправлено: 20:13, 20-01-2010 | #4

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


пчелка, здесь все вам рады, и вашу самокритику читать мы не хотим. Лучше вместо "я плохая" ответить "я переделала так:" и привести улучшенный вариант. Я изначально писал на паскале, С/С++ изучал по книжке Старуструпа; её и советую. Что касается комментов - они нужны даже в маленькой программе (хотя бы краткое "to do"). Тем более если вы хотите чтобы в вашем коде разобрался другой человек. Про намётки и первые шаги можно было написать там же.
слово friend обозначает декларацию "друга" класса. Он будет иметь доступ к секциям private и protected, но являться внешним по отношению к классу (у функций не будет this). Пример:
Код: Выделить весь код
class A {
public:
  A(int a) : _a(a) {}
  friend void friend_foo(const A&);
  void foo(const A&);
  friend struct B;
private:
  int _a;
};

void outer_foo(const A&);

void friend_foo(const A& class_A)
{
  // доступ к this->_a:
  // неизвестная переменная _a
  _a = class_A._a + 1; // ошибка, т.к. в friend_foo не передаётся this
}

void A::foo(const A& class_A)
{
  // доступ к this->_a:
  _a = class_A._a + 1; // всё в порядке
}

void outer_foo(const A& class_A);
{
  // доступ к this->_a и class_A._a:
  // переменная _a не определена
  // нет доступа к private a._a
  _a = class_A._a + 1; // ошибка
  // вообще outer_foo отличается от friend_foo только тем, что friend_foo имеет права доступа к class_A
}

// структура B, описанная как friend, может из своим методов обращаться к скрытым членам A.
istream& operator>>(istream&, Tomat&) - это переопределение оператора сдвига для класса потока информации istream с аргументом Tomat&, который вернёт потом istream&. Вызов оператора может выглядеть так: cin >> mat; При этом так как результат сдвига - тоже istream, можно сделать так: cin >> mat >> c1; то есть прочитать 2 матрицы сподряд в одной строке кода.
То же самое с оператором <<. В стандартной библиотеке опеределены операторы сдвига потока для всех стандартных типов аргументов, и для новых типов рекомендуется доопределять. А сделать этот оператор другом нужно для доступа к скрытым членам аргумента. Хотя при продуманном дизайне класса можно обойтись и без друзей. Тогда меньше гемора при вносе изменений во внутреннюю структуру класса.

Последний раз редактировалось pva, 20-01-2010 в 21:36.

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:22, 20-01-2010 | #5


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: rar FAQ.rar
(1.7 Kb, 21 просмотров)

Спасибо, что не остались равнодушными. . выложу почти готовую программку(прога без комментов), авось кому-нить поможет. Она, канеш, не оч, не доработаная и стиль не соблюден, и не все задумки получилось воплотить, но всё ж... не судите строго. )

Отправлено: 20:39, 25-01-2010 | #6


Аватара для котвася

Пользователь


Сообщения: 147
Благодарности: 5

Профиль | Отправить PM | Цитировать


подскажите как сделать шаблон
Код: Выделить весь код
template<class MATRIXTYPE>
ostream &operator<< (ostream &out, const MATRIX &M)
{
	for(int i= 0; i <M.ROW; i++)
	{
		for(int j = 0; j < M.COLUMN; j++)
			out << setw(4) << *(M.matrixPtr[i]+j) << ' ';
		out << endl;
	}
	return out;
}

ОШИБКА:
error C2955: MATRIX: для использования класса шаблон требуется список аргументов шаблон c:\$p\mvs\matrix\транспонирование\транспонирование\matrix.cpp 53

Отправлено: 01:13, 17-10-2010 | #7


Аватара для котвася

Пользователь


Сообщения: 147
Благодарности: 5

Профиль | Отправить PM | Цитировать


методом научного тыка:
Код: Выделить весь код
template<class MATRIXTYPE>
ostream &operator<< (ostream &out, const MATRIX<MATRIXTYPE> &M)
{
	for(int i= 0; i <M.ROW; i++)
	{
		for(int j = 0; j < M.COLUMN; j++)
			out << setw(4) << *(M.matrixPtr[i]+j) << ' ';
		out << endl;
	}
	return out;
}
теперь появилась вторая проблема:
Код: Выделить весь код
//КЛАСС MATRIX

#include <iostream>
#include <iomanip>

using std::cout;
using std::cin;
using std::endl;
using std::setw;
using std::ostream;

template<class MATRIXTYPE>
class MATRIX
{
	friend ostream &operator<< (ostream &, const MATRIX &);
public:
	MATRIX(int, int);
	~MATRIX();
	void T(void);
private:
	int COLUMN;
	int ROW;	
	MATRIXTYPE **matrixPtr;
};

template<class MATRIXTYPE>
MATRIX<MATRIXTYPE>::MATRIX(int row, int column)
{
	if(row <= 0)
		row = 1;
	if(column <= 0)
		column = 1;
	this->ROW = row;
	this->COLUMN = column;
	this->matrixPtr = new MATRIXTYPE*[this->ROW];
	for(int i = 0; i < this->ROW; i++)
	{
		this->matrixPtr[i] = new MATRIXTYPE[this->COLUMN];
		for(int j = 0; j < this->COLUMN; j++)
			*(this->matrixPtr[i] + j) = 0;
	}
}

template<class MATRIXTYPE>
ostream &operator<< (ostream &out, const MATRIX<MATRIXTYPE> &M)
{
	for(int i= 0; i <M.ROW; i++)
	{
		for(int j = 0; j < M.COLUMN; j++)
			out << setw(4) << *(M.matrixPtr[i]+j) << ' ';
		out << endl;
	}
	return out;
}

int main()
{
	setlocale(LC_ALL,".1251");
	int _row, _column;
	cout << "ВВЕДИТЕ РАЗМЕРЫ МАТРИЦЫ" << endl;
	cin >> _row, _column;
	MATRIX<int> matrix(_row, _column);
	cout << matrix;
	system("pause");
	return 0;
}

Ошибка 2 error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall MATRIX<int>::~MATRIX<int>(void)" (??1?$MATRIX@H@@QAE@XZ) в функции _main matrix.obj
Ошибка 3 error LNK2019: ссылка на неразрешенный внешний символ "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class MATRIX<int> const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$MATRIX@H@@@Z) в функции _main matrix.obj
Ошибка 4 fatal error LNK1120: 2 неразрешенных внешних элементов C:\$p\mvs\matrix\транспонирование\Debug\транспонирование.exe

Отправлено: 19:43, 17-10-2010 | #8


Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


Print the square that consists of NxN cells filled with numbers from 1 to N*N in a spiral mode(see examples).

Input:
Only one line that contains n (1<=n<=100).

Output:
The matrix in spiral view

Examples:
Input 1 Input 2 Input 3
3 4 5

Output 1 Output 2 Output 3
1 2 3 1 2 3 4 1 2 3 4 5
8 9 4 12 13 14 5 16 17 18 19 6
7 6 5 11 16 15 6 15 24 25 20 7
10 9 8 7 14 23 22 21 8
13 12 11 10 9


pojaluista pomogite rewit zada4ku!! sovsem ustal, net idei

Print the square that consists of NxN cells filled with numbers from 1 to N*N in a spiral mode(see examples).

Input:
Only one line that contains n (1<=n<=100).

Output:
The matrix in spiral view

Example:
Input 1
3

Output 1
1 2 3
8 9 4
7 6 5



izvenite))) podpravka)


Отправлено: 00:48, 20-10-2010 | #9


Аватара для котвася

Пользователь


Сообщения: 147
Благодарности: 5

Профиль | Отправить PM | Цитировать


а по-русски можно?

Отправлено: 01:24, 22-10-2010 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] операции с матрицами на С+

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Нужна кровь для операции!!! Ment69 Флейм 6 28-06-2009 06:57
[решено] Bash | Арифметические операции Coutty Программирование в *nix 4 01-06-2009 13:16
C/C++ - операции с 12-разрядными числами .::.DIMA.::. Программирование и базы данных 14 17-03-2009 17:50
Битовые операции farik Программирование и базы данных 1 05-02-2006 17:15
Операции с матрицами Plutonium 239 Хочу все знать 6 30-09-2004 05:00




 
Переход