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

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

Восстановить пароль Регистрация
 
igdev
10 / 10 / 2
Регистрация: 22.04.2016
Сообщений: 75
Завершенные тесты: 1
23.04.2016, 13:03     Разработать класс Матрица #1
Дано задание:
Создать класс матрица Данный класс содержит указатель на int, размер строк и столбцов и
состояние ошибки. Определить конструктор без параметров, конструктор с одним параметром и
конструктор с двумя параметрами, деструктор. Конструктор без параметров выделяет место для
одного элемента и инициализирует его в ноль. Конструктор с одним параметром, - размер массива, -
выделяет место и инициализирует номером в массиве, конструктор с двумя параметрами выделяет
место (первый аргумент) и инициализирует вторым аргументом. Деструктор освобождает память.
Определить методы доступа: возвращать значение элемента (i,j) и адрес этого элемента. Определить
функцию печати. Определить функции сложения и вычитания (матрицы с матрицей), умножение
матрицы на матрицу. Определить умножение матрицы на число. Проверить работу этого класса. В
случае нехватки памяти, несоответствия размерностей, выхода за пределы устанавливать код
ошибки.

Подскажите, пожалуйста, алгоритм решения данного задания. С чего и как правильно начать?
Может, у кого-то есть подобные примеры?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5948 / 5553 / 1785
Регистрация: 18.12.2011
Сообщений: 14,191
Завершенные тесты: 1
23.04.2016, 13:08     Разработать класс Матрица #2
Начните с такого шаблона
Образцы (шаблоны) программ для типовых задач
А потом см. ссылки внизу страницы
igdev
10 / 10 / 2
Регистрация: 22.04.2016
Сообщений: 75
Завершенные тесты: 1
24.04.2016, 12:17  [ТС]     Разработать класс Матрица #3
zss,
Написал часть программы: конструктор без параметров, конструктор с одним параметром, конструктор с двумя параметрами и деструктор.
Компилятор почему-то ругается на конструктор с одним параметром и на конструктор с двумя параметрами. В чем причина? Что я сделал не так?
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>
 
using namespace std;
 
 
class Matrix
{
public:
    int **mat;
    int *rows;  //число строк
    int *colls; //число столбцов
    size_t SIZE;
 
    Matrix();//конструктор без параметров
    Matrix(size_t size = 0) : SIZE(size);//конструктор с одним параметром
    Matrix(size_t size = 0, int inAr) : SIZE(size);//конструктор с двумя параметрами
    ~Matrix();//деструктор
 
    void printMatrix();
    void sumElMatrix();
    void diffElMatrix();
    void multElMatrix();
    void multMatrOnNumb();
};
 
Matrix::Matrix()
{
    this->mat = NULL;
    this->rows = 0;
    this->colls = 0;
}
 
Matrix::Matrix(size_t size = 0):SIZE(size)
{
    mat = new int* [SIZE];
    for(int i = 0; i < SIZE; i++)
    {
        mat[i] = new int[SIZE];
    }
}
 
Matrix::Matrix(size_t size = 0, int inAr) : SIZE (size)
{
    mat = new int* [SIZE];
    for (int i = 0; i < SIZE; i++)
    {
        mat[i] = new int[inAr];
    }
}
 
 
Matrix::~Matrix()
{
    for(int i = 0; i < SIZE; ++i)
    {
        delete  [] mat[i];
        mat[i] = NULL;
    }
    delete [] mat;
    mat = NULL;
}
 
int main()
{
 
    return 0;
}
zss
Модератор
Эксперт С++
 Аватар для zss
5948 / 5553 / 1785
Регистрация: 18.12.2011
Сообщений: 14,191
Завершенные тесты: 1
24.04.2016, 13:06     Разработать класс Матрица #4
У вас неоднозначность в конструкторах, уберите в параметрах =0
C++
1
2
 Matrix(size_t size);//конструктор с одним параметром
    Matrix(size_t size, int inAr);//конструктор с двумя параметрами
Добавлено через 2 минуты
Цитата Сообщение от igdev Посмотреть сообщение
int *rows; //число строк int *colls; //число столбцов
Почему это указатели? И почему Вы их не инициализируете в конструкторах?

Добавлено через 1 минуту
Цитата Сообщение от igdev Посмотреть сообщение
mat[i] = new int[inAr];
inAr ничему не присваивается. Как Вы потом узнаете длину строки?
igdev
10 / 10 / 2
Регистрация: 22.04.2016
Сообщений: 75
Завершенные тесты: 1
24.04.2016, 13:41  [ТС]     Разработать класс Матрица #5
Немного поправил:
C++
1
2
int rows;  //число строк
    int colls; //число столбцов
А также сделал изменения в конструкторе с двумя параметрами:
C++
1
2
3
4
5
6
7
8
9
10
11
Matrix(int rows, int colls)
{
    cout << "Введите количество строк, а затем столбцов" << endl;
    cin >> rows;
    cin >> colls;
    mat = new int* [rows];
    for (int i = 0; i < rows; i++)
    {
        mat[i] = new int[colls];
    }
}
igdev
10 / 10 / 2
Регистрация: 22.04.2016
Сообщений: 75
Завершенные тесты: 1
26.04.2016, 22:35  [ТС]     Разработать класс Матрица #6
zss,
Написал программу. Запускаю на исполнение. Ввожу rows и colls (число строк и число столбцов) и ничего не происходит. В чем может быть причина?

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
#include <iostream>
#include <cstdlib>
const int ERR_EXIT = -1;
 
using namespace std;
 
 
class Matrix
{
public:
    int **mat;
    int rows;  //число строк
    int colls; //число столбцов
    size_t SIZE;
 
    Matrix();//конструктор без параметров
    Matrix(size_t size);//конструктор с одним параметром
    Matrix(int rows, int colls);//конструктор с двумя параметрами
    Matrix(const Matrix &COP);//конструкор копирования
    ~Matrix();//деструктор
 
    void printMatrix();//печать матрицы
    Matrix operator = (Matrix &A);//присвоение
    Matrix operator + (Matrix &A);//сложение
    Matrix operator - (Matrix &A);//вычитание
    Matrix operator * (Matrix &A);//умножение матрицы на матрицу
    Matrix operator * (int num);//умножение матрицы на число
    Matrix set_ZERO();//обнуление матрицы
    Matrix inMat();//ввод данных в матрицу
};
 
//Конструктор без параметров
Matrix::Matrix()
{
    this->mat = NULL;
    this->rows = 0;
    this->colls = 0;
}
 
//Конструктор с одним параметром
Matrix::Matrix(size_t size = 0):SIZE(size)
{
    mat = new int* [SIZE];
    for(int i = 0; i < SIZE; i++)
    {
        mat[i] = new int[SIZE];
    }
}
 
//Конструктор с двумя параметрами
Matrix::Matrix(int rows, int colls)
{
//    cout << "Введите количество строк, а затем столбцов" << endl;
//    cin >> rows;
//    cin >> colls;
    if (!(mat = new int* [rows]))
    {
        cerr << "Невозможно разместить матрицу в памяти";
        exit(ERR_EXIT);
    }
    for (int i = 0; i < rows; i++)
    {
        if (!(mat[i] = new int[colls]))
        {
            cerr << "Невозможно разместить матрицу в памяти";
            exit (ERR_EXIT);
        }
    }
    for (int i = 0; i<rows; i++) //заполняем массив случ. знач
            for (int j = 0; j<colls; j++)
                mat[i][j] = 1+rand()%9;
}
 
//Конструктор копирования
Matrix::Matrix(const Matrix &COP)
{
    int i,j;
    rows = COP.rows;
    colls = COP.colls;
 
    if (!(mat = new int*[rows]))
    {
        cerr << "Невозможно разместить матрицу в памяти";
        exit(ERR_EXIT);
    }
    for (i = 0; i < rows; i++)
    {
        if (!(mat[i] = new int [colls]))
        {
            cerr << "Невозможно разместить матрицу в памяти";
            exit(ERR_EXIT);
        }
    }
    //Копируем матрицу в новое расположение
    for (j = 0; j < colls; j++)
    {
        for (i = 0; i < rows; i++)
        {
            mat[i][j] = COP.mat[i][j];
        }
    }
}
 
//Присваивание /=/
Matrix Matrix::operator=(Matrix &A)
{
    int i,j;
    for (i = 0; i < colls; i++)
        delete (mat[i]);
        delete (mat);
    rows = A.rows;
    colls = A.colls;
 
    if (!(mat = new int*[rows]))
    {
        cerr << "Невозможно разместить матрицу в памяти";
        exit(ERR_EXIT);
    }
 
    for (i = 0; i < rows; i++)
    {
        if (!(mat[i] = new int [colls]))
        {
            cerr << "Невозможно разместить матрицу в памяти";
            exit(ERR_EXIT);
        }
    }
 
    for (j = 0; j < A.rows; j++)
    {
        for (i = 0; i < A.colls; i++)
        {
            mat[i][j] = A.mat[i][j];
        }
    }
 
    return *this;
}
 
//Деструктор
Matrix::~Matrix()
{
    for(int i = 0; i < SIZE; ++i)
    {
        delete  [] mat[i];
        mat[i] = NULL;
    }
    delete [] mat;
    mat = NULL;
}
 
//Обнуление матрицы
Matrix Matrix::set_ZERO()
{
    int i,j;
    for (j = 0; j < colls; j++)
        for (i = 0; i < rows; i++)
        mat[i][j] = 0;
    return *this;
}
 
//Вычитание /-/
Matrix Matrix::operator-(Matrix &A)
{
    int i,j;
    if (colls != A.colls || rows != A.rows )
    {
        cerr << "Матрица не совместима с операцией -";
        exit(ERR_EXIT);
    }
    Matrix C (rows, colls);
    for (j = 0; j < colls; j++)
    {
        for (i = 0; i < rows; i++)
        {
            C.mat[i][j] = mat[i][j] - A.mat[i][j];
        }
    }
    return C;
}
 
//Сложение /+/
Matrix Matrix::operator+(Matrix &A)
{
    int i,j;
    if (colls != A.colls || rows != A.rows )
    {
        cerr << "Матрица не совместима с операцией +";
        exit(ERR_EXIT);
    }
    Matrix C (rows, colls);
    for (j = 0; j < colls; j++)
    {
        for (i = 0; i < rows; i++)
        {
            C.mat[i][j] = A.mat[i][j] + mat[i][j];
        }
    }
    return C;
}
 
//Умножение /*/
Matrix Matrix::operator*(Matrix &A)
{
    int i,j,k;
    if ((colls != A.rows))
    {
        cerr << "Матрица не совместима с операцией *";
        exit(ERR_EXIT);
    }
 
    Matrix M (rows, colls);
    M.set_ZERO();
 
    for (j = 0; j < A.colls; j++)
        for (i = 0; i < rows; i++)
            for (k = 0; k < A.rows; k++)
                M.mat[i][j] = M.mat[i][j] + mat[i][k] *  A.mat[k][j];
    return M;
}
 
//Умножение на число
Matrix Matrix::operator*(int num)
{
    int i,j;
    for (j = 0; j < colls; j++)
        for (i = 0; i < rows; i++)
            mat[i][j] = num * mat[i][j];
    return *this;
}
 
//Ввод данных
Matrix Matrix::inMat()
{
    int i,j;
    cout << "Введите матрицу " << endl;
    cout << rows << 'X' << colls << ":" << endl;
 
    for (i = 0 ; i < rows; i++)
    {
        for (j = 0; j < colls; j++)
        {
            cin >> mat[i][j];
        }
    }
    return *this;
}
 
//функция печати матрицы
void Matrix::printMatrix()
{
   for (int i = 0; i<rows; i++)
        {
            for (int j = 0; j<colls; j++)
            {
                cout << mat[i][j] << " ";
            }
            cout << endl;
        }
}
 
int main()
{
    setlocale(0,"");
    int i,j;
 
    Matrix A(4,4);
    A.inMat();
    A.printMatrix();
 
    return 0;
}
zss
Модератор
Эксперт С++
 Аватар для zss
5948 / 5553 / 1785
Регистрация: 18.12.2011
Сообщений: 14,191
Завершенные тесты: 1
27.04.2016, 19:40     Разработать класс Матрица #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Matrix::~Matrix()
{
    for(int i = 0; i < rows; ++i) // было SIZE
...  
 
 
void Matrix::set_ZERO() // void!!!!
void Matrix::inMat();     //  тоже надо  void!!!!
 
//Конструктор с двумя параметрами
Matrix::Matrix(int _rows, int _colls)
{
    rows=_rows; // не было присвоения
    colls=_colls;  // не было присвоения
...
А вообще для отлавливания таких блох существует отладчик
Как пользоваться отладчиком (в Visual Studio)
igdev
10 / 10 / 2
Регистрация: 22.04.2016
Сообщений: 75
Завершенные тесты: 1
04.05.2016, 22:26  [ТС]     Разработать класс Матрица #8
Почему void? Эти же функции возвращают *this ?
Цитата Сообщение от zss Посмотреть сообщение
void Matrix::set_ZERO() // void!!!!
void Matrix::inMat(); * * // *тоже надо *void!!!!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Ввод данных
Matrix Matrix::inMat()
{
    int i,j;
    cout << "Введите матрицу " << endl;
    cout << rows << 'X' << colls << ":" << endl;
 
    for (i = 0 ; i < rows; i++)
    {
        for (j = 0; j < colls; j++)
        {
            cin >> mat[i][j];
        }
    }
    return *this;
}
C++
1
2
3
4
5
6
7
8
9
// Обнуление матрицы
Matrix Matrix::set_ZERO()
{
    int i,j;
    for (j = 0; j < colls; j++)
        for (i = 0; i < rows; i++)
        mat[i][j] = 0;
    return *this;
}
Добавлено через 18 минут
zss,
Еще есть один очень неприятный баг, который я никак не могу выловить отладчиком.
По найденным мною примеров перегрузки операторов, все должно работать в следующем виде:
C++
1
С = А * В;
,где С пустая матрица, которой присваивается результат умножения двух непустых матриц А и В.
Однако, компилятор выдает мне следующую ошибку:
no match for 'operator=' (operand types are 'Matrix' and 'Matrix')

Если же написать так:
C++
1
Matrix C = A * B;
то все работает.

Как избавится от данного костыльного решения?

P.S.Свою функцию main также прилагаю.

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
int main()
{
    setlocale(0,"");
    int i;
 
    Matrix  F(4), A( 4, 4 ), B( 4, 4 ), С(4, 4), G;
    cout << "Матрица F" << endl;
    F.printMatrixOne();
    cout << "Матрица G" << endl;
    G.printMatrix();
    cout << "Матрица А" << endl;
    A.printMatrix();
    cout << "Матрица B" << endl;
    B.printMatrix();
    C = A * B; // Здесь ошибка
    cout << "Матрица С" << endl;
    C.printMatrix();
    cout << "Введите множитель i = " << endl;
    cin >> i;
    C * i;
    cout << "Матрица С" << endl;
    C.printMatrix();
 
    return 0;
}
igdev
10 / 10 / 2
Регистрация: 22.04.2016
Сообщений: 75
Завершенные тесты: 1
07.05.2016, 16:58  [ТС]     Разработать класс Матрица #9
Проблема остается актуальной. Где я допустил ошибку? Никак не могу найти и исправить.
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,810
Завершенные тесты: 1
07.05.2016, 17:27     Разработать класс Матрица #10
Цитата Сообщение от igdev Посмотреть сообщение
Где я допустил ошибку?
ошибка в 358 строке, я думаю.
igdev
10 / 10 / 2
Регистрация: 22.04.2016
Сообщений: 75
Завершенные тесты: 1
07.05.2016, 18:18  [ТС]     Разработать класс Матрица #11
hoggy, у меня ведь всего 272 строк кода. Откуда 358 строк?
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,810
Завершенные тесты: 1
07.05.2016, 19:11     Разработать класс Матрица #12
Цитата Сообщение от igdev Посмотреть сообщение
у меня ведь всего 272 строк кода. Откуда 358 строк?
так вы же его не показывали после всех исправлений.
пришлось включить телепатию...
igdev
10 / 10 / 2
Регистрация: 22.04.2016
Сообщений: 75
Завершенные тесты: 1
07.05.2016, 20:02  [ТС]     Разработать класс Матрица #13
hoggy,
Вот мой код:
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
#include <iostream>
#include <cstdlib>
 
const int ERR_EXIT = -1;
 
using namespace std;
 
 
class Matrix
{
public:
    int **mat;
    int rows;  // число строк
    int colls; // число столбцов
    size_t SIZE;
 
    Matrix();// конструктор без параметров
    Matrix(int _rows);// конструктор с одним параметром
    Matrix(int _rows, int _colls);// конструктор с двумя параметрами
    Matrix(const Matrix &COP);// конструкор копирования
    ~Matrix();// деструктор
 
    void printMatrix();// печать матрицы
    void printMatrixOne(); // Печать матрицы с одним параметром
    Matrix operator = (Matrix &A);// присвоение
    Matrix operator + (Matrix &A);//сложение
    Matrix operator - (Matrix &A);// вычитание
    Matrix operator * (Matrix &A);// умножение матрицы на матрицу
    Matrix operator * (int num);// умножение матрицы на число
    Matrix set_ZERO();// обнуление матрицы
    Matrix inMat();// ввод данных в матрицу
};
 
// Конструктор без параметров
Matrix::Matrix()
{
    mat = NULL;
    rows = 0;
    colls = 0;
}
 
// Конструктор с одним параметром
Matrix::Matrix(int _rows )
{
    rows = _rows;
    mat = new int* [_rows];
    for(int i = 0; i < _rows; i++)
    {
        mat[i] = new int[_rows];
    }
}
 
// Конструктор с двумя параметрами
Matrix::Matrix(int _rows, int _colls)
{
    rows = _rows;
    colls = _colls;
    if (!(mat = new int* [_rows]))
    {
        cerr << "Невозможно разместить матрицу в памяти";
        exit(ERR_EXIT);
    }
    for (int i = 0; i < _rows; i++)
    {
        if (!(mat[i] = new int[_colls]))
        {
            cerr << "Невозможно разместить матрицу в памяти";
            exit (ERR_EXIT);
        }
    }
    for (int i = 0; i < _rows; i++) // заполняем массив случ. знач
            for (int j = 0; j < _colls; j++)
                mat[i][j] = 1+rand()%9;
}
 
// Конструктор копирования
Matrix::Matrix(const Matrix &COP)
{
    int i,j;
    rows = COP.rows;
    colls = COP.colls;
 
    if (!(mat = new int*[rows]))
    {
        cerr << "Невозможно разместить матрицу в памяти";
        exit(ERR_EXIT);
    }
    for (i = 0; i < rows; i++)
    {
        if (!(mat[i] = new int [colls]))
        {
            cerr << "Невозможно разместить матрицу в памяти";
            exit(ERR_EXIT);
        }
    }
    //Копируем матрицу в новое расположение
    for (j = 0; j < colls; j++)
    {
        for (i = 0; i < rows; i++)
        {
            mat[i][j] = COP.mat[i][j];
        }
    }
 
}
 
// Присваивание /=/
Matrix Matrix::operator=(Matrix &A)
{
    int i,j;
    for (i = 0; i < colls; i++)
        delete (mat[i]);
        delete (mat);
    rows = A.rows;
    colls = A.colls;
 
    if (!(mat = new int*[rows]))
    {
        cerr << "Невозможно разместить матрицу в памяти";
        exit(ERR_EXIT);
    }
 
    for (i = 0; i < rows; i++)
    {
        if (!(mat[i] = new int [colls]))
        {
            cerr << "Невозможно разместить матрицу в памяти";
            exit(ERR_EXIT);
        }
    }
 
    for (j = 0; j < A.rows; j++)
    {
        for (i = 0; i < A.colls; i++)
        {
            mat[i][j] = A.mat[i][j];
        }
    }
 
    return *this;
}
 
// Деструктор
Matrix::~Matrix()
{
    for(int i = 0; i < rows; ++i)
    {
        delete  [] mat[i];
        mat[i] = NULL;
    }
    delete [] mat;
    mat = NULL;
}
 
// Обнуление матрицы
Matrix Matrix::set_ZERO()
{
    int i,j;
    for (j = 0; j < colls; j++)
        for (i = 0; i < rows; i++)
        mat[i][j] = 0;
    return *this;
}
 
// Вычитание /-/
Matrix Matrix::operator-(Matrix &A)
{
    int i,j;
    if (colls != A.colls || rows != A.rows )
    {
        cerr << "Матрица не совместима с операцией -";
        exit(ERR_EXIT);
    }
    Matrix C (rows, colls);
    for (j = 0; j < colls; j++)
    {
        for (i = 0; i < rows; i++)
        {
            C.mat[i][j] = mat[i][j] - A.mat[i][j];
        }
    }
    return C;
}
 
// Сложение /+/
Matrix Matrix::operator+(Matrix &A)
{
    int i,j;
    if (colls != A.colls || rows != A.rows )
    {
        cerr << "Матрица не совместима с операцией +";
        exit(ERR_EXIT);
    }
    Matrix C (rows, colls);
    for (j = 0; j < colls; j++)
    {
        for (i = 0; i < rows; i++)
        {
            C.mat[i][j] = A.mat[i][j] + mat[i][j];
        }
    }
    return C;
}
 
// Умножение /*/
Matrix Matrix::operator*(Matrix &A)
{
    int i,j,k;
    if ((colls != A.rows))
    {
        cerr << "Матрица не совместима с операцией *";
        exit(ERR_EXIT);
    }
 
    Matrix M (rows, colls);
    M.set_ZERO();
 
    for (j = 0; j < A.colls; j++)
        for (i = 0; i < rows; i++)
            for (k = 0; k < A.rows; k++)
                M.mat[i][j] = M.mat[i][j] + mat[i][k] *  A.mat[k][j];
    return M;
}
 
// Умножение на число
Matrix Matrix::operator*(int num)
{
    int i,j;
    for (j = 0; j < colls; j++)
        for (i = 0; i < rows; i++)
            mat[i][j] = num * mat[i][j];
    return *this;
}
 
// Ввод данных
Matrix Matrix::inMat()
{
    int i,j;
    cout << "Введите матрицу " << endl;
    cout << rows << 'X' << colls << ":" << endl;
 
    for (i = 0 ; i < rows; i++)
    {
        for (j = 0; j < colls; j++)
        {
            cin >> mat[i][j];
        }
    }
    return *this;
}
 
// Функция печати матрицы
void Matrix::printMatrix()
{
   for (int i = 0; i<rows; i++)
        {
            for (int j = 0; j<colls; j++)
            {
                cout << mat[i][j] << " ";
            }
            cout << endl;
        }
}
 
// Функция печати матрицы с одним параметром
void Matrix::printMatrixOne()
{
   for (int i = 0; i<rows; i++)
        {
            cout << mat[i] << " ";
        }
            cout << endl;
}
int main()
{
    setlocale(0,"");
    int i;
 
    Matrix  F(4), A( 4, 4 ), B( 4, 4 ), C(4, 4), G;
    //A.inMat();
    cout << "Матрица F" << endl;
    F.printMatrixOne();
    cout << "Матрица G" << endl;
    G.printMatrix();
    cout << "Матрица А" << endl;
    A.printMatrix();
    cout << "Матрица B" << endl;
    B.printMatrix();
    C = A * B;
    cout << "Матрица С" << endl;
    C.printMatrix();
    cout << "Введите множитель i = " << endl;
    cin >> i;
    C * i;
    cout << "Матрица С" << endl;
    C.printMatrix();
 
 
 
 
    return 0;
}
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
07.05.2016, 20:24     Разработать класс Матрица #14
Сообщение было отмечено автором темы, экспертом или модератором как ответ
так должен выглядеть оператор присваивания
C++
1
Matrix& operator = (const Matrix &A) // без const это уже другая функция!
igdev
10 / 10 / 2
Регистрация: 22.04.2016
Сообщений: 75
Завершенные тесты: 1
07.05.2016, 20:39  [ТС]     Разработать класс Матрица #15
retmas, Заработало!

И еще один маленький вопрос. Как мне правильно заполнить случайными значениями матрицу-строку в конструкторе с одним параметром?
Делаю так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Конструктор с одним параметром
Matrix::Matrix(int _rows )
{
    rows = _rows;
    mat = new int* [_rows];
    for(int i = 0; i < _rows; i++)
    {
        mat[i] = new int[_rows];
    }
    for (int i = 0; i < _rows; i++)
    {
        mat[i] = 1+rand()%9;
    }
}
Компилятор выдает следующую ошибку:
invalid conversion from 'int' to 'int*' [-fpermissive]
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
07.05.2016, 20:50     Разработать класс Матрица #16
с одним параметром - это квадратная что ли? тогда
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Matrix::Matrix(int _rows )
{
    rows = colls = _rows;
    mat = new int* [_rows];
    for(int i = 0; i < _rows; i++)
    {
        mat[i] = new int[_rows];
    }
    for (int i = 0; i < _rows; i++)
    {
        for (int j = 0; j < _rows; j++)
            mat[i][j] = 1+rand()%9;
    }
}
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,810
Завершенные тесты: 1
07.05.2016, 20:57     Разработать класс Матрица #17
Цитата Сообщение от igdev Посмотреть сообщение
retmas, Заработало!
видите, как все просто, когда человек по человечачьи выкладывает код
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.05.2016, 21:01     Разработать класс Матрица
Еще ссылки по теме:

C++ Разработать класс
Разработать класс "Разреженная матрица" C++
C++ Определить базовый класс "Матрица" и класс-потомок "Треугольная матрица"

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

Или воспользуйтесь поиском по форуму:
igdev
10 / 10 / 2
Регистрация: 22.04.2016
Сообщений: 75
Завершенные тесты: 1
07.05.2016, 21:01  [ТС]     Разработать класс Матрица #18
retmas, Теперь все работает. Благодарю!
Yandex
Объявления
07.05.2016, 21:01     Разработать класс Матрица
Ответ Создать тему
Опции темы

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