C++.перегрузка операторов, комплексные числа., Помогите понять что делается в программе, поэтапно. И нужно немного по |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
C++.перегрузка операторов, комплексные числа., Помогите понять что делается в программе, поэтапно. И нужно немного по |
Belaya_pantera |
19.05.2012 21:00
Сообщение
#1
|
Группа: Пользователи Сообщений: 3 Пол: Женский Репутация: 0 |
Помогите разобраться в предоставленной программе..
Сама программа(не сначала..до этого всё вроде понятно): // Вспомогательная функция //------------------------------------------------------------------------------ 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. Прикрепленные файлы Lab4.cpp ( 9.54 килобайт ) Кол-во скачиваний: 231 |
IUnknown |
19.05.2012 22:16
Сообщение
#2
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Цитата if (i == NULL) {i = new Complex(x, y);} что здесь задается? Здесь не задается, а создается новый экземпляр класса Complex (если он еще не был создан, т.е., если указатель на него нулевой). Если же объект уже существует - то просто заполняются его поля. Но тут происходит двойная работа: если объект создается, то поля инициализируются в конструкторе, нет необходимости делать это еще раз, поэтому я бы сделал так:if (i == NULL) Цитата for (int j=0; j < arg2.Size; j++) и здесь??? Насколько видно из кода, Size содержит размер матрицы, так вот этот цикл проходит по всем строкам (а внутренний цикл - по всем элементам) матрицы. Для того чтобы вывести ее в поток, разумеется.Цитата for (int n = 0; n < Size; n++) Удаление матрицы - задача обратная выделению памяти под матрицы. Когда память выделялась - сначала было взято место под указатели на строки матрицы, а потом для каждой строки выделялось место, достаточное для хранения нужного числа элементов. При удалении все происходит в обратном порядке: сначала для каждой строки удаляется выделенная под нее память, а потом, после цикла, удаляется сам буфер, где хранились адреса строк матрицы.delete [] Buf[n]; что должно удалиться? Ну, и так далее, вся работа - однотипная, извини, но мне уже стало скучно описывать то, что ОЧЕВИДНО - что такое Size, как происходит присваивание матриц, как вычисляется, какая матрица больше, какая меньше - читай код, там все написано. Ты ж поотмечала все подряд, что теперь, каждую строку отдельно разбирать? Цитата Программа делает параметризацию вектором. Её быть не должно. Это к автору. Я не вижу тут параметризации вектором, может он видит? Я вижу только параметризацию вектора типом Complex. |
Belaya_pantera |
20.05.2012 12:33
Сообщение
#3
|
Группа: Пользователи Сообщений: 3 Пол: Женский Репутация: 0 |
Я же только учусь.. для меня еще многое не понятно.. что для вас очевидно. Вопросы были не конкретно к строчке..а к блоку..
Можно было в кратце сказать, раз это вам показалось так скучно.. я поняла бы наверное. Создаются матрицы из комплексных чисел.. а что с чем сравнивается так и не поняла. Если для вас очевидно.. не подскажите? И какой итог выводится.. По поводу "Это к автору. Я не вижу тут параметризации вектором, может он видит? Я вижу только параметризацию вектора типом Complex." писала словами препода.. он придрался что вектор в программе.. что мне нужно убрать.. чтобы было по заданию? Задание: 1.Вставить в шаблонный класс TMatr. TMatr - квадратная матрица – то оператор сравнения можно реализовать, как сравнение суммы квадратов главных диагоналей. 2. Определить требования к типу, которым должен параметризоваться TMatr. Дополнить поведение класса TMatr необходимыми операторами. 4. TMatr, должен параметризоваться классом Complex. |
Текстовая версия | 26.09.2024 22:38 |