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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2010, 23:17   #1
MR_Andrew
Форумчанин
 
Регистрация: 05.10.2009
Сообщений: 100
По умолчанию C++: класс матрица. Действия с ними

Вечер добрый. Делаю следующую лабу - уже забадался...
Суть: сделать класс "матрица". В объекте "матрица" должны быть перегружены операторы +, -, *, /. Записать в файл. Реализовать метод "детерминант".

Вот то, что вышло. Оно работает.
Код:
#include <iostream.h>
#include <conio.h>
#include <math.h>

    class matrix {   // клас матриця
        private:
        int *p_m;
        int n;
        public:
        matrix (int count_n);
        matrix (const matrix& m);
        matrix operator+(const matrix my);
        matrix operator-(const matrix my);
        matrix operator*(const matrix my);
        matrix operator/(const matrix my);
        void   operator=(const matrix my);
        void   In_put();
        void   Out_put();
        ~matrix();
        };

matrix  matrix::operator*(const matrix my)
    {
    int my_n=(n*n-n)/2+n;
    matrix m_ret(n);
    for(int i=0;i<my_n;i++)
    m_ret.p_m[i]=p_m[i]*my.p_m[i];
    return m_ret;
    };

matrix  matrix::operator+(const matrix my)
{
int my_n=(n*n-n)/2+n;
matrix m_ret(n);
for(int i=0;i<my_n;i++)
m_ret.p_m[i]=p_m[i]+my.p_m[i];
return m_ret;
};

matrix  matrix::operator-(const matrix my)
{
int my_n=(n*n-n)/2+n;
matrix m_ret(n);
for(int i=0;i<my_n;i++)
m_ret.p_m[i]=p_m[i]-my.p_m[i];
return m_ret;
};

matrix  matrix::operator/(const matrix my)
{
int my_n=(n*n-n)/2+n;
matrix m_ret(n);
for(int i=0;i<my_n;i++)
m_ret.p_m[i]=p_m[i]/my.p_m[i];
return m_ret;
};

void matrix::operator=(const matrix my)
{
int my_n=(n*n-n)/2+n;
for(int i=0;i<my_n;i++)
p_m[i]=my.p_m[i];
};

matrix::matrix(int count_n)
{
n=count_n;
int my_n=(n*n-n)/2+n;
p_m=new int [my_n];
for(int i=0;i<my_n;i++)
p_m[i]=0;
};

matrix::matrix (const matrix& m) {
n=m.n;
int my_n=(n*n-n)/2+n;
p_m=new int [my_n];
for(int i=0;i<my_n;i++)
p_m[i]=m.p_m[i];
};

matrix::~matrix()
{
delete p_m;
};

void matrix::Out_put()
{
int y=0, out_ch=0;
for(int i=0;i<n;i++)
    {
    for(int k=0;k<y;k++)
        {
cout.width(4);
cout << "0";
        }
for(int j=0;j<n-y;j++)
{
cout.width(4);
cout << p_m[out_ch];
out_ch++;
}
cout << "\n";
y++;
    }
};

void matrix::In_put()
{
int y=0, in_ch=0;
for(int i=0;i<n;i++)
    {
    for(int j=0;j<n-y;j++)
        {
cout << "[" << i << "," << j << "]: ";
cin >> p_m[in_ch];
in_ch++;
        }
y++;
    }
};

int main()
{
int size;
cout << "Matrix [Size]: ";
cin >> size;
matrix m1(size), m2(size), m(size);
cout << "\nMatrix 1: \n";
m1.In_put();
cout << "\nMatrix 2: \n";
m2.In_put();
m=m1+m2;
cout << "\n Matrix 1 + Matrix 2 : \n";
m.Out_put();
cout << "\n";
m=m1-m2;
cout << "\n Matrix 1 - Matrix 2 : \n";
m.Out_put();
cout << "\n";
m=m1*m2;
cout << "\n Matrix 1 * Matrix 2 :\n";
m.Out_put();
cout << "\n";
m=m1/m2;
cout << "\n Matrix 1 / Matrix 2 :\n";
m.Out_put();
getch();
};
Вот только тут нету записи в файл и детерминанта. С файлыми у меня туговато, поэтому, если кому не сложно, не могли бы Вы помочь мне втулить еще эту штуку?

