Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/30: Рейтинг темы: голосов - 30, средняя оценка - 4.77
2 / 2 / 1
Регистрация: 28.03.2012
Сообщений: 76
1

Класс Matrix, Перегрузка

18.11.2012, 13:46. Показов 5565. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
День добрый... У нас есть класс матрица (NxM), нужно сделать перегрузку "+", со статик матрицой всё работало прекрасно...но после переделки под динамическую, перестало...даже вывод перестал работать, подскажите пожалуйста, где ошибка(
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
#include <iostream>
#include <Windows.h>
#include <cstdlib>
using namespace std;
typedef double T;
class Matrix
{
private:
        T **arr;
        int N,M;
public:
    int a,b;    
    Matrix(){N=0;M=0;arr=NULL;};
    friend double drand();
        Matrix(int a, int b)
        {int i,j; N=a; M=b;
        T **arr=new T*[N];
        for (i=0;i<N;i++)
        {arr[i]=new T[M];}
        for (i=0;i<N;i++)
        for (j=0;j<M;j++)
        arr[i][j]=drand();};
 
        Matrix(const Matrix& A);
 
        void Vivod();
    Matrix operator+ (const Matrix&);
};
 
double drand(){   double a,b,c;
    a = 1.0;
    b = 2.0;
    c = (double)rand()/(double) RAND_MAX*(b-a)+a;
return c;}
 
void Matrix::Vivod() 
{
        for (int i = 0; i < N; i++)
        {cout<<endl;
          for (int j = 0; j < M; j++)
          {
           cout<<arr[i][j]<<" ";
          }
        }
        cout<<endl;
}
 
Matrix::Matrix(const Matrix& A)
{   for(int i = 0; i < N; i++)
        for(int j = 0; j < M; j++)
            arr[i][j] = A.arr[i][j];}
 
Matrix Matrix::operator+(const Matrix &A)
{
    Matrix result(N,M);
      for (int i = 0; i < N; ++i)
      {
        for (int j = 0; j < M; ++j)
        {
            result.arr[i][j] += A.arr[i][j];
        }
      }
    return result;
}
 
int main()
{ int c,d;
    SetConsoleCP(1251);
        SetConsoleOutputCP(1251);
    cout<< "N,M" << endl;
    cin >> c >> d;
        Matrix a1(c,d), b1(c,d);
 
        a1.Vivod();
        b1.Vivod();
        system("PAUSE");
        system("cls");
        Matrix c1(c,d);
        c1=a1+b1;
        a1.Vivod();
        b1.Vivod();
        c1.Vivod();
 
        system("PAUSE");
 
        return 0;}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.11.2012, 13:46
Ответы с готовыми решениями:

Класс Matrix: реализовать шаблонный класс для двумерных массивов
Доброго времени суток. У меня вопрос: я создал класс Array со внутренним динамическим массивом и...

Перегрузка конструкторов (создание класса Matrix, перемножение матриц)
Помогите пожалуйста с умножением матриц Добавлено через 20 секунд #include &lt;iostream.h&gt;...

Создать класс Matrix и класс Size
Всем доброго дня!!! Помогите пожалуйста с решением задачи, а то я в программировании плохо...

класс Matrix (СРОЧНО !!!)
Люди добрые помогите пожалуйста с решением задачи, а то я в программировании плохо соображаю. Вот...

19
1321 / 983 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
18.11.2012, 14:08 2
попробуй 17 строка
C++
1
arr = newT*[N];
1
2 / 2 / 1
Регистрация: 28.03.2012
Сообщений: 76
18.11.2012, 14:42  [ТС] 3
Цитата Сообщение от David Sylva Посмотреть сообщение
попробуй 17 строка
C++
1
arr = newT*[N];
Тааак, заработало. Но сумму не находит.
в 78 строке убрал параметры(на автомате их туда наверно поставил,не ожидая что в конструкторе буду массив заполнять), всё равно не складывает (
0
1321 / 983 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
18.11.2012, 14:48 4
Цитата Сообщение от The1Phoenix Посмотреть сообщение
typedef double T;
зачем ты вот это сделал, код из - за этого не читаемый.
1
2 / 2 / 1
Регистрация: 28.03.2012
Сообщений: 76
18.11.2012, 14:49  [ТС] 5
Цитата Сообщение от David Sylva Посмотреть сообщение
зачем ты вот это сделал, код из - за этого не читаемый.
Задание такое)
0
1321 / 983 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
18.11.2012, 14:51 6
Цитата Сообщение от The1Phoenix Посмотреть сообщение
Задание такое)
сделать код не читаемым? Сформулируй задание полностью. У тебя класс реализован не совсем верно.
1
2 / 2 / 1
Регистрация: 28.03.2012
Сообщений: 76
18.11.2012, 14:56  [ТС] 7
Цитата Сообщение от David Sylva Посмотреть сообщение
сделать код не читаемым? Сформулируй задание полностью. У тебя класс реализован не совсем верно.
Составить описание класса для представления типа данных "веществвенные матрица":
C++
1
2
3
4
5
6
7
typedef double T
class TMatrix{
private:
T **arr;
int N;
int M;
};
бла-бла-бла предупреждения что некоторые операции работают с квад. матрицами бла-бла-бла
список перегружаемых операций
0
1321 / 983 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
18.11.2012, 15:06 8
Я посмотрел, твой код тебе не кажется, что ты забыл перегрузить оператор = .
1
2 / 2 / 1
Регистрация: 28.03.2012
Сообщений: 76
18.11.2012, 15:21  [ТС] 9
Цитата Сообщение от David Sylva Посмотреть сообщение
Я посмотрел, твой код тебе не кажется, что ты забыл перегрузить оператор = .
C++
1
2
3
4
5
6
7
Matrix& Matrix::operator =(Matrix& B)
{ if (this==&B) {return *this;}
    N=B.N; M=B.M;
    for(int i = 0; i < N; i++)
        for(int j = 0; j < M; j++)
            arr[i][j] = B.arr[i][j];
return *this;}
Всё равно не скалдывает.

