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

C++ перегрузка операторов, комплексные числа - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
Belaya_pantera
0 / 0 / 0
Регистрация: 12.12.2010
Сообщений: 6
19.05.2012, 22:24     C++ перегрузка операторов, комплексные числа #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
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
// Вспомогательная функция
//------------------------------------------------------------------------------
template <class TVal> void Rand(TVal *i)
{
 *i = (random(20)-10)/10.0;
};
 
// Вспомогательная функция для класса Complex
void Rand(Complex *i)
{
 double x,y;
 Rand(&x);
 Rand(&y);
 if (i == NULL) {i = new Complex(x, y);} [B]что здесь задается?[/B]
 i->re = x;
 i->im = y;
}; 
 
// Описание шаблона класса Matrix
//------------------------------------------------------------------------------
template <class TMatr> class Matrix
{
private:
 int Size;
 TMatr **Buf;
 int CoordTest(int i, int j){
 if ((i >= 0) && (i < Size) && (j >= 0) && (j < Size)) return 1;
 else return 0;}
public:
 Matrix();
 Matrix(int tSize);
 ~Matrix();
 // Методы получения информации из матрицы
 int GetLength(); // Получение размера матрицы
 TMatr GetVal(int i, int j); // Получить значение элемента матрицы
 void OutputMatr(); // Вывести на дисплей список значений матрицы
 // Методы добавление информации в матрицу
 void SetVal(int i, int j, TMatr val); // Присвоить новое значение элементу матрицы
 void InputMatr(); // Последовательный ввод всех значений массива с клавиатуры
 void RandomMatr(); // Заполнение массива случайными значениями
 void Add(Matrix&); // Сложение матриц
 void Mul(TMatr*); // Запись в массив произведения положительных элементов столбцов
 Matrix<TMatr> &operator = (Matrix<TMatr>&);
 bool operator > (Matrix<TMatr>&);
 // Оператор вывода
 friend ostream& operator << (ostream &arg1, Matrix<TMatr> &arg2)
 {
 for (int i=0; i < arg2.Size; i++)
 {
 for (int j=0; j < arg2.Size; j++) [B]и здесь???[/B]
 arg1 << arg2.Buf[i][j] << " ";
 arg1 << endl;
 }
 return(arg1);
 }
};
 
// Реализация методов шаблона класса Matrix
//------------------------------------------------------------------------------
 
template<class TMatr> Matrix<TMatr>::Matrix(){
Buf = NULL;
Size = 0;}
 
template<class TMatr> Matrix<TMatr>::Matrix(int tSize){
Size = tSize;
Buf = new TMatr *[Size];
for (int i=0; i < Size; i++)
 Buf[i] = new TMatr[Size];}
 
template<class TMatr> Matrix<TMatr>::~Matrix(){
if (Buf != NULL){
 for (int n = 0; n < Size; n++)
 delete [] Buf[n]; [B]что должно удалиться? [/B]
 delete [] Buf;}}
 
template<class TMatr> int Matrix<TMatr>::GetLength(){
 return Size;}
 
template<class TMatr> TMatr Matrix<TMatr>::GetVal(int i, int j){
 if (CoordTest(i,j)) return Buf[i][j]; [B]????[/B]
 else return 0;}
 
template<class TMatr> void Matrix<TMatr>::OutputMatr(){
 for (int i=0; i < Size; i++){
 for (int j=0; j < Size; j++){
 cout << Buf[i][j] << " ";}
 cout << "\n";}}
 
template<class TMatr> void Matrix<TMatr>::SetVal(int i, int j, TMatr val){
 if (CoordTest(i,j)) Buf[i][j]=val;}
 
template<class TMatr> void Matrix<TMatr>::InputMatr(){
 for (int i=0; i < Size; i++)
 for (int j=0; j < Size; j++){
 cout << "Input [" << i << "][" << j << "]: ";
 cin >> Buf[i][j];}}
 
template<class TMatr> void Matrix<TMatr>::RandomMatr(){
 for (int i=0; i < Size; i++){
 for (int j=0; j < Size; j++)
 Rand(&Buf[i][j]);}}
 
template<class TMatr> void Matrix<TMatr>::Add(Matrix &arg2)
{
if (Size != arg2.Size) return;
for (int i = 0; i < Size; i++) [B]???[/B]
 for (int j = 0; j < Size; j++)
 Buf[i][j] += arg2.Buf[i][j];
};
 
template<class TMatr> void Matrix<TMatr>::Mul(TMatr* arr)
{
for (int j = 0; j < Size; j++)
 {
 arr[j] = 1;
 for (int i = 0; i < Size; i++)
 if (Buf[i][j] > 0) arr[j] *= Buf[i][j];
 }
};
 