И детерминант - с математикой воюю, реализовать не смог.

В общем, в этом всем не хватает только файла и детерминанта. Очень прошу помочь.

Буду ОЧЕНЬ благодарен!
MR_Andrew вне форума Ответить с цитированием
Старый 17.04.2010, 00:58   #2
MR_Andrew
Форумчанин
 
Регистрация: 05.10.2009
Сообщений: 100
По умолчанию

Блин, не могу уже... Помогите, пожалуйста, с детерминантом.
Файл остается, тоже надо.

Да, и еще куда-то надо прикрутить ссылки (или хоть одну), & - амперсант.
MR_Andrew вне форума Ответить с цитированием
Старый 19.04.2010, 23:37   #3
MR_Andrew
Форумчанин
 
Регистрация: 05.10.2009
Сообщений: 100
По умолчанию

В общем, сидели-думали... Вот что надумали:
Код:
#include <iostream.h>
#include <conio.h>
#include <math.h>


    class matrix {   // клас матриця
        private:
        int *p_m;
        int n;
        public:
        matrix (int count_n);
        matrix (const matrix& m);
        matrix operator+(const matrix my);
        matrix operator-(const matrix my);
        matrix operator*(const matrix my);
        matrix operator/(const matrix my);
        void   operator=(const matrix my);
        void transpon();
        void   In_put();
        void   Out_put();
        ~matrix();
        };

matrix  matrix::operator*(const matrix my)
    {
    int my_n=(n*n-n)/2+n;
    matrix m_ret(n);
    for(int i=0;i<my_n;i++)
    m_ret.p_m[i]=p_m[i]*my.p_m[i];
    return m_ret;
    };

matrix  matrix::operator+(const matrix my)
{
int my_n=(n*n-n)/2+n;
matrix m_ret(n);
for(int i=0;i<my_n;i++)
m_ret.p_m[i]=p_m[i]+my.p_m[i];
return m_ret;
};

matrix  matrix::operator-(const matrix my)
{
int my_n=(n*n-n)/2+n;
matrix m_ret(n);
for(int i=0;i<my_n;i++)
m_ret.p_m[i]=p_m[i]-my.p_m[i];
return m_ret;
};

matrix  matrix::operator/(const matrix my)
{

matrix m_ret(n);
for(int i=0;i<n;i++)
m_ret.p_m[i]=p_m[i]/my.p_m[i];
return m_ret;
};

void matrix::operator=(const matrix my)
{
int my_n=(n*n-n)/2+n;
for(int i=0;i<my_n;i++)
p_m[i]=my.p_m[i];
};

matrix::matrix(int count_n)
{
n=count_n*count_n;

p_m=new int [n];
for(int i=0;i<n;i++)
p_m[i]=0;
};

matrix::matrix (const matrix& m) {
n=m.n;
int my_n=(n*n-n)/2+n;
p_m=new int [my_n];
for(int i=0;i<my_n;i++)
p_m[i]=m.p_m[i];
};

matrix::~matrix()
{
delete p_m;
};

void matrix::Out_put()
{
int y=0, out_ch=0;
for(int i=0;i<pow(n,0.5);i++)
{
for(int j=0;j<pow(n,0.5);j++)
{
cout.width(4);
cout << p_m[out_ch];
out_ch++;
}
cout << "\n";
y++;
    }
};

void matrix::In_put()
{
int y=0, in_ch=0;
for(int i=0;i<pow(n,0.5);i++)
    {
    for(int j=0;j<pow(n,0.5);j++)
        {
cout << "[" << i << "," << j << "]: ";
cin >> p_m[in_ch];
in_ch++;
        }
y++;
    }
};
void matrix::transpon()
{
int i,j,a,b;

float mas[3][3], tmp;

mas[0][0] = 1;
mas[0][1] = 1;
mas[0][2] = 1;
mas[1][0] = 2;
mas[1][1] = 2;
mas[1][2] = 2;
mas[2][0] = 3;
mas[2][1] = 3;
mas[2][2] = 3;

	for(i=0;i<3;i++)
		{
		for(j=0;j<3;j++) cout << mas[i][j] << " ";
		
		cout << "\n";
        }



	for(i=0;i<3-1;i++)
		{
		for(j=i+1;j<3;j++) 
          {
          tmp = mas[i][j];
          mas[i][j] = mas[j][i];
          mas[j][i] = tmp;
          }
		  
        }




	for(i=0;i<3;i++)
		{
		for(j=0;j<3;j++) cout << mas[i][j] << " ";
		
		cout << "\n";
        }


/*			
		for(i=0;i<3;i++)
		{
		for(j=0;j<3;j++)
{
a=mas[i][j];
b=mas[i][j];
mas[i][j]=b;
mas[j][i]=a;

}


}
*/
		
}


