Помощь - Поиск - Пользователи - Календарь
Полная версия: C++.перегрузка операторов, комплексные числа.
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Другие языки
Belaya_pantera
Помогите разобраться в предоставленной программе..

Сама программа(не сначала..до этого всё вроде понятно):

// Вспомогательная функция
//------------------------------------------------------------------------------
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);} что здесь задается?
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++) и здесь???
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]; что должно удалиться?
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]; ??
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++) ???
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++) ?????
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]; ?????
return(s1 > s2);
};

// Шаблон класса Vector
//------------------------------------------------------------------------------
template <class Element>
class Vector
{
private:
int size;
Element *array;
public:
Vector();
Vector(int sz);
~Vector();
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])
{ что за сортировка?
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; ?????
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);} ??????
}
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); ?????
// Заполняем 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) ??????
{
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; ???????
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.
IUnknown
Цитата
if (i == NULL) {i = new Complex(x, y);} что здесь задается?
Здесь не задается, а создается новый экземпляр класса Complex (если он еще не был создан, т.е., если указатель на него нулевой). Если же объект уже существует - то просто заполняются его поля. Но тут происходит двойная работа: если объект создается, то поля инициализируются в конструкторе, нет необходимости делать это еще раз, поэтому я бы сделал так:

if (i == NULL)
{
i = new Complex(x, y);
}
else
{
i->re = x;
i->im = y;
}


Цитата
for (int j=0; j < arg2.Size; j++) и здесь???
Насколько видно из кода, Size содержит размер матрицы, так вот этот цикл проходит по всем строкам (а внутренний цикл - по всем элементам) матрицы. Для того чтобы вывести ее в поток, разумеется.

Цитата
for (int n = 0; n < Size; n++)
delete [] Buf[n]; что должно удалиться?
Удаление матрицы - задача обратная выделению памяти под матрицы. Когда память выделялась - сначала было взято место под указатели на строки матрицы, а потом для каждой строки выделялось место, достаточное для хранения нужного числа элементов. При удалении все происходит в обратном порядке: сначала для каждой строки удаляется выделенная под нее память, а потом, после цикла, удаляется сам буфер, где хранились адреса строк матрицы.

Ну, и так далее, вся работа - однотипная, извини, но мне уже стало скучно описывать то, что ОЧЕВИДНО - что такое Size, как происходит присваивание матриц, как вычисляется, какая матрица больше, какая меньше - читай код, там все написано. Ты ж поотмечала все подряд, что теперь, каждую строку отдельно разбирать?

Цитата
Программа делает параметризацию вектором. Её быть не должно.
Это к автору. Я не вижу тут параметризации вектором, может он видит? Я вижу только параметризацию вектора типом Complex.
Belaya_pantera
Я же только учусь.. для меня еще многое не понятно.. что для вас очевидно. Вопросы были не конкретно к строчке..а к блоку..
Можно было в кратце сказать, раз это вам показалось так скучно.. я поняла бы наверное.
Создаются матрицы из комплексных чисел.. а что с чем сравнивается так и не поняла. Если для вас очевидно.. не подскажите? И какой итог выводится..

По поводу "Это к автору. Я не вижу тут параметризации вектором, может он видит? Я вижу только параметризацию вектора типом Complex." писала словами препода.. он придрался что вектор в программе.. что мне нужно убрать.. чтобы было по заданию?
Задание: 1.Вставить в шаблонный класс TMatr. TMatr - квадратная матрица – то оператор сравнения можно реализовать, как сравнение суммы квадратов главных диагоналей.
2. Определить требования к типу, которым должен параметризоваться TMatr. Дополнить поведение класса TMatr необходимыми операторами.
4. TMatr, должен параметризоваться классом Complex.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.