Добавлено через 8 минут
P.S. Для проверки использую квадратную матрицу, пока не заморачиваюсь с тем, что она может быть любой размерности
0
1321 / 983 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
18.11.2012, 15:33 10
Надо перегружать оператор индексации [] и складывать по нормальному. У тебя в целом не очень правильно сделано.
0
2 / 2 / 1
Регистрация: 28.03.2012
Сообщений: 76
18.11.2012, 15:33  [ТС] 11
Можешь,пожалуйста, по порядку объяснить что мне нужно сделать? Если можно пошагово.
0
1321 / 983 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
18.11.2012, 15:34 12
Давай так сделаем, напиши мне полностью задание, я тебе набросаю как правильно, а ты потом переделаешь под свои требовании.
1
2 / 2 / 1
Регистрация: 28.03.2012
Сообщений: 76
18.11.2012, 15:39  [ТС] 13
Цитата Сообщение от David Sylva Посмотреть сообщение
Давай так сделаем, напиши мне полностью задание, я тебе набросаю как правильно, а ты потом переделаешь под свои требовании.
Составить описание класса для представления типа данных «вещественная матрица»:
typedef double T;
class TMatrix{
private: T **arr; // двумерный массив
int N; // число строк
int M; // число столбцов
};
Обратите внимание на то, что некоторые операции имеют смысл только тогда, когда матрицы имеют одинаковый размер или являются квадратными! Особого внимания заслуживает операция умножения матриц (см. учебники по линейной алгебре и аналитической геометрии).
Список перегружаемых операций и методов:
1. + – операция сложения матриц;
2. - – операция вычитания матриц;
3. * – операция умножения матриц;
4. комбинированные операции +=, -=, *=;
5. операции извлечь из потока >> и поместить в поток <<;
6. ++, -- – операции инкремента и декремента (префиксная и постфиксная форма);
7. - , + – операции унарный минус и плюс;
8. = – операция присваивания;
9. операция обращения к отдельному элементу матрицы с контролем выхода за границы, как перегруженную операцию вызова функции operator()(size_t i, size_t j);
10. *, / – операции умножения и деления с вещественными числами (только в виде перегруженных дружественных функций);
11. методы, реализующие проверку типа матрицы (квадратная, диагональная, нулевая, единичная, симметрическая, верхняя треугольная, нижняя треугольная) – по указанию преподавателя;
12. возведение матрицы в неотрицательную степень;
13. конструктор по умолчанию;
14. конструктор с параметрами;
15. конструктор копирования;
16. деструктор.