int main()
{
int size;
cout << "Matrix [Size]: ";
cin >> size;
matrix m1(size), m2(size), m(size);
cout << "\nMatrix 1: \n";
m1.In_put();
cout<<endl;
m1.Out_put();
cout << "\nMatrix 2: \n";
m2.In_put();
m=m1+m2;
cout << "\n Matrix 1 + Matrix 2 : \n";
m.Out_put();
cout << "\n";
m=m1-m2;
cout << "\n Matrix 1 - Matrix 2 : \n";
m.Out_put();
cout << "\n";
m=m1*m2;
cout << "\n Matrix 1 * Matrix 2 :\n";
m.Out_put();
cout << "\n";
m=m1/m2;
cout << "\n Matrix 1 / Matrix 2 :\n";
m.Out_put();

m1.Out_put();
cout<<endl;
m2.Out_put();
cout<<endl;
m1.transpon();
cout<<"transponyvannia"<<endl;
m1.Out_put();
m2.transpon();
cout<<"transponyvannia"<<endl;
m2.Out_put();
getch();
};

У нас теперь не работает деление, и трансплонирование - вообще ужас. Есть как пример (в программе) просто трансплонирование, а нам надо того, что вводим (поменять столбики и рядки местами).
А в файл надо записать через бинарный поток, это для меня вообще

Может кто-то мне помочь?
MR_Andrew вне форума Ответить с цитированием
Старый 23.04.2010, 21:09   #4
MR_Andrew
Форумчанин
 
Регистрация: 05.10.2009
Сообщений: 100
По умолчанию

Код:
#include <iostream.h>
#include <conio.h>
#include <math.h>
#include <fstream.h>


    class matrix {   // клас матриця
        private:
        int *p_m;
        int n;
        public:
        matrix (int count_n);
        matrix (const matrix& m);
        matrix operator+(const matrix my);
        matrix operator-(const matrix my);
        matrix operator*(const matrix my);
        void   operator=(const matrix my);
        void transpon();
        void   In_put();
        void   Out_put();
        ~matrix();
        };

matrix  matrix::operator*(const matrix my)
    {
    int my_n=(n*n-n)/2+n;
    matrix m_ret(n);
    for(int i=0;i<my_n;i++)
    m_ret.p_m[i]=p_m[i]*my.p_m[i];
    return m_ret;
    };

matrix  matrix::operator+(const matrix my)
{
int my_n=(n*n-n)/2+n;
matrix m_ret(n);
for(int i=0;i<my_n;i++)
m_ret.p_m[i]=p_m[i]+my.p_m[i];
return m_ret;
};

matrix  matrix::operator-(const matrix my)
{
int my_n=(n*n-n)/2+n;
matrix m_ret(n);
for(int i=0;i<my_n;i++)
m_ret.p_m[i]=p_m[i]-my.p_m[i];
return m_ret;
};


void matrix::operator=(const matrix my)
{
int my_n=(n*n-n)/2+n;
for(int i=0;i<my_n;i++)
p_m[i]=my.p_m[i];
};

matrix::matrix(int count_n)
{
n=count_n*count_n;

p_m=new int [n];
for(int i=0;i<n;i++)
p_m[i]=0;
};

matrix::matrix (const matrix& m) {
n=m.n;
int my_n=(n*n-n)/2+n;
p_m=new int [my_n];
for(int i=0;i<my_n;i++)
p_m[i]=m.p_m[i];
};

matrix::~matrix()
{
delete p_m;
};

