Показать полную графическую версию : [решено] операции с матрицами на С+
Доброго времени суток вам! Товарисчи, помогиииите пожалуйста! завтра сдавать курсач. села писать. тема простая - операции с матрицами на С++(естессно с классами) под дос. пишу, поочередно все проверяя, запускаю на Turbo C (т.к. на ентом же будет запускать препод). на данном этапе вылазит ошибка:
EROR '<Tomat<int>::operator + (Tomat<int>,Tomat<int>) must be declared with one parameter
плз! что нужно сделать???
В операторе + второй параметр лишний, т.к operator + является методом класса, а не френдом.
Пример:
Tomat<int> a, b, c;
c = a + b;
Тип возвращаемого знач operator +(Tomat<int> b)
{
//тут a (из примера выше) - это будит this.
}
В тексте следующие ошибки:
не определены переменные 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()
Спасибо за комментарии. В ходе написания программы, правда, сама вдуплила почему не работает перегрузка операторов. Я, наверно, не отметила, что я совсем начинающий в этом деле, поэтому очень часто лажаю.и одного комментария в тексте. Вы сами понимаете вашу(?) программу? »
программа моя(такого бреда другой человек бы не написал), времени писать комменты не было, да и прога маленькая.в main() ввод, ввод, сложили, ввод, вычли, ввод, конец программы? это так и задумывалось? »
нет. я,вроде, объясняла, что это только первых шаг, намётки, так сказать, проверка на работоспособность того, что уже написано. По заданию прога должна выдавать меню, в котором предлагается сложить, вычесть, перемножить, транспонировать, возвести в степень, умножить на число, определить тип матрицы. зачем мешать iostreams и stdio? прочитать элементы матрицы можно тоже через cin, вывести через cout »
а я просто непоследовательный человек...
ещё советую ввод сделать через friend istream& operator>>(istream&, Tomat&) а вывод через friend ostream& operator<<(ostream&, const Tomat&), »
я с этим не оч знакома. где посоветуете почитать, чтоб доходчиво было объяснено?
пчелка, здесь все вам рады, и вашу самокритику читать мы не хотим. Лучше вместо "я плохая" ответить "я переделала так:" и привести улучшенный вариант. Я изначально писал на паскале, С/С++ изучал по книжке Старуструпа; её и советую. Что касается комментов - они нужны даже в маленькой программе (хотя бы краткое "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 матрицы сподряд в одной строке кода.
То же самое с оператором <<. В стандартной библиотеке опеределены операторы сдвига потока для всех стандартных типов аргументов, и для новых типов рекомендуется доопределять. А сделать этот оператор другом нужно для доступа к скрытым членам аргумента. Хотя при продуманном дизайне класса можно обойтись и без друзей. Тогда меньше гемора при вносе изменений во внутреннюю структуру класса.
Спасибо, что не остались равнодушными. =). выложу почти готовую программку(прога без комментов), авось кому-нить поможет. Она, канеш, не оч, не доработаная и стиль не соблюден, и не все задумки получилось воплотить, но всё ж... не судите строго. )
подскажите как сделать шаблон
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
методом научного тыка:
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
theBest4ainik
20-10-2010, 00:48
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)
:ok:
котвася, задание заключается в спиралевидном заполнении матрицы NxN значениями от центра против часовой по уменьшению. Или позиции 1.1 по часовой по возрастанию.
theBest4ainik, Задание понятно, какие твои предложения к его решению?
"Нет идей" не принимается. Сядь и спокойно рассуждай, что и куда тебе надо записать. Короче реши примеров 5 руками. Т.е. заставь себя взять ручку и написать 5 матриц разного размера "спиралевидно". Затем посмотри, какие действия у тебя повторяются, чем они отличаются друг от друга и нет ли в них зависимости?
Но ДО этого, еще раз, заполни 5 матриц разного размера в ручную, шариковой ручкой, спиралевидно. Дальше станет все прозрачней и понятней.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.