Вот...Многого не прошу, хотел сначала с обычным сложением разобраться, а потом уже и остальное само придёт)
0
1321 / 983 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
18.11.2012, 15:44 14
К вечеру напишу всё полностью и с комментариями.
Цитата Сообщение от The1Phoenix Посмотреть сообщение
typedef double T
Но вот так писать неправильно.
1
2 / 2 / 1
Регистрация: 28.03.2012
Сообщений: 76
18.11.2012, 15:45  [ТС] 15
Цитата Сообщение от David Sylva Посмотреть сообщение
К вечеру напишу всё полностью и с комментариями.
Но вот так писать неправильно.
Ну это уж преподаватели так составляли => брали из какой-нибудь учебной лит-ры.
Спасибо. Жду с нетерпением.
0
1321 / 983 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
18.11.2012, 21:23 16
Вот так можно сделать класс Матрица
Кликните здесь для просмотра всего текста
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
#include <iostream>
#include <cstdlib> 
#include <ctime> 
#include <iomanip>
 
class Matrix 
{ 
private: 
    int N; 
    int M; 
    double** matrix; 
public:  
    Matrix(); // конструктор по умолчанию
    Matrix(int n, int m); // конструктор с параметрами
    Matrix(const Matrix &ob); // конструктор копии
    ~Matrix(); // деструктор 
    void Enter(); 
    void Show(); 
    Matrix operator + (const Matrix&); 
    Matrix operator = (const Matrix&); 
    Matrix operator - (const Matrix& ); 
    Matrix operator * (const Matrix& ); 
    Matrix operator *=(const Matrix& ); 
    Matrix operator -=(const Matrix&); 
    Matrix operator +=(const Matrix& );  
    double operator() ( int, int);
    Matrix operator -() const;        // унарный минус 
    friend std::ostream& operator << (std::ostream&, Matrix&); 
    friend std::istream& operator >> (std::istream&, Matrix&); 
    Matrix operator++();  
    Matrix operator++(int notused); // параметр notused не используется самой функцией
    // он служит индикатором для компилятора, чтобы отличить префиксную форму от постфиксной
    Matrix operator--(int notused);
    Matrix operator--();
};  
 
double Matrix::operator() (int i, int j) //обращение к отдельному элементу
{ 
    if(  i >= N || j >= M) 
    {
        std::cout << "error "<< std::endl; 
        return 0;
    }
    else  
        return matrix[i][j];
}
 
Matrix Matrix::operator-() const // унарный минус
{  
    int i, j; 
    for ( i = 0; i < N; ++i) 
        for ( j = 0; j < M; ++j) 
            matrix[i][j] = -matrix[i][j]; 
    return *this;
 
}
 
Matrix Matrix::operator -- (int notused) // постфиксная --
{ 
    int i, j; 
 
    for ( i = 0; i < N; ++i) 
        for ( j = 0; j < M; ++j) 
            --matrix[i][j]; 
    return *this;
}
 
Matrix Matrix::operator++(int notused) // постфиксная ++
{ 
    int i, j; 
 
    for ( i = 0; i < N; ++i) 
        for ( j = 0; j < M; ++j) 
            matrix[i][j]++; 
    return *this;
}
 
Matrix Matrix::operator++() // префиксная ++
{  
    int i, j; 
 
    for ( i = 0; i < N; ++i) 
        for ( j = 0; j < M; ++j) 
        ++matrix[i][j]; 
 
    return *this;
} 
 
Matrix Matrix::operator--() // префиксная --
{ 
    int i, j; 
    for ( i = 0; i < N; ++i) 
        for ( j = 0; j < M; ++j) 
            --matrix[i][j]; 
    return *this;
}
 
std::istream& operator >> (std::istream& in, Matrix& ob) // оператор >>
{  
    int i, j; 
    for ( i = 0; i < ob.N; ++i) 
        for ( j = 0; j < ob.M; ++j) 
        { 
            std::cout << "[" << i << "][" << j << "] "; 
            in >> ob.matrix[i][j]; 
        } 
        return in;
}
 
std::ostream& operator << (std::ostream& out, Matrix& ob) // оператор << 
{  
    int i, j; 
 
    for ( i = 0; i < ob.N; ++i) 
        for ( j = 0; j < ob.M; ++j) 
        { 
            if( j % ob.M == 0) 
                out << std::endl; 
            std::cout << std::setw(10) << ob.matrix[i][j]; 
        } 
        out<< std::endl; 
        return out;
}
 