void matrix::Out_put()
{
int y=0, out_ch=0;
for(int i=0;i<pow(n,0.5);i++)
{
for(int j=0;j<pow(n,0.5);j++)
{
cout.width(4);
cout << p_m[out_ch];
out_ch++;
}
cout << "\n";
y++;
    }
};

void matrix::In_put()
{
int y=0, in_ch=0;
for(int i=0;i<pow(n,0.5);i++)
    {
    for(int j=0;j<pow(n,0.5);j++)
        {
cout << "[" << i << "," << j << "]: ";
cin >> p_m[in_ch];
in_ch++;
        }
y++;
    }
};
void matrix::transpon()
{
int i,j,a,b;

float mas[3][3], tmp;

mas[0][0] = 1;
mas[0][1] = 1;
mas[0][2] = 1;
mas[1][0] = 2;
mas[1][1] = 2;
mas[1][2] = 2;
mas[2][0] = 3;
mas[2][1] = 3;
mas[2][2] = 3;

	for(i=0;i<3;i++)
		{
		for(j=0;j<3;j++) cout << mas[i][j] << " ";

		cout << "\n";
        }



	for(i=0;i<3-1;i++)
		{
		for(j=i+1;j<3;j++)
          {
          tmp = mas[i][j];
          mas[i][j] = mas[j][i];
          mas[j][i] = tmp;
          }

        }




	for(i=0;i<3;i++)
		{
		for(j=0;j<3;j++) cout << mas[i][j] << " ";

		cout << "\n";
        }
}
void matrix::tofile()

{    int i,m;
     FILE* f=fopen("c:\\temp\\f","w+");
       for(list<m>::iterator  i = l.begin(); i!=l.end(); i++)
      {
            m t=*i;
            cout <<t.coast;
            i++;
      }
       fclose(f);
}

int main()
{
int size;
cout << "Matrix [Size]: ";
cin >> size;
matrix m1(size), m2(size), m(size);
cout << "\nMatrix 1: \n";
m1.In_put();
cout<<endl;
m1.Out_put();
cout << "\nMatrix 2: \n";
m2.In_put();
cout<<endl;
m2.Out_put();
m=m1+m2;
cout << "\n Matrix 1 + Matrix 2 : \n";
m.Out_put();
cout << "\n";

m=m1-m2;
cout << "\n Matrix 1 - Matrix 2 : \n";
m.Out_put();
cout << "\n";
m=m1*m2;
cout << "\n Matrix 1 * Matrix 2 :\n";
m.Out_put();
cout << "\n";

m1.transpon();
cout<<"transponyvannia"<<endl;
m1.Out_put();
m2.transpon();
cout<<"transponyvannia"<<endl;
m2.Out_put();
m.tofile();
getch();
};
Пожалуйста, помогите разобраться.... Не работает...
MR_Andrew вне форума Ответить с цитированием
Старый 18.02.2013, 10:01   #5
werasaimon
 
Регистрация: 02.12.2011
Сообщений: 3
По умолчанию

сколько мерную матрицу надо
werasaimon вне форума Ответить с цитированием
Старый 18.02.2013, 23:45   #6
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Странная у вас одномерная матрица...

А как вы понимаете операцию "деление матриц"?

Откройте главы 8 и 9 книги Крупника "Изучаем С++" (первая в списке; там ещё исходники к книге). В ней подробно описана реализация класса "Матрица" http://programmersforum.ru/showpost....&postcount=147

Далее код из книги. Класс "matrix2_2" унаследован от класса "matrix". Реализован расчёт детерминанта, вывод на экран (можно переписать для вывода в файл). Можно ещё написать класс matrix3_3 с расчётом детерминанта. Осталось только операции реализовать (умножение и т.д.)

Output:
Код:
Matrix:
65      52
19      22

det = 442
main.cpp
Код:
#include "Matrix_2x2.h"
#include <cstdlib>
#include <ctime>
#include <iostream>
using namespace std;