template<class TMatr>
 Matrix<TMatr> &Matrix<TMatr>::operator = (Matrix<TMatr>& arg2)
{
if (Buf != NULL)
 {
 for (int n = 0; n < Size; n++)
 delete [] Buf[n];
 delete [] Buf;
 }
Size = arg2.Size;
Buf = new TMatr *[Size];
for (int i=0; i < Size; i++) [B]?????[/B]
 Buf[i] = new TMatr[Size];
for (int i = 0; i < Size; i++)
 for (int j = 0; j < Size; j++)
 Buf[i][j] = arg2.Buf[i][j];
return(*this);
};
 
template<class TMatr> bool Matrix<TMatr>::operator > (Matrix<TMatr>& arg2)
{
TMatr s1 = Buf[0][0] * Buf[0][0];
TMatr s2 = arg2.Buf[0][0] * arg2.Buf[0][0];
for (int n = 1; n < Size; n++)
 s1 += Buf[n][n] * Buf[n][n];
for (int n = 1; n < arg2.Size; n++)
 s2 += arg2.Buf[n][n] * arg2.Buf[n][n]; [B]?????[/B]
return(s1 > s2);
};
// Шаблон класса Vector
//------------------------------------------------------------------------------
template <class Element>
class Vector
{
private:
 int size;
 Element *array;
public:
 Vector();
 Vector(int sz);
 ~Vector();              [B]???[/B]
 void Sort();
 void Print();
 Element& operator [] (int i);
 Vector<Element>& operator = (Vector<Element> &arg2);
 bool operator < (Vector<Element> &arg2);
};
 
// Конструктор по умолчанию
template<class Element> Vector<Element>::Vector()
{
 size = 0;
 array = NULL;
};
 
// Конструктор с параметром размера массива
template<class Element> Vector<Element>::Vector(int sz)
{
 size = sz;
 array = new Element[size];
};
 
// Деструктор
template<class Element> Vector<Element>::~Vector()
{
if(array != NULL) delete [] array;
};
 
// Сортировка массива
template<class Element> void Vector<Element>::Sort()
{
for(int i=0; i < size-1; i++)
 for(int j = i; j < size-1; j++)
 if(array[j] > array[j+1])
 {                                   [B]что за сортировка?[/B]
 Element *e = new Element;
 *e = array[j];
 array[j] = array[j+1];
 array[j+1] = *e;
 delete e;
 }
};
 
// Вывод на дисплей
template<class Element> void Vector<Element>::Print()
{
for(int i=0; i<size; i++)
 {cout << "[" << i << "]=" << endl << array[i];}
};
 
// Перегрузка оператора "[]"
template<class Element> Element& Vector<Element>::operator [] (int i)
{
return array[i];
};
 
// Перегрузка оператора "="
template<class Element>
 Vector<Element>& Vector<Element>::operator = (Vector<Element> &arg2)
{
if(array != NULL) {delete [] array;}
size = arg2.size;                     [B]?????[/B]
array = new Element[size];
for(int i=0; i<size; i++)
 array[i] = arg2.array[i];
return(*this);
};
 
// Перегрузка оператора "<"
template<class Element> bool Vector<Element>::operator < (Vector<Element> &arg2)
{
int minSize = size < arg2.size ? size : arg2.size;
for(int i = 0; i < minSize; i++)
 {
 if((*this)[i] > arg2[i]){return(true);} [B]??????[/B]
 }
return(false);
};
 
// Функции для демонстрации шаблона Vector, параметризованного шаблоном TList
//------------------------------------------------------------------------------
template <class TVal> void TestVector(int v1, int v2, int s)
{
clrscr();
cout << "Test object Vector:" << endl;
Vector<Matrix<TVal> > vect1(v1), vect2(v2);
Matrix<TVal> TmpMatr(s); [B]?????[/B]
// Заполняем Vect1
for (int n = 0; n < v1; ++n)
 {
 vect1[n] = TmpMatr;
 vect1[n].RandomMatr();
 }
cout << "vect1: " << endl;
vect1.Print();
cout << endl;
// Заполняем Vect2
for (int n = 0; n < v2; ++n) [B]??????[/B]
 {
 vect2[n] = TmpMatr;
 vect2[n].RandomMatr();
 }
cout << "vect2: " << endl;
vect2.Print();
cout << endl;
// Проверка перегруженного оператора сравнения
cout << "vect1 < vect2 = " << (vect1 < vect2) << endl << endl;
vect1 = vect2;
cout << "vect1 = vect2" << endl << endl; [B]???????[/B]
vect1.Sort();
cout << "Sorted array vect1: " << endl;
vect1.Print();
cout << endl << "Press any key..";
getch();
clrscr();
};
 
