Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.58/55: Рейтинг темы: голосов - 55, средняя оценка - 4.58
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
1

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

23.04.2016, 13:03. Показов 10042. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дано задание:
Создать класс матрица Данный класс содержит указатель на int, размер строк и столбцов и
состояние ошибки. Определить конструктор без параметров, конструктор с одним параметром и
конструктор с двумя параметрами, деструктор. Конструктор без параметров выделяет место для
одного элемента и инициализирует его в ноль. Конструктор с одним параметром, - размер массива, -
выделяет место и инициализирует номером в массиве, конструктор с двумя параметрами выделяет
место (первый аргумент) и инициализирует вторым аргументом. Деструктор освобождает память.
Определить методы доступа: возвращать значение элемента (i,j) и адрес этого элемента. Определить
функцию печати. Определить функции сложения и вычитания (матрицы с матрицей), умножение
матрицы на матрицу. Определить умножение матрицы на число. Проверить работу этого класса. В
случае нехватки памяти, несоответствия размерностей, выхода за пределы устанавливать код
ошибки.

Подскажите, пожалуйста, алгоритм решения данного задания. С чего и как правильно начать?
Может, у кого-то есть подобные примеры?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.04.2016, 13:03
Ответы с готовыми решениями:

Разработать класс Матрица
Помогите исправить код!!! задача рабочая,но целиком не работает!Т.е когда вырезаешь (коментируешь)...

Разработать класс Matrix - матрица
Разработать класс Matrix - матрица. Размерность матрицы задавать в конструкторе.

Разработать класс NormMatrix (матрица с единичным определителем)
Разработать класс NormMatrix (матрица с единичным определителем), наследованный от класса Matrix....

Разработать класс матрица, конструктор по умолчанию, вывод на экран
Разработать класс матрица, конструктор по умолчанию, вывод на экран Вроде бы разработала но не...

17
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,713
23.04.2016, 13:08 2
Начните с такого шаблона
Образцы (шаблоны) программ для типовых задач
А потом см. ссылки внизу страницы
1
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
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;
}
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,713
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 ничему не присваивается. Как Вы потом узнаете длину строки?
0
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
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];
    }
}
0
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
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;
}
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,713
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)
1
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
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;
}
0
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
07.05.2016, 16:58  [ТС] 9
Проблема остается актуальной. Где я допустил ошибку? Никак не могу найти и исправить.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
07.05.2016, 17:27 10
Цитата Сообщение от igdev Посмотреть сообщение
Где я допустил ошибку?
ошибка в 358 строке, я думаю.
0
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
07.05.2016, 18:18  [ТС] 11
hoggy, у меня ведь всего 272 строк кода. Откуда 358 строк?
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
07.05.2016, 19:11 12
Цитата Сообщение от igdev Посмотреть сообщение
у меня ведь всего 272 строк кода. Откуда 358 строк?
так вы же его не показывали после всех исправлений.
пришлось включить телепатию...
0
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
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;
}
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
07.05.2016, 20:24 14
Лучший ответ Сообщение было отмечено igdev как решение

Решение

так должен выглядеть оператор присваивания
C++
1
Matrix& operator = (const Matrix &A) // без const это уже другая функция!
1
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
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]
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
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;
    }
}
1
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
07.05.2016, 20:57 17
Цитата Сообщение от igdev Посмотреть сообщение
retmas, Заработало!
видите, как все просто, когда человек по человечачьи выкладывает код
1
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
07.05.2016, 21:01  [ТС] 18
retmas, Теперь все работает. Благодарю!
0
07.05.2016, 21:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.05.2016, 21:01
Помогаю со студенческими работами здесь

Разработать класс "Разреженная матрица"
Разреженная матрица хранится в виде &lt;номер строки, номер столбца, значение&gt;. Если запрашивается...

Разработать класс "Квадратная матрица"; создать массив матриц и найти в нём матрицу, удовлетворяющую условию
Доброго времени суток!Нужно разработать класс матриц размера 3x3.Переопределить операции сложения,...

Класс: Разработать абстрактный класс класс Point для задания координаты...
Всем привет, помогите пожалуйста решить задачу, я уже всю голову сломал, не знаю как решить... ...

Создать класс СПИСОК целых чисел. Разработать класс СТЕК
&quot;Создать класс СПИСОК целых чисел. Разработать класс СТЕК, который вмещает объект класса СПИСОК....


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

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