int main(int argc, char** argv)
{
    matrix2_2 m;
    
    // Initialize random seed
    srand (time(NULL));
    rand();
    
    // Fill the matrix
    for (int row = 0; row < 2; row++) {
        for (int col = 0; col < 2; col++) {
            m(row, col) = rand()%100;
        }
    }
    
    cout << "Matrix:" << endl;
    cout << m << endl;
    
    cout << "det = " << m.det() << endl;
    
    return 0;
}
Matrix.h
Код:
// А.Крупник "Самоучитель по С++" 
// Файл matrix3.hpp - класс matrix с оператором присваивания

#include <ostream>
using namespace std;

#ifndef MATRIX_H
#define	MATRIX_H

class matrix {
public:
    // конструктор

    matrix(int r = 2, int c = 2) {
        nrows_ = r;
        ncols_ = c;
        mini_ = new double[r * c];
    }

    // конструктор копирования

    matrix(matrix &mc) {
        nrows_ = mc.rget();
        ncols_ = mc.cget();
        mini_ = new double[nrows_ * ncols_];
        for (int i = 0; i < nrows_; i++)
            for (int j = 0; j < ncols_; j++)
                mini_[i * ncols_ + j] = mc(i, j);
    }

    // оператор присваивания

    matrix & operator=(matrix & mc) {
        if (this != &mc) {
            delete [] mini_;
            nrows_ = mc.rget();
            ncols_ = mc.cget();
            mini_ = new double [nrows_ * ncols_];
            for (int i = 0; i < nrows_; i++)
                for (int j = 0; j < ncols_; j++)
                    mini_[i * ncols_ + j] = mc(i, j);
        }
        return *this;
    }

    // деструктор

    ~matrix() {
        delete [] mini_;
    }

    // оператор ()_

    double & operator()(int r, int c) {
        return mini_[r * ncols_ + c];
    }

    // оператор вывода на экран <<
    friend ostream& operator<<(const ostream& stream, const matrix m);

    int rget() {
        return nrows_;
    }

    int cget() {
        return ncols_;
    }

private:
    int nrows_;
    int ncols_;
    double *mini_;
};

// оператор вывода на экран <<
ostream& operator<<(ostream& stream, matrix m) {
    for (int row = 0; row < m.rget(); row++) {
        for (int col = 0; col < m.cget(); col++) {
            stream << m(row, col);
            stream << ((col == m.cget()-1) ? "" : "\t");
        }
        stream << endl;
    }
    return stream;
}

#endif	/* MATRIX_H */
Matrix_2x2.h
Код:
// А.Крупник "Самоучитель по С++" 
// Листинг 10.1. Описание квадратной матрицы 2х2 (файл matrix2_2.hpp)

#include "Matrix.h"

#ifndef MATRIX_2X2_H
#define	MATRIX_2X2_H

class matrix2_2 : public matrix {
public:
    matrix2_2(double a00, double a01,
            double a10, double a11) : matrix(2, 2) {
        (*this)(0, 0) = a00;
        (*this)(0, 1) = a01;
        (*this)(1, 0) = a10;
        (*this)(1, 1) = a11;
    }

    matrix2_2() : matrix(2, 2) {
    };

    double det() {
        det_ = (*this)(0, 0)*(*this)(1, 1) -
                (*this)(0, 1)*(*this)(1, 0);
        return det_;
    }

private:
    double det_;
};

#endif	/* MATRIX_2X2_H */
P.S. Только сейчас заметил, что тема 2010 года. Ну да ладно

Последний раз редактировалось 8Observer8; 18.02.2013 в 23:49.
8Observer8 вне форума Ответить с цитированием
Старый 21.07.2015, 22:02   #7
igoraz
Новичок
Джуниор
 
Регистрация: 21.07.2015
Сообщений: 1
По умолчанию

Советую пользоваться классом dmatrix, яндекс в помощь...
igoraz вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Непонятки с DirectX (матрица поворота, камера, матрица проекции) ROD Общие вопросы C/C++ 2 17.09.2010 17:00
Динамическая матрица через класс и перегрузка artyom-d Общие вопросы C/C++ 0 03.04.2010 14:36
Создание файлов и работа с ними... Olka... Общие вопросы C/C++ 12 02.04.2010 23:30
Класс матрица, вывод результатов на экран Student_911 Помощь студентам 0 03.10.2009 20:55
Ноты и интервалы между ними треч Помощь студентам 5 01.02.2008 02:39