Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] операции с матрицами на С+ (http://forum.oszone.net/showthread.php?t=163802)

пчелка 17-01-2010 18:20 1322809

операции с матрицами на С+
 
Вложений: 1
Доброго времени суток вам! Товарисчи, помогиииите пожалуйста! завтра сдавать курсач. села писать. тема простая - операции с матрицами на С++(естессно с классами) под дос. пишу, поочередно все проверяя, запускаю на Turbo C (т.к. на ентом же будет запускать препод). на данном этапе вылазит ошибка:

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

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

ganselo 17-01-2010 22:58 1323034

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

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

c = a + b;

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

pva 18-01-2010 00:48 1323085

В тексте следующие ошибки:
  • не определены переменные 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()


пчелка 20-01-2010 20:13 1325395

Спасибо за комментарии. В ходе написания программы, правда, сама вдуплила почему не работает перегрузка операторов. Я, наверно, не отметила, что я совсем начинающий в этом деле, поэтому очень часто лажаю.
Цитата:

Цитата pva
и одного комментария в тексте. Вы сами понимаете вашу(?) программу? »

программа моя(такого бреда другой человек бы не написал), времени писать комменты не было, да и прога маленькая.
Цитата:

Цитата pva
в main() ввод, ввод, сложили, ввод, вычли, ввод, конец программы? это так и задумывалось? »

нет. я,вроде, объясняла, что это только первых шаг, намётки, так сказать, проверка на работоспособность того, что уже написано. По заданию прога должна выдавать меню, в котором предлагается сложить, вычесть, перемножить, транспонировать, возвести в степень, умножить на число, определить тип матрицы.
Цитата:

Цитата pva
зачем мешать iostreams и stdio? прочитать элементы матрицы можно тоже через cin, вывести через cout »

а я просто непоследовательный человек...
Цитата:

Цитата pva
ещё советую ввод сделать через friend istream& operator>>(istream&, Tomat&) а вывод через friend ostream& operator<<(ostream&, const Tomat&), »

я с этим не оч знакома. где посоветуете почитать, чтоб доходчиво было объяснено?

pva 20-01-2010 21:22 1325448

пчелка, здесь все вам рады, и вашу самокритику читать мы не хотим. Лучше вместо "я плохая" ответить "я переделала так:" и привести улучшенный вариант. Я изначально писал на паскале, С/С++ изучал по книжке Старуструпа; её и советую. Что касается комментов - они нужны даже в маленькой программе (хотя бы краткое "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 матрицы сподряд в одной строке кода.
То же самое с оператором <<. В стандартной библиотеке опеределены операторы сдвига потока для всех стандартных типов аргументов, и для новых типов рекомендуется доопределять. А сделать этот оператор другом нужно для доступа к скрытым членам аргумента. Хотя при продуманном дизайне класса можно обойтись и без друзей. Тогда меньше гемора при вносе изменений во внутреннюю структуру класса.

пчелка 25-01-2010 20:39 1329719

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

котвася 17-10-2010 01:13 1520470

подскажите как сделать шаблон
Код:

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

котвася 17-10-2010 19:43 1521018

методом научного тыка:
Код:

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 1522720

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:

котвася 22-10-2010 01:24 1524468

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

lxa85 22-10-2010 09:48 1524578

котвася, задание заключается в спиралевидном заполнении матрицы NxN значениями от центра против часовой по уменьшению. Или позиции 1.1 по часовой по возрастанию.
theBest4ainik, Задание понятно, какие твои предложения к его решению?
"Нет идей" не принимается. Сядь и спокойно рассуждай, что и куда тебе надо записать. Короче реши примеров 5 руками. Т.е. заставь себя взять ручку и написать 5 матриц разного размера "спиралевидно". Затем посмотри, какие действия у тебя повторяются, чем они отличаются друг от друга и нет ли в них зависимости?
Но ДО этого, еще раз, заполни 5 матриц разного размера в ручную, шариковой ручкой, спиралевидно. Дальше станет все прозрачней и понятней.


Время: 08:18.

Время: 08:18.
© OSzone.net 2001-