#pragma argsused
// Головная функция
//------------------------------------------------------------------------------
int main(int argc, char* argv[])
{
TestVector<Complex>(4, 5, 4);
return(0);
};
//------------------------------------------------------------------------------
Еще программа делает параметризацию вектором. Её быть не должно, что конкретно нужно убрать чтобы этого не происходило?
Задание: 1.Вставить в шаблонный класс TMatr. TMatr - квадратная матрица – то оператор сравнения можно реализовать, как сравнение суммы квадратов главных диагоналей.
2. Определить требования к типу, которым должен параметризоваться TMatr. Дополнить поведение класса TMatr необходимыми операторами.
4. TMatr, должен параметризоваться классом Complex.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.05.2012, 22:24     C++ перегрузка операторов, комплексные числа
Посмотрите здесь:

Комплексные числа/перегрузка C++
Перегрузка операторов с++ C++
Классы, комплексные числа и перегрузка оператора C++
C++ Перегрузка операторов
C++ Классы. Перегрузка операторов для комплексного числа
Перегрузка оператора, комплексные числа C++
C++ Перегрузка операторов + и =
C++ Перегрузка операторов

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
hepr
 Аватар для hepr
60 / 32 / 5
Регистрация: 21.10.2010
Сообщений: 538
19.05.2012, 23:29     C++ перегрузка операторов, комплексные числа #2
C++
1
if (i == NULL) {i = new Complex(x, y);} что здесь задается?
Если указатель нулевой, то присвоить ему новый объект комплексного числа.
C++
1
2
3
4
5
6
7
8
friend ostream& operator << (ostream &arg1, Matrix<TMatr> &arg2)
{
for (int i=0; i < arg2.Size; i++)
{
for (int j=0; j < arg2.Size; j++) и здесь???
arg1 << arg2.Buf[i][j] << " ";
arg1 << endl;
}
Здесь происходит заполнение ссылки на поток выводы значениями квадратной матрицы
Например:
Дана матрица:
1 2
3 4
Тогда, после выполнения кода agr1 = "1 2 3 4"
C++
1
delete [] Buf[n]; что должно удалиться?
Как следует из этого кода, Buf - массив массива и этот код удаляет подмассив номер n в этом объекте, ну или если вам так будет легче, то Buf - матрица чисел, а код удаляет строку номер n, было
1 2
3 4
5 6
Написали delete [] Buf[1];
Получили
1 2
_ _
5 6
C++
1
if (CoordTest(i,j)) return Buf[i][j]; ????
Если функция CoordTest вернет любое значение, кроме 0, то возвратится объект матрицы с координатами (i;j)
C++
1
2
for (int i=0; i < Size; i++) ?????
Buf[i] = new TMatr[Size];
Заполнить матрицу Buf
C++
1
s2 += arg2.Buf[n][n] * arg2.Buf[n][n]; ?????
К матрице s2 прибавить квадрат объекта матрицы Buf объекта agr2 с координатами (n;n)
C++
1
~Vector(); ???
Деструктор - функция, которая вызывается при уничтожение объекта класса Vector
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Сортировка массива
template<class Element> void Vector<Element>::Sort()
{
for(int i=0; i < size-1; i++)
for(int j = i; j < size-1; j++)
if(array[j] > array[j+1])
{ что за сортировка?
Element *e = new Element;
*e = array[j];
array[j] = array[j+1];
array[j+1] = *e;
delete e;
}
};
Вроде бы кривая пузырьковая )), кривая потому что непонятно почему объект создается именно динамически, когда логично было бы статически
C++
1
Matrix<TVal> TmpMatr(s); ?????
Объявление объекта TmpMatr класса Matrix, TVal - объекты какого класса матрица будет
содержать, а s - аргумент конструктора класса Matrix.
C++
1
cout << "vect1 = vect2" << endl << endl; ???????
Вывести "vect1 = vect2" и два раза перейти на новую строку
P.S. остальные вопросы практически идентичны тем, на которые я ответил выше
Belaya_pantera
0 / 0 / 0
Регистрация: 12.12.2010
Сообщений: 6
20.05.2012, 14:26  [ТС]     C++ перегрузка операторов, комплексные числа #3
Спасибо большое, очень понятно объяснили!
Но еще вопрос.. нужно убрать из программы векторы. Как изменить программу? Чтобы была по заданию.. не поможете?

Сама боюсь..я не справлюсь..
Цитата Сообщение от Belaya_pantera Посмотреть сообщение
Задание: 1.Вставить в шаблонный класс TMatr. TMatr - квадратная матрица – то оператор сравнения можно реализовать, как сравнение суммы квадратов главных диагоналей.
2. Определить требования к типу, которым должен параметризоваться TMatr. Дополнить поведение класса TMatr необходимыми операторами.
4. TMatr, должен параметризоваться классом Complex.
Yandex
Объявления
20.05.2012, 14:26     C++ перегрузка операторов, комплексные числа
Ответ Создать тему
Опции темы

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