|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] операции с матрицами на С+ |
|
|
C/C++ - [решено] операции с матрицами на С+
|
Новый участник Сообщения: 7 |
Профиль | Отправить PM | Цитировать
Доброго времени суток вам! Товарисчи, помогиииите пожалуйста! завтра сдавать курсач. села писать. тема простая - операции с матрицами на С++(естессно с классами) под дос. пишу, поочередно все проверяя, запускаю на Turbo C (т.к. на ентом же будет запускать препод). на данном этапе вылазит ошибка:
EROR '<Tomat<int>::operator + (Tomat<int>,Tomat<int>) must be declared with one parameter плз! что нужно сделать??? |
|
Отправлено: 18:20, 17-01-2010 |
Старожил Сообщения: 232
|
Профиль | Сайт | Отправить PM | Цитировать В операторе + второй параметр лишний, т.к operator + является методом класса, а не френдом.
Пример: Tomat<int> a, b, c; c = a + b; Тип возвращаемого знач operator +(Tomat<int> b) { //тут a (из примера выше) - это будит this. } |
------- Отправлено: 22:58, 17-01-2010 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать В тексте следующие ошибки:
(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
|
Профиль | Отправить PM | Цитировать Спасибо за комментарии. В ходе написания программы, правда, сама вдуплила почему не работает перегрузка операторов. Я, наверно, не отметила, что я совсем начинающий в этом деле, поэтому очень часто лажаю.
Цитата pva:
Цитата pva:
Цитата pva:
Цитата pva:
|
||||
Отправлено: 20:13, 20-01-2010 | #4 |
Ветеран Сообщения: 1180
|
Профиль | Отправить 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. То же самое с оператором <<. В стандартной библиотеке опеределены операторы сдвига потока для всех стандартных типов аргументов, и для новых типов рекомендуется доопределять. А сделать этот оператор другом нужно для доступа к скрытым членам аргумента. Хотя при продуманном дизайне класса можно обойтись и без друзей. Тогда меньше гемора при вносе изменений во внутреннюю структуру класса. |
|
Последний раз редактировалось pva, 20-01-2010 в 21:36. Отправлено: 21:22, 20-01-2010 | #5 |
Новый участник Сообщения: 7
|
Профиль | Отправить PM | Цитировать Спасибо, что не остались равнодушными. . выложу почти готовую программку(прога без комментов), авось кому-нить поможет. Она, канеш, не оч, не доработаная и стиль не соблюден, и не все задумки получилось воплотить, но всё ж... не судите строго. )
|
Отправлено: 20:39, 25-01-2010 | #6 |
Пользователь Сообщения: 147
|
Профиль | Отправить 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
|
Профиль | Отправить 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
|
Профиль | Отправить 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
|
Профиль | Отправить PM | Цитировать а по-русски можно?
|
Отправлено: 01:24, 22-10-2010 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Нужна кровь для операции!!! | 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 |
|