Matrix Matrix:: operator *= (const Matrix& ob) // оператор *=
{  
    Matrix temp; 
    temp.N = this->N; 
    temp.M = this->M; 
    int i, j, k;
    temp.matrix = new double*[temp.N]; 
    for ( i = 0; i < temp.N; ++i) 
        temp.matrix[i] = new double[temp.M];
 
    for ( i = 0; i < temp.N; ++i) 
        for ( j = 0; j < temp.M; ++j) 
        {   
            temp.matrix[i][j] = 0;
            for ( k = 0; k < temp.M; ++k)     
               temp.matrix[i][j] = temp.matrix[i][j] + (this->matrix[i][k] * ob.matrix[k][j]); 
             // умножаем строку на столбик
            this->matrix[i][j] = temp.matrix[i][j];// приравниваем полученное число
        }
    return *this; 
 
}
 
Matrix Matrix::operator+=(const Matrix& ob) // реализация оператора +=
{   
    int i, j; 
 
    for ( i = 0; i < this->N; ++i) 
        for ( j = 0; j < this->N; ++j) 
            matrix[i][j] += ob.matrix[i][j]; 
    return *this;
} 
 
Matrix Matrix ::operator -=(const Matrix& ob) // реализация оператор -=
{ 
    int i, j; 
 
    for ( i = 0; i < N; ++i) 
        for ( j = 0; j < M; ++j) 
            matrix[i][j] -= ob.matrix[i][j]; 
    return *this;
}
 
Matrix::Matrix() // реализация конструктора по умолчанию
{ 
      N = 0; M = 0; 
        matrix = new double*[N]; 
        for ( int i = 0; i < N; ++i) 
            matrix[i] = new double[M]; 
} 
 
Matrix::Matrix(int n, int m) // реализация конструктора с параметрами
{  
    N = n; M = m; 
    matrix = new double*[N]; 
    for ( int i = 0; i < N; ++i) 
        matrix[i] = new double[M]; 
 
    for ( int i = 0; i < N; ++i) 
        for ( int j = 0; j < M; ++j) 
            matrix[i][j] = 0;
 
} 
 
Matrix::Matrix(const Matrix &ob) // реализация конструктора копии
{   
    N = ob.N; 
    M = ob.M;
    matrix = new double*[N]; 
    for ( int i = 0; i < N; ++i) 
        matrix[i] = new double[M];  
 
    for ( int i = 0; i < N; ++i) 
        for ( int j = 0; j < M; ++j) 
            matrix[i][j] = ob.matrix[i][j];
 
}  
 
Matrix::~Matrix() // деструктор
{  
    for ( int i = 0; i < N; ++i) 
        delete[] matrix[i]; 
    delete[] matrix;
}
 
void Matrix::Enter() // ввод матриц
{   
    int i, j;
    for ( i = 0; i < N; ++i) 
        for ( j = 0; j < M; ++j) 
            matrix[i][j] = 0.01 * (rand() % 1001);
 
} 
 
void Matrix::Show() // вывод матрицы
{ 
    int i, j; 
 
    for ( i = 0; i < N; ++i) 
        for ( j = 0; j < M; ++j) 
        { 
            if( j % M == 0) 
                std::cout << std::endl; 
            std::cout << std::setw(10) << matrix[i][j]; 
        } 
        std::cout << std::endl;
} 
 
Matrix Matrix :: operator + ( const Matrix& ob) // сумма матриц
{  
    Matrix temp;                        // реализовано с помощью временного объекта
    temp.N = this->N; 
    temp.M = this->M; 
    int i, j;
    temp.matrix = new double*[temp.N]; 
    for ( i = 0; i < temp.N; ++i) 
        temp.matrix[i] = new double[temp.M]; 
 
    for ( i = 0; i < temp.N; ++i) 
        for ( j = 0; j < temp.M; ++j) 
            temp.matrix[i][j] = this->matrix[i][j] + ob.matrix[i][j]; 
    return temp;
 
} 
 
Matrix Matrix::operator=(const Matrix& ob) // оператор присваивания
{ 
    int i, j;                       // реализовано без временного объекта
 
    for ( i = 0; i < this->N; ++i) 
        for ( j = 0; j < this->M; ++j) 
            this->matrix[i][j] = ob.matrix[i][j]; 
    return *this;
 
} 
 
Matrix Matrix::operator - (const Matrix& ob) // разность матриц
{ 
    int i, j; 
    for ( i = 0; i < this->N; ++i) 
        for ( j = 0; j < this->M; ++j) 
            this->matrix[i][j] = this->matrix[i][j] - ob.matrix[i][j]; 
    return *this;
} 
 
Matrix Matrix::operator * (const Matrix& ob) // умножение матриц
{   
 
    
    Matrix temp; 
    temp.N = this->N; 
    temp.M = this->M; 
    int i, j, k;
    temp.matrix = new double*[temp.N]; 
    for ( i = 0; i < temp.N; ++i) 
        temp.matrix[i] = new double[temp.M];
 
    for ( i = 0; i < temp.N; ++i) 
        for ( j = 0; j < temp.M; ++j) 
        {   
            temp.matrix[i][j] = 0;
            for ( k = 0; k < temp.M; ++k)     
               temp.matrix[i][j] = temp.matrix[i][j] + (this->matrix[i][k] * ob.matrix[k][j]); 
        }
    return temp; 
}
 
 
int main() 
{   
    srand((unsigned) time(0));
    Matrix m1(3, 3); 
    m1.Enter(); 
    m1.Show(); 
    Matrix m2(3, 3); 
    m2.Enter();
    m2.Show();
    Matrix m3(3,3); 
    m3 = m1 * m2;
    m3.Show();
    
}


Посмотри внимательно, возможны ошибки, ты можешь просто от этого кода оттолкнуться и как тебе надо его поменять. Я исходил из того что все матрицы одинакового размера, поэтому если надо изменить легко.
3
2 / 2 / 1
Регистрация: 28.03.2012
Сообщений: 76
18.11.2012, 21:27  [ТС] 17
Цитата Сообщение от David Sylva Посмотреть сообщение
Вот так можно сделать класс Матрица
Кликните здесь для просмотра всего текста
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
#include <iostream>
#include <cstdlib> 
#include <ctime> 
#include <iomanip>
 
class Matrix 
{ 
private: 
    int N; 
    int M; 
    double** matrix; 
public:  
    Matrix(); // конструктор по умолчанию
    Matrix(int n, int m); // конструктор с параметрами
    Matrix(const Matrix &ob); // конструктор копии
    ~Matrix(); // деструктор 
    void Enter(); 
    void Show(); 
    Matrix operator + (const Matrix&); 
    Matrix operator = (const Matrix&); 
    Matrix operator - (const Matrix& ); 
    Matrix operator * (const Matrix& ); 
    Matrix operator *=(const Matrix& ); 
    Matrix operator -=(const Matrix&); 
    Matrix operator +=(const Matrix& );  
    double operator() ( int, int);
    Matrix operator -() const;        // унарный минус 
    friend std::ostream& operator << (std::ostream&, Matrix&); 
    friend std::istream& operator >> (std::istream&, Matrix&); 
    Matrix operator++();  
    Matrix operator++(int notused); // параметр notused не используется самой функцией
    // он служит индикатором для компилятора, чтобы отличить префиксную форму от постфиксной
    Matrix operator--(int notused);
    Matrix operator--();
};  
 
double Matrix::operator() (int i, int j) //обращение к отдельному элементу
{ 
    if(  i >= N || j >= M) 
    {
        std::cout << "error "<< std::endl; 
        return 0;
    }
    else  
        return matrix[i][j];
}
 
Matrix Matrix::operator-() const // унарный минус
{  
    int i, j; 
    for ( i = 0; i < N; ++i) 
        for ( j = 0; j < M; ++j) 
            matrix[i][j] = -matrix[i][j]; 
    return *this;
 
}
 
Matrix Matrix::operator -- (int notused) // постфиксная --
{ 
    int i, j; 
 
    for ( i = 0; i < N; ++i) 
        for ( j = 0; j < M; ++j) 
            --matrix[i][j]; 
    return *this;
}
 
Matrix Matrix::operator++(int notused) // постфиксная ++
{ 
    int i, j; 
 
    for ( i = 0; i < N; ++i) 
        for ( j = 0; j < M; ++j) 
            matrix[i][j]++; 
    return *this;
}
 
Matrix Matrix::operator++() // префиксная ++
{  
    int i, j; 
 
    for ( i = 0; i < N; ++i) 
        for ( j = 0; j < M; ++j) 
        ++matrix[i][j]; 
 
    return *this;
} 
 
Matrix Matrix::operator--() // префиксная --
{ 
    int i, j; 
    for ( i = 0; i < N; ++i) 
        for ( j = 0; j < M; ++j) 
            --matrix[i][j]; 
    return *this;
}
 
std::istream& operator >> (std::istream& in, Matrix& ob) // оператор >>
{  
    int i, j; 
    for ( i = 0; i < ob.N; ++i) 
        for ( j = 0; j < ob.M; ++j) 
        { 
            std::cout << "[" << i << "][" << j << "] "; 
            in >> ob.matrix[i][j]; 
        } 
        return in;
}
 
std::ostream& operator << (std::ostream& out, Matrix& ob) // оператор << 
{  
    int i, j; 
 
    for ( i = 0; i < ob.N; ++i) 
        for ( j = 0; j < ob.M; ++j) 
        { 
            if( j % ob.M == 0) 
                out << std::endl; 
            std::cout << std::setw(10) << ob.matrix[i][j]; 
        } 
        out<< std::endl; 
        return out;
}
 
Matrix Matrix:: operator *= (const Matrix& ob) // оператор *=
{  
    Matrix temp; 
    temp.N = this->N; 
    temp.M = this->M; 
    int i, j, k;
    temp.matrix = new double*[temp.N]; 
    for ( i = 0; i < temp.N; ++i) 
        temp.matrix[i] = new double[temp.M];
 
    for ( i = 0; i < temp.N; ++i) 
        for ( j = 0; j < temp.M; ++j) 
        {   
            temp.matrix[i][j] = 0;
            for ( k = 0; k < temp.M; ++k)     
               temp.matrix[i][j] = temp.matrix[i][j] + (this->matrix[i][k] * ob.matrix[k][j]); 
             // умножаем строку на столбик
            this->matrix[i][j] = temp.matrix[i][j];// приравниваем полученное число
        }
    return *this; 
 
}
 
Matrix Matrix::operator+=(const Matrix& ob) // реализация оператора +=
{   
    int i, j; 
 
    for ( i = 0; i < this->N; ++i) 
        for ( j = 0; j < this->N; ++j) 
            matrix[i][j] += ob.matrix[i][j]; 
    return *this;
} 
 
Matrix Matrix ::operator -=(const Matrix& ob) // реализация оператор -=
{ 
    int i, j; 
 
    for ( i = 0; i < N; ++i) 
        for ( j = 0; j < M; ++j) 
            matrix[i][j] -= ob.matrix[i][j]; 
    return *this;
}
 
Matrix::Matrix() // реализация конструктора по умолчанию
{ 
      N = 0; M = 0; 
        matrix = new double*[N]; 
        for ( int i = 0; i < N; ++i) 
            matrix[i] = new double[M]; 
} 
 
Matrix::Matrix(int n, int m) // реализация конструктора с параметрами
{  
    N = n; M = m; 
    matrix = new double*[N]; 
    for ( int i = 0; i < N; ++i) 
        matrix[i] = new double[M]; 
 
    for ( int i = 0; i < N; ++i) 
        for ( int j = 0; j < M; ++j) 
            matrix[i][j] = 0;
 
} 
 
Matrix::Matrix(const Matrix &ob) // реализация конструктора копии
{   
    N = ob.N; 
    M = ob.M;
    matrix = new double*[N]; 
    for ( int i = 0; i < N; ++i) 
        matrix[i] = new double[M];  
 
    for ( int i = 0; i < N; ++i) 
        for ( int j = 0; j < M; ++j) 
            matrix[i][j] = ob.matrix[i][j];
 
}  
 
Matrix::~Matrix() // деструктор
{  
    for ( int i = 0; i < N; ++i) 
        delete[] matrix[i]; 
    delete[] matrix;
}
 
void Matrix::Enter() // ввод матриц
{   
    int i, j;
    for ( i = 0; i < N; ++i) 
        for ( j = 0; j < M; ++j) 
            matrix[i][j] = 0.01 * (rand() % 1001);
 
} 
 
void Matrix::Show() // вывод матрицы
{ 
    int i, j; 
 
    for ( i = 0; i < N; ++i) 
        for ( j = 0; j < M; ++j) 
        { 
            if( j % M == 0) 
                std::cout << std::endl; 
            std::cout << std::setw(10) << matrix[i][j]; 
        } 
        std::cout << std::endl;
} 
 
Matrix Matrix :: operator + ( const Matrix& ob) // сумма матриц
{  
    Matrix temp;                        // реализовано с помощью временного объекта
    temp.N = this->N; 
    temp.M = this->M; 
    int i, j;
    temp.matrix = new double*[temp.N]; 
    for ( i = 0; i < temp.N; ++i) 
        temp.matrix[i] = new double[temp.M]; 
 
    for ( i = 0; i < temp.N; ++i) 
        for ( j = 0; j < temp.M; ++j) 
            temp.matrix[i][j] = this->matrix[i][j] + ob.matrix[i][j]; 
    return temp;
 
} 
 
Matrix Matrix::operator=(const Matrix& ob) // оператор присваивания
{ 
    int i, j;                       // реализовано без временного объекта
 
    for ( i = 0; i < this->N; ++i) 
        for ( j = 0; j < this->M; ++j) 
            this->matrix[i][j] = ob.matrix[i][j]; 
    return *this;
 
} 
 
Matrix Matrix::operator - (const Matrix& ob) // разность матриц
{ 
    int i, j; 
    for ( i = 0; i < this->N; ++i) 
        for ( j = 0; j < this->M; ++j) 
            this->matrix[i][j] = this->matrix[i][j] - ob.matrix[i][j]; 
    return *this;
} 
 
Matrix Matrix::operator * (const Matrix& ob) // умножение матриц
{   
 
    
    Matrix temp; 
    temp.N = this->N; 
    temp.M = this->M; 
    int i, j, k;
    temp.matrix = new double*[temp.N]; 
    for ( i = 0; i < temp.N; ++i) 
        temp.matrix[i] = new double[temp.M];
 
    for ( i = 0; i < temp.N; ++i) 
        for ( j = 0; j < temp.M; ++j) 
        {   
            temp.matrix[i][j] = 0;
            for ( k = 0; k < temp.M; ++k)     
               temp.matrix[i][j] = temp.matrix[i][j] + (this->matrix[i][k] * ob.matrix[k][j]); 
        }
    return temp; 
}
 
 
int main() 
{   
    srand((unsigned) time(0));
    Matrix m1(3, 3); 
    m1.Enter(); 
    m1.Show(); 
    Matrix m2(3, 3); 
    m2.Enter();
    m2.Show();
    Matrix m3(3,3); 
    m3 = m1 * m2;
    m3.Show();
    
}


Посмотри внимательно, возможны ошибки, ты можешь просто от этого кода оттолкнуться и как тебе надо его поменять. Я исходил из того что все матрицы одинакового размера, поэтому если надо изменить легко.
Спасибо большое, сейчас буду разбираться) Ещё раз спасибо!

double Matrix::operator() (int i, int j) //обращение к отдельному элементу

Можно узнать поконкретней, что она делает?
0
1321 / 983 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
18.11.2012, 21:34 18
Цитата Сообщение от The1Phoenix Посмотреть сообщение
ouble Matrix::operator() (int i, int j) //обращение к отдельному элементу
Можно узнать поконкретней, что она делает?
i и j индексы элемента, если индексы не выходят за пределы размера матрицы, то тогда возвращается элемент с этими индексами иначе сообщение об ошибки.
1
I.M.
19.11.2012, 01:53
  #19

Не по теме:

Цитата Сообщение от The1Phoenix Посмотреть сообщение
typedef double T;
Как будто преподаватели взяли методичку по шаблонам, выкинули оттуда template, а чтобы остальное не переписывать, влепили туда typedef на все вхождения типа T. Во всяком случае, я вначале решил, что реализуется шаблонный класс.

0
2 / 2 / 1
Регистрация: 28.03.2012
Сообщений: 76
19.11.2012, 08:15  [ТС] 20
Цитата Сообщение от I.M. Посмотреть сообщение

Не по теме:


Как будто преподаватели взяли методичку по шаблонам, выкинули оттуда template, а чтобы остальное не переписывать, влепили туда typedef на все вхождения типа T. Во всяком случае, я вначале решил, что реализуется шаблонный класс.

Всё возможно)
0
19.11.2012, 08:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.11.2012, 08:15
Помогаю со студенческими работами здесь

Создать класс Matrix
Для соответствующего класса, перегрузить арифметические операции(+,-,*,/). При перезгузке...

Создать класс matrix
разработать класс Matrix – матрица, физически представляющая собой вектор, состоящий из заданного...

Реализовать класс matrix
реализовать класс matrix. класс предназначен для работы с типом данных таблица. в классе определить...

Создать параметризированный класс Matrix
Создать параметризированный класс Matrix – матрица. Класс должен содержать конструкторы,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru