Форум программистов, компьютерный форум CyberForum.ru

Реализовать класс "Матрица" - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
IgorSer
0 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 103
02.05.2014, 15:31     Реализовать класс "Матрица" #1
Есть программки матриц (каждая отдельная), такие как - сложение/вычитание, умножение, транспонирование, обратная матрица. Нужно их запилить в класс.
С ООП, пока только начал. Но готовый класс нужно сдать через 3 дня. Помогите реализовать класс, хотя бы несколько строк по оформлению кода (методы и их аргументы (а реализацию метода, могу сам написать), и т.п.)
Помогите пожалуйста.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
cooller
 Аватар для cooller
564 / 532 / 120
Регистрация: 25.12.2013
Сообщений: 1,456
02.05.2014, 15:34     Реализовать класс "Матрица" #2
IgorSer, вот вам мой хидер
давно, писал, года 3-4 назад, но еще сохранилось
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#pragma once
 
#ifndef MATRIX_D_H
#define MATRIX_D_H
 
namespace MATRIX_class
{
 
 
class MATRIX_d
{
private:
    double **a;    //Двумерный массив
    int n,m;        //Размеры матрицы
    int nRO;
 
 
public:
    MATRIX_d();                                   //Конструктор по умолчанию
    MATRIX_d(int _n, int _m);                     //Конструктор, задает размер матрицы
    MATRIX_d(const MATRIX_d& M);                  //Конструктор копирования
    int GetN()
    {
        return n;    //Возвращает кол-во строк
    }
    int GetM()
    {
        return m;    //Возвращает кол-во столбцов
    }
    int GetNRO()
    {
        return nRO;
    }
 
    void SetSize(int,int,int k=0);              //Изменение размера матрицы, новые элементы заполняет цифрой k (по умолчанию k=0)
    void SetN(int, int k=0);                    //Установить количество строк
    void SetM(int, int k=0);                    //Установить количество столбцов
    void SetNRO(int n)
    {
        nRO=n;
    }
    void SetAll(double k=0);                    //Заполнить матрицу числом k (по умолчанию k=0)
    void SetRandom(int);                        //Заполнить случайными числами от 0 до A. Если А отрицательное то от А до 0
    void SetRandom(int,int);                    //Заполнить случайными числами из диапазона [a,b];
 
    void TranspMatr();                          //Транспонирует данный объект
    friend MATRIX_d TranspMatr(const MATRIX_d&);//Трансонирует переданную матрицу (дружественная функция)
    MATRIX_d Minor(int i,int j,int k=0);        //Возвращает минор по i,j. k задает нумерацию, с 0 или 1!
    double Det();                               //Определение детермината
    double A(int,int);                          //Возвращает алгебраическое дополнение A(i,j)
    MATRIX_d UnionMATRIX_d();                   //Возвращает союзную матрицу
    MATRIX_d Obrat();                           //Возвращает обратную матрицу
 
    void PrintToFile(char*);                    //Вывод матрицы в файл
    void ReadOfFile(char*);                     //Чтение матрицы из файла
 
    MATRIX_d operator+(const MATRIX_d&) const;      //Перегруженный оператор "+". Сумма двух матриц
    MATRIX_d operator-(const MATRIX_d&) const;      //Перегруженный оператор "-". Вычитание двух матриц
    MATRIX_d operator*(const double);               //Перегруженный оператор "*". Умножение матрицы на число
    MATRIX_d operator*(const MATRIX_d&);            //Перегруженный оператор "*". Умножение матрицы на матрицу
    MATRIX_d operator/(const double) const;         //Перегруженный оператор "/". Делит элементы матрицы на число
    MATRIX_d& operator+=(const MATRIX_d&);          //Перегруженный оператор "+=". Сумма двух матриц
    MATRIX_d& operator-=(const MATRIX_d&);          //Перегруженный оператор "-=". Вычитает из первой марицы вторую
    MATRIX_d& operator*=(const double);             //Перегруженный оператор "*=". Умножение матрицы на число
    MATRIX_d& operator*=(const MATRIX_d& ma);       //Перегруженный оператор "*". Умножение матрицы на матрицу
    MATRIX_d& operator/=(const double);             //Перегруженный оператор "/=". Делит элементы матрицы на число
    MATRIX_d operator++(int);                       //Перегруженный оператор "++". ПОСТФИКСНЫЙ
    MATRIX_d& operator++();                         //Перегруженный оператор "++". Префиксный
    MATRIX_d operator--(int);                       //Перегруженный оператор "--". ПОСТФИКСНЫЙ
    MATRIX_d& operator--();                         //Перегруженный оператор "--". Префксный
    MATRIX_d& operator=(const MATRIX_d&);           //Перегруженный оператор присваивания
 
    friend istream& operator>>(istream&, MATRIX_d&);  //Ввод с клавиатуры
    friend ostream& operator<<(ostream&, MATRIX_d);   //Вывод на экран
    double* operator[](int i)   //Обеспечиавает доступ в виде A[i][j]. проверки диапазона нет.
    {
        return a[i];
    }
    double &operator()(int i,int j);               // перегруженнй оператор "()". Обеспечивает доступ к элеменатам матрицы
    ~MATRIX_d();                                    //Деструктор
};
 
}
#endif
DmitryDidenko
4 / 4 / 2
Регистрация: 01.05.2014
Сообщений: 24
02.05.2014, 17:21     Реализовать класс "Матрица" #3
Цитата Сообщение от cooller Посмотреть сообщение
IgorSer, вот вам мой хидер
давно, писал, года 3-4 назад, но еще сохранилось

Не по теме:

Думаю для него это будет очень сложно.



Добавлено через 27 минут
Вообщем вот ввод/вывод матрицы, но тока статической, динамический массив, что-то у меня ошибки выдает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
 
using namespace std;
 
class matrix
{
    private:
        int mat[3][3];
        int n,m;
    public:
 
 
 
void getdate() //ввод матрицы
{
 
    for (int i=0; i<3; i++)
        for (int j=0; j<3; j++)
            mat[i][j]=rand() %10;
};
 
 
void putdate()//вывод матрицы
{
 
        for (int i=0; i<3; i++) 
        {
        for (int j=0; j<3; j++)
        cout<<mat[i][j]<<" ";
        cout<<endl;}
};
 
};
 
 
 
 
 
int main()
{
    setlocale(LC_ALL,"Rus");
    matrix mat;
    mat.getdate();
    mat.putdate();
    system("pause");
    return 0;
}
cooller
 Аватар для cooller
564 / 532 / 120
Регистрация: 25.12.2013
Сообщений: 1,456
02.05.2014, 17:34     Реализовать класс "Матрица" #4
DmitryDidenko, почему нет конструкторов?
Цитата Сообщение от DmitryDidenko Посмотреть сообщение
динамический массив, что-то у меня ошибки выдает.
какие?
Цитата Сообщение от DmitryDidenko Посмотреть сообщение
Думаю для него это будет очень сложно.

Не по теме:

видимо для вас тоже

DmitryDidenko
4 / 4 / 2
Регистрация: 01.05.2014
Сообщений: 24
02.05.2014, 19:36     Реализовать класс "Матрица" #5
Цитата Сообщение от cooller Посмотреть сообщение
Не по теме:
видимо для вас тоже
Да мне просто щас неохота сидеть разбираться, но ведь у него есть свои готовые коды по отдельности.
А с динамическими, делаю вроде всё верно выделяю память, а при выводе ошибку выдает.
cooller
 Аватар для cooller
564 / 532 / 120
Регистрация: 25.12.2013
Сообщений: 1,456
02.05.2014, 19:39     Реализовать класс "Матрица" #6
Цитата Сообщение от DmitryDidenko Посмотреть сообщение
А с динамическими, делаю вроде всё верно выделяю память, а при выводе ошибку выдает.
значит не верно
IgorSer
0 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 103
03.05.2014, 13:48  [ТС]     Реализовать класс "Матрица" #7
У меня такой вопрос, как передать в аргументы метода, 2х мерный массив? пытался по разному не получается.
Нужно что то типо "void func(n,m,a,b)", где n,m размеры матрицы, a,b - двухмерный массив. Потом с ними работать (цикл запускать для сложения, вычитания и т.п.) Или я не в ту сторону мыслю?
Вот например отдельный код для сложения. Помогите для примера, засунуть его в класс.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include "iostream"
#include "iomanip"
 
using namespace std;
 
int main(int argc, char** argv)
{
  int a[2][2] = {
    {1,4},
    {2,3}
  };
  int b[2][2] = {
    {4,4},
    {5,2}
  };
  
  cout << "Сложение: " << endl;
 
  cout << "A: " << endl;
  for(int i = 0; i < 2; i++) {
    cout << setw(4) << "|";
    for(int j = 0; j < 2; j++)
      cout << setw(3) << a[i][j] << " ";
    cout << " |" << endl;
  }
  cout << endl;
  cout << "B: " << endl;
  for(int i = 0; i < 2; i++) {
    cout << setw(4) << "|";
    for(int j = 0; j < 2; j++)
      cout << setw(3) << b[i][j] << " ";
    cout << " |" << endl;
  }
  
  cout << endl << "C = A + B" << endl;
  int c[2][2];
  
  cout << endl;
  for(int i = 0; i < 2; i++){
    cout << "| ";
    for(int j = 0; j < 2; j++){
      if(a[i][j] < 0)
        cout << "(" << a[i][j] << ")" << "+" << b[i][j] << "; ";
      else if(b[i][j] < 0)
        cout << a[i][j] << "+" << "(" << b[i][j] << ")" << "; ";
      else if(a[i][j] < 0 && b[i][j] < 0)
        cout << "(" << a[i][j] << ")" << "+" << "(" << b[i][j] << ")";
      else
        cout << a[i][j] << "+" << b[i][j] << "; ";
      
      c[i][j] = a[i][j] + b[i][j];
    }
    cout << "|" << endl;
  }
  
  cout << endl << "Ответ: " << endl;
  
  for(int i = 0; i < 2; i++) {
    cout << setw(4) << "|";
    for(int j = 0; j < 2; j++)
      cout << setw(3) << c[i][j] << " ";
    cout << " |" << endl;
  }
  
  cout << endl;
 
}
cooller
 Аватар для cooller
564 / 532 / 120
Регистрация: 25.12.2013
Сообщений: 1,456
03.05.2014, 15:08     Реализовать класс "Матрица" #8
IgorSer,
Цитата Сообщение от IgorSer Посмотреть сообщение
void func(n,m,a,b)
C++
1
void func(int n,int m,int **a,int **b);
где а и b ваши двухмерные массивы
IgorSer
0 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 103
03.05.2014, 20:30  [ТС]     Реализовать класс "Матрица" #9
Цитата Сообщение от cooller Посмотреть сообщение
void func(int n,int m,int **a,int **b);
И снова глупый вопрос, как вставлять массив в функцию при вызове?
Пытаюсь (matrix.func(2,2, a, b) - дает ошибку, matrix.func(2,2, &a, &b) - тоже ошибка.). Как верно вызвать эту функцию в main'е ?
cooller
 Аватар для cooller
564 / 532 / 120
Регистрация: 25.12.2013
Сообщений: 1,456
03.05.2014, 20:54     Реализовать класс "Матрица" #10
IgorSer, если массив объявлен статически, то так можно
C++
1
matrix.func(2,2, (int*)a, (int*)b)
IgorSer
0 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 103
04.05.2014, 08:46  [ТС]     Реализовать класс "Матрица" #11
cooller,
все равно у меня выдает ошибку.
Ошибка такая - " Cannot initialize a parameter of type 'int **' with an rvalue of type 'int *' "

Код

Matrix.h
C++
1
2
3
4
5
class Matrix
{
public:
  void Print(int a, int b, int **mas1);
};
Matrix.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
#include "Matrix.h"
#include "iostream"
 
using namespace std;
 
void Matrix::Print(int a, int b, int **mas1)
{
  for(int i = 0; i < a; i++)
    for(int j = 0; j < b; j++)
      cout << mas1[i][j] << " ";
}
Main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include "Matrix.h"
 
using namespace std;
 
int main()
{
  int a[2][2] = {{1,2},{3,4}};
  
  Matrix mtx;
  mtx.Print(2, 2, (int*)a);
}
cooller
 Аватар для cooller
564 / 532 / 120
Регистрация: 25.12.2013
Сообщений: 1,456
04.05.2014, 15:05     Реализовать класс "Матрица" #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от IgorSer Посмотреть сообщение
mtx.Print(2, 2, (int*)a);
моя оплошность, не заметил что матрица
вот так
C++
1
mtx.Print(2, 2, (int**)a);
IgorSer
0 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 103
04.05.2014, 15:12  [ТС]     Реализовать класс "Матрица" #13
cooller, Спасибо! То что нужно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2014, 14:04     Реализовать класс "Матрица"
Еще ссылки по теме:

C++ Класс "Матрица", ошибка при выводе результата
Класс "Матрица". Перегрузка оператора "минус" C++
Класс "Время", как реализовать работу со временем? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ВаняБином
0 / 0 / 0
Регистрация: 29.08.2014
Сообщений: 18
26.10.2014, 14:04     Реализовать класс "Матрица" #14
HPP
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Matrix
{
private:
    int ** _matrix;
    size_t _rows;
    size_t _columns;
 
public:
    Matrix(size_t rows, size_t columns);
    Matrix(const Matrix &matrix);
    ~Matrix();
 
    size_t GetRows();
    size_t GetColumns();
    void   Print();
    void   AllocMemory();
    void   CopyElementsInRow(const Matrix &matrix, size_t i);
    void   CopyMatrix(const Matrix &matrix);
    void   FillAllocatedMemory();
    void   Set(size_t row, size_t columns, int value);
    void   GetSumRows(const Matrix &firstMatrix, const Matrix &secondMatrix, size_t i);
    int    Get(size_t row, size_t columns) const;
 
public:
    Matrix &operator=(const Matrix &matrix);
    friend Matrix  operator+(const Matrix &firstMatrix, const Matrix &secondMatrix);
};
 
Matrix operator+(const Matrix &firstMatrix, const Matrix &secondMatrix);
CPP
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
size_t Matrix::GetRows()
{
    return _rows;
}
 
size_t Matrix::GetColumns()
{
    return _columns;
}
 
void Matrix::AllocMemory()
{
    _matrix = new int*[_rows];
 
    for (size_t i = 0; i < _rows; ++i)
        _matrix[i] = new int[_columns];
}
 
void Matrix::Print() 
{
    for (int i = 0; i < _rows; i++)
    {
        for (int j = 0; j < _columns; j++)
        {
            std::cout << _matrix[i][j] << " " ;
        }
        std::cout << std::endl;
    }
}
 
void Matrix::CopyElementsInRow(const Matrix &m, unsigned int i)
{
    for (unsigned int j = 0; j < _columns; ++j)
        _matrix[i][j] = m._matrix[i][j];
}
 
void Matrix::CopyMatrix(const Matrix &matrix)
{
    if (matrix._columns != _columns || matrix._rows != _rows)
        throw std::exception("Wrong sizes"); 
 
    for (size_t i = 0; i < _rows; ++i)
        CopyElementsInRow(matrix, i);
}
 
void Matrix::FillAllocatedMemory()
{
    for (size_t i = 0; i < _rows; ++i)
        memset(_matrix[i], 0, _columns * sizeof(int));
}
 
void Matrix::Set(size_t row, size_t columns, int value)
{
    _matrix[row][columns] = value;
}
 
int Matrix::Get(size_t row, size_t columns) const
{
    return _matrix[row][columns];
}
 
Matrix::Matrix(size_t rows, size_t columns)
{
    this->_rows = rows; this->_columns = columns;
    
    AllocMemory();
    FillAllocatedMemory();
}
 
Matrix::Matrix(const Matrix &matrix) 
{
    _rows = matrix._rows;
    _columns = matrix._columns;
 
    AllocMemory();
    CopyMatrix(matrix);
}
 
Matrix::~Matrix()
{
    for (size_t i = 0; i < _rows; ++i)
        delete[] _matrix[i]; 
 
    delete[] _matrix;
}
 
Matrix &Matrix::operator=(const Matrix &matrix)
{
    CopyMatrix(matrix);
    return * this;
}
 
void Matrix::GetSumRows(const Matrix &firstMatrix, const Matrix &secondMatrix, size_t i)
{
    for (size_t j = 0; j < GetColumns(); ++j)
        Set(i, j, firstMatrix.Get(i, j) + secondMatrix.Get(i, j));
}
 
Matrix operator+(const Matrix &firstMatrix, const Matrix &secondMatrix)
{
    if (firstMatrix._rows != secondMatrix._rows || firstMatrix._columns != secondMatrix._columns)
    {
        throw std::exception("Wrong sizes");
    }
 
    Matrix matrix(firstMatrix._rows, firstMatrix._columns);
 
    for (size_t i = 0; i < matrix._rows; ++i)
        matrix.GetSumRows(firstMatrix, secondMatrix, i);
 
    return matrix;
}
Yandex
Объявления
26.10.2014, 14:04     Реализовать класс "Матрица"
Ответ Создать тему
Опции темы

Текущее время: 15:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru