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

Перегрузка операторов при работе с матрицей - C++

Восстановить пароль Регистрация
 
 
rura
0 / 0 / 0
Регистрация: 08.01.2014
Сообщений: 152
18.06.2014, 09:37     Перегрузка операторов при работе с матрицей #1
Ребята, помогите пожалуйста исправить ошибку. У меня в программе вроде не работает два оператор-функции.
С ними работаю первый раз. За грубейшие ошибки извиняюсь.
Вот моя программа:
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
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
class Matrix
{
    int long** mas;
    int size_x;
    int size_y;
 
    Matrix operator+ (const Matrix&);
    Matrix operator- (const Matrix&);
    void Proizvedenie(Matrix, Matrix);
    void Multiply_num(int);
 
    void init()
    {
        mas = new int long*[size_y];
        for (int i = 0; i < size_y; i++)
        {
            mas[i] = new int long[size_x];
        }
    }
 
    void fill()
    {
        for (int i = 0; i < size_y; i++)
        {
            for (int j = 0; j < size_x; j++)
            {
                mas[i][j] = rand() % 10;
            }
        }
    }
 
public:
 
    Matrix()
    {
        size_x = 0;
        size_y = 0;
    }
 
    Matrix(int x, int y)
    {
        size_x = x;
        size_y = y;
        init();
        fill();
    };
 
    ~Matrix()
    {
        for (int i = 0; i < size_y; i++)
        {
            delete[] mas[i];
        }
        delete[] mas;
 
    }
 
    void print()
    {
        for (int i = 0; i < size_y; i++)
        {
            for (int j = 0; j < size_x; j++) {
                cout << mas[i][j] << ' ';
            }
            cout << endl;
        }
    }
};
 
Matrix Matrix::operator+(const Matrix &rhs)
{
    Matrix result(*this);
 
    for (size_t i = 0; i < 3; ++i)
    for (size_t j = 0; j < 3; ++j)
        result.mas[i][j] += rhs.mas[i][j];
 
    return result;
}
 
Matrix Matrix::operator-(const Matrix &rhs)
{
    Matrix result(*this);
 
    for (size_t i = 0; i < 3; ++i)
    for (size_t j = 0; j < 3; ++j)
        result.mas[i][j] -= rhs.mas[i][j];
 
    return result;
}
 
/*coord coord::operator + (coord ob2)
{
    coord temp;
    temp.x = x + ob2.x;
    temp.у = у + оb2.у;
    return temp;
}
*/
 
 
int main(){
 
    setlocale(LC_ALL, "Russian");
    int x, y;
    cout << "Введите количество строк: ";
    cin >> y;
    cout << "Введите количество столбцов: ";
    cin >> x;
 
    Matrix ob3;
    Matrix ob1(x, y);
    Matrix ob2(x, y);
 
    ob1.print();
    cout << endl;
    ob2.print();
 
    ob3 = ob1 + ob2;
    ob3.print();
 
    ob3 = ob1 - ob2;
    ob3.print();
 
 
    system("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.06.2014, 09:37     Перегрузка операторов при работе с матрицей
Посмотрите здесь:

C++ Перегрузка операторов с++
перегрузка операторов C++
C++ не работает перегрузка операторов при выводе в cout
программа вылетает при работе с матрицей C++
Перегрузка операторов при наследовании C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rura
0 / 0 / 0
Регистрация: 08.01.2014
Сообщений: 152
18.06.2014, 10:38  [ТС]     Перегрузка операторов при работе с матрицей #21
Нет
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
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
class Matrix
{
    int long** mas;
    int size_x;
    int size_y;
 
 
 
    void init()
    {
        mas = new int long*[size_y];
        for (int i = 0; i < size_y; i++)
        {
            mas[i] = new int long[size_x];
        }
    }
 
    void fill()
    {
        for (int i = 0; i < size_y; i++)
        {
            for (int j = 0; j < size_x; j++)
            {
                mas[i][j] = rand() % 10;
            }
        }
    }
 
public:
 
    Matrix() :mas(NULL)
    {
        size_x = 0;
        size_y = 0;
    }
 
    Matrix(int x, int y)
    {
        size_x = x;
        size_y = y;
        init();
        fill();
    }
 
    Matrix(const Matrix& rhs)
    {
        size_x = rhs.size_x;
        size_y = rhs.size_y;
        init();
        for (int i = 0; i < size_y; i++)
        {
            for (int j = 0; j < size_x; j++)
            {
                mas[i][j] = rhs.mas[i][j];
            }
        }
    }
 
    ~Matrix()
    {
        for (int i = 0; i < size_y; i++)
        {
            delete[] mas[i];
        }
        delete[] mas;
 
    }
 
    void print()
    {
        for (int i = 0; i < size_y; i++)
        {
            for (int j = 0; j < size_x; j++) {
                cout << mas[i][j] << ' ';
            }
            cout << endl;
        }
    }
    const Matrix operator+ (const Matrix&);
    const Matrix operator- (const Matrix&);
    const Matrix & operator=(const Matrix&);
    const Matrix operator*(int f);
    void Multiply_num(int);
    const Matrix operator*(const Matrix &rhs)
};
 
const Matrix Matrix::operator+(const Matrix &rhs)
{
    Matrix result(rhs.size_x, rhs.size_y);
 
    for (int i = 0; i < size_y; ++i)
    for (int j = 0; j < size_x; ++j)
        result.mas[i][j] = mas[i][j] + rhs.mas[i][j];
 
    return result;
}
 
const Matrix Matrix::operator-(const Matrix &rhs)
{
    Matrix result(rhs.size_x, rhs.size_y);
 
    for (int i = 0; i < size_y; ++i)
    for (int j = 0; j < size_x; ++j)
        result.mas[i][j] = mas[i][j] - rhs.mas[i][j];
 
    return result;
}
const Matrix & Matrix::operator=(const Matrix &rhs)
{
    if (this == &rhs) return *this;
 
 
    if (!mas)
    {
 
        init();
    }
    else
    {
        for (int i = 0; i < size_y; i++)
        {
            delete[] mas[i];
        }
        delete[] mas;
        size_x = rhs.size_x;
        size_y = rhs.size_y;
        init();
    }
    for (int i = 0; i < size_y; ++i)
    for (int j = 0; j < size_x; ++j)
        mas[i][j] = rhs.mas[i][j];
 
    return *this;
}
 
const Matrix Matrix::operator*(int f)
{
    Matrix result(size_x, size_y);
 
    for (int i = 0; i < size_y; ++i)
    for (int j = 0; j < size_x; ++j)
        result.mas[i][j] = mas[i][j] * f;
 
    return result;
}
 
const Matrix Matrix::operator*(const Matrix &rhs)
{
    Matrix result(rhs.size_x, size_y);
 
    for (int i = 0; i < result.size_y; ++i)
    for (int j = 0; j < result.size_x; ++j)
    {
        result.mas[i][j] = 0;
        for (int k = 0; k < size_x; ++k)
            result.mas[i][j] += mas[i][k] * rhs.mas[k][j];
    }
 
    return result;
}
 
int main(){
 
    setlocale(LC_ALL, "Russian");
    int x, y;
    cout << "Введите количество строк: ";
    cin >> y;
    cout << "Введите количество столбцов: ";
    cin >> x;
 
    Matrix ob3;
    Matrix ob1(x, y);
    Matrix ob2(x, y);
 
    cout << "Первая матрица А:"<< endl;
    ob1.print();
    cout << endl;
    cout << "Вторая матрица В:" << endl;
    ob2.print();
    cout << endl;
 
    cout << "Матрица А + матрица В:" << endl;
    ob3 = ob1 + ob2;
    ob3.print();
    cout << endl;
        
    cout << "Матрица А - матрица В:" << endl;
    ob3 = ob1 - ob2;
    ob3.print();
    cout << endl;
 
    cout << "Матрица А умножиется на число 3:" << endl;
    ob3 = ob1 * 3;
    ob3.print();
    cout << endl;
 
    cout << "Матрица А умножиется на матрица В:" << endl;
    ob3 = ob1 * ob2;
    ob3.print();
    cout << endl;
 
    system("pause");
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rura
0 / 0 / 0
Регистрация: 08.01.2014
Сообщений: 152
18.06.2014, 10:40  [ТС]     Перегрузка операторов при работе с матрицей #22
Вот наглядно..
Миниатюры
Перегрузка операторов при работе с матрицей  
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
18.06.2014, 10:42     Перегрузка операторов при работе с матрицей #23
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от rura Посмотреть сообщение
if (!mas)
{
size_x = rhs.size_x;
size_y = rhs.size_y;
init();
}
в операторе =
rura
0 / 0 / 0
Регистрация: 08.01.2014
Сообщений: 152
18.06.2014, 10:45  [ТС]     Перегрузка операторов при работе с матрицей #24
Ого!)) Спасибо!)))
А не подскажите пожалуйста для чего этот оператор :
C++
1
const Matrix & Matrix::operator=(const Matrix &rhs)
?
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
18.06.2014, 10:53     Перегрузка операторов при работе с матрицей #25
оператор присваивающего копирования, необХодим тут
C++
1
ob3 = ob1 + ob2;
после вычисления суммы копирует значение суммарного объекта в объект ob3

Добавлено через 1 минуту
если его не написать он также будет реализован компилятором как и конструктор копирования, и опять же в случае работы с указателями, он будет некорректно работать, поэтому его необходимо руками описать
rura
0 / 0 / 0
Регистрация: 08.01.2014
Сообщений: 152
18.06.2014, 10:56  [ТС]     Перегрузка операторов при работе с матрицей #26
Поняла, спасибо.
А если у меня в задании написано: "Конструктор без параметров выделяет место для
одного элемента и инициализирует его в ноль. Конструктор с одним параметром, - размер массива, -
выделяет место и инициализирует номером в массиве, конструктор с двумя параметрами выделяет
место (первый аргумент) и инициализирует вторым аргументом."
Конструкторы нужно изменить и перегрузить?
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
18.06.2014, 10:58     Перегрузка операторов при работе с матрицей #27
Цитата Сообщение от rura Посмотреть сообщение
А если у меня в задании написано:
то у Вас не матрица а вектор
rura
0 / 0 / 0
Регистрация: 08.01.2014
Сообщений: 152
18.06.2014, 11:00  [ТС]     Перегрузка операторов при работе с матрицей #28
Где? В задании?
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
18.06.2014, 11:01     Перегрузка операторов при работе с матрицей #29
Цитата Сообщение от rura Посмотреть сообщение
размер массива
таки да, массив, вектор,...но не матрица
rura
0 / 0 / 0
Регистрация: 08.01.2014
Сообщений: 152
18.06.2014, 11:05  [ТС]     Перегрузка операторов при работе с матрицей #30
Блин А что мне делать, если задание такое?
Завтра сдавать, а препод меня съест...
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
18.06.2014, 11:10     Перегрузка операторов при работе с матрицей #31
убрать одну размерность

Добавлено через 18 секунд

Не по теме:

Цитата Сообщение от rura Посмотреть сообщение
а препод меня съест...
жесть хД



Добавлено через 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
class Vector
{
    int long* mas;
    int size_x;
public:
 
    Vector():mas(NULL)
    {
        mas = new long[1];
        mas[0] = 0;
    }
 
    Vector(int x):mas(NULL)
    {
        size_x = x;
        mas = new long[size_x];
        for(size_t i=0; i < size_x; i++)
        {
            mas[i] = i;
        }
    }
    Vector(int x, int g):mas(NULL)
    {
        size_x = x;
        mas = new long[size_x];
        for(size_t i=0; i < size_x; i++)
        {
            mas[i] = g;
        }
    }
};
какие метода еще надо реализовать?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
18.06.2014, 11:15     Перегрузка операторов при работе с матрицей #32
Нда. Это надо додуматься для матрицы общего вида перегружать сложение матриц строго 3x3. Такую кашу не всякий повар осилит.
rura
0 / 0 / 0
Регистрация: 08.01.2014
Сообщений: 152
18.06.2014, 12:25  [ТС]     Перегрузка операторов при работе с матрицей #33
Вот, я только не пойму откуда последняя матрица появляется...
Миниатюры
Перегрузка операторов при работе с матрицей  
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
18.06.2014, 12:56     Перегрузка операторов при работе с матрицей #34
умножение матриц, Вы что не знаете как оно делается?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.06.2014, 12:59     Перегрузка операторов при работе с матрицей
Еще ссылки по теме:

Перегрузка операторов C++
Перегрузка операторов C++
C++ Перегрузка операторов

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

Или воспользуйтесь поиском по форуму:
rura
0 / 0 / 0
Регистрация: 08.01.2014
Сообщений: 152
18.06.2014, 12:59  [ТС]     Перегрузка операторов при работе с матрицей #35
Знаю, но по коду сначала не поняла, что это за функция..
Yandex
Объявления
18.06.2014, 12:59     Перегрузка операторов при работе с матрицей
Ответ Создать тему
Опции темы

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