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

Класс матриц - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Вычислить значение выражения рекурсивно http://www.cyberforum.ru/cpp-beginners/thread210126.html
Доброго времени суток! Помогите решить подсчитать значение выражения с помощью рекурсии. Вот в картинке сохранил то, что надо посчитать. http://i071.***********/1012/5b/6480de56c930.jpg (если...
C++ Шаблон класса вектор с двумя членами-данными Здравствуйте Уважаемые. Нужна Ваша помощь в реализации программы: Построить шаблон класса Vector. Определите класс Record (запись) с двумя членами-данными: count (количество) и price (цена).... http://www.cyberforum.ru/cpp-beginners/thread210123.html
C++ Алгоритм Флойда - Уоршелла
не получается реализовать алгоритм Флойда-Уоршелла, вроде все должнен выводить, а выводит или нули или вообще ничего, ошибок не выводит не понимаю в чем дело. вот код проги #include "stdafx.h"...
C++ Найти сумму элементов строки матрицы, в которой расположен элемент с наименьшим значением
ребята очень нужна помощь при выводе матрицы.Кто сможет помоч если сможет.Нада MFC AppWizard.exe проект и вот задание Дана действительная матрица размера m*n. Найти сумму элементов строки, в...
C++ Сравнение методов сортировок массивов. Семестровая работа http://www.cyberforum.ru/cpp-beginners/thread210105.html
Пишу семестровую по методам сортировки массивов. В моем варианте метод прямого выбора и метод Шейкера. Надо сравнить количество перестановок для различного числа элементов массива. n = 20,...
C++ При чтении файла последний элемент повторяется дважды появилась необходимость выучить работу с файлами за 9 часов #include <iostream> #include <time.h> #include <stdio.h> #include <stdlib.h> int main() { подробнее

Показать сообщение отдельно
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
15.12.2010, 02:33
Не лишним, не лишним. Перегружайте =, [] (в двух видах -- const и обычный). Пригодится.
Цитата Сообщение от Gabberr Посмотреть сообщение
Matrix & Matrix::operator = (const Matrix & T)
{
* *if (this == &T)
* * * return *this;
* *else
* *{
* * * *delete a; // неправильно удалили двойной массив.
* * * *nstr=T.nstr;
* * * *nstl=T.nstl;
* * * *a=new int *[nstr];
* * *for (int j=0;j<nstr;j++)
* * *{
* * * * a[j]=new int[nstl];
* * * * for (int i=0;i<nstl;i++)
* * * * * *a[j][i]=T.a[i][j]; * *
* * *}
return *this;
* *} * * * *
}
Цитата Сообщение от Gabberr Посмотреть сообщение
Matrix::~Matrix()
{
* * for (int i=0;i<nstr;i++) // сколько-сколько раз вы удаляете одно и то же?!
* * * *delete []a; * * * * * * //
}
Добавлено через 1 минуту
И там и там должно быть что-то вроде
C++
1
2
3
for (int i=0;i<nstr;i++)
     delete [] a[i];
delete [] a;
Добавлено через 3 минуты
Попробуйте,
посмотрите мой вариант
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
#include <iostream>
#include <iomanip>
 
using namespace std;
 
class Matrix
{
protected:
        double** _data;
        unsigned int _size;
public:
        Matrix(void) : _data(0), _size(0) {}
        Matrix(unsigned int size) : _size(size), _data(0)
        {
                if (_size>0)
                {
                        _data = new double*[_size];
                        for (int i=0; i<_size; i++)
                                _data[i] = new double[_size];
                }
        }
        Matrix(const Matrix& other)
        {
                Matrix(other.size());
                for (int i=0; i<_size; i++)
                for (int j=0; j<_size; j++)
                        _data[i][j] = other._data[i][j];
        }
 
        const unsigned int size() const { return _size; }
        double* operator[](int i) { return _data[i]; }
        double& at(int i, int j) { return _data[i][j]; }
 
        Matrix& operator=(const Matrix& other)
        {
                if (this!=&other)
                {
                        for (int i=0; i<_size; i++)
                                delete [] _data[i];
                        delete [] _data;
                        _size = other.size();
                        if (_size>0)
                        {
                                _data = new double*[_size];
                                for (int i=0; i<_size; i++)
                                {
                                        _data[i] = new double[_size];
                                        for (int j=0; j<_size; j++)
                                                _data[i][j] = other._data[i][j];
                                }
                        }
                }
                return *this;
        }
 
        ~Matrix()
        {
                for (int i=0; i<_size; i++)
                        delete [] _data[i];
                delete [] _data;
        }
};
. Вдруг что новое почерпнете?

Добавлено через 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
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <exception>
#include <stdexcept>
 
using namespace std;
 
class Array
{
protected:
        int** _data;
        int _cols, _rows;
public:
        Array(void) : _data(0), _rows(0),_cols(0) {};
        Array(int rows, int cols, bool fill=false, int filler=0)
                : _rows(rows), _cols(cols), _data(0)
        {
                _data = new int* [_rows];
                for (int i=0; i<_rows; i++)
                {
                        _data[i] = new int[_cols];
                        if (fill)
                                for (int j=0; j<_cols; j++)
                                        _data[i][j] = filler;
                }
        }
 
        Array(const Array& other) :
                _cols(other.cols()),
                _rows(other.rows())
        {
                _data = new int* [_rows];
                for (int i=0; i<_rows; i++)
                {
                        _data[i] = new int[_cols];
                        for (int j=0; j<_cols; j++)
                                _data[i][j] = other._data[i][j];
                }
        }
 
        const Array transpon() const
        {
                Array C(_cols, _rows);
                for (int i=0; i<_cols; i++)
                        for (int j=0; j<_rows; j++)
                                C[i][j] = _data[j][i];
                return C;
        }
 
        const Array operator+(const Array& other) const
        {
                if ((_cols != other.cols()) || (_rows != other.rows()))
                        throw out_of_range("Multiplied matrixes do not have same number of cols and rows.");
                Array C(_rows, _cols);
                for (int i=0; i<C.rows(); i++)
                        for (int j=0; j<C.cols(); j++)
                                C._data[i][j] = _data[i][j] + other._data[i][j];
                return C;
        }
 
        const Array operator*(const Array& other) const
        {
                if (_cols != other.rows())
                        throw out_of_range("Multiplied matrixes do not have same number of cols and rows.");
                Array C(_rows, other.cols(), true);
                for (int i=0; i<C.rows(); i++)
                        for (int j=0; j<C.cols(); j++)
                                for (int k=0; k<_cols; k++)
                                C[i][j] += _data[i][k]*other._data[k][j];
                return C;
        }
 
        Array& operator= (const Array& other)
        {
                if (this!=&other)
                {
                        if (_data!=0)
                        {
                                for (int i=0; i<_rows; i++)
                                        delete [] _data[i];
                                delete [] _data;
                        }
                        _rows = other.rows();
                        _cols = other.cols();
 
                        _data = new int* [_rows];
                        for (int i=0; i<_rows; i++)
                                _data[i] = new int[_cols];
 
                        for (int i=0; i<_rows; i++)
                                for (int j=0; j<_cols; j++)
                                        _data[i][j] = other._data[i][j];
                }
                return *this;
        }
 
        friend ostream& operator<< (ostream& o, const Array& a)
        {
                for (int i=0; i<a._rows; i++)
                {
                        for (int j=0; j<a._cols; j++)
                                o << setw(4) << a._data[i][j];
                        o << endl;
                }
                return o;
        }
 
        void fill_random()
        {
                for (int i=0; i<_rows; i++)
                        for (int j=0; j<_cols; j++)
                                _data[i][j] = rand()%100+1;
        }
 
        int* operator[](int i) { return _data[i]; }
        int& at(int i, int j) { return _data[i][j]; }
 
        const int cols() const { return _cols; }
        const int rows() const { return _rows; }
 
        ~Array()
        {
                if (_data!=0)
                {
                        for (int i=0; i<_rows; i++)
                                delete [] _data[i];
                        delete [] _data;
                }
        }
};
 
// пример
int main()
{
        srand(static_cast<unsigned int>(time(0)));
 
        Array a(5, 5);
        a.fill_random();
        cout << a << endl;
 
        int* max_cols = new int[a.cols()];
        for (int i=0; i<a.cols(); i++)
        {
                max_cols[i] = a[i][0];
                for (int j=1; j<a.rows(); j++)
                        if (max_cols[i] < a[i][j])
                                max_cols[i] = a[i][j];
                cout << setw(4) << max_cols[i];
        }
        cout << endl << endl;
 
        int min = max_cols[0];
        for (int i=1; i<a.cols(); i++)
                if (min > max_cols[i])
                        min = max_cols[i];
 
        cout << setw(4) << min << endl;
        delete [] max_cols;
        Array x(3, 3, true, 1);
        Array y(3, 3, true, 1);
        Array z(3, 5);
        z.fill_random();
        cout << (x*y) << endl;
        cout << (x+y) << endl;
        cout << z << endl << z.transpon() << endl;
 
        return 0;
}
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru