КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Синтаксис объявления класса TMatrixclass TMatrix { private: int FRows; int FCols; vector<double> Items; public: int Rows(){return FRows;}; int Cols(){return FCols;}; double& operator()(int Row, int Col); TMatrix(int Rows, int Cols); TMatrix(); TMatrix operator+=(TMatrix Matrix); TMatrix operator-=(TMatrix Matrix); TMatrix operator*=(double Number); TMatrix operator*=(TMatrix Matrix); TMatrix operator+(TMatrix Matrix); TMatrix operator-(TMatrix Matrix); TMatrix operator*(double Number); TMatrix operator*(TMatrix Matrix); TMatrix T(); double Det(); }; Класс TMatrix содержит три поля для хранения числа строк, столбцов и элементов матрицы в виде одномерного динамического массива, представленного шаблонным классом vector. Для доступа к нему необходимо подключить модуль vector и использовать пространство имен std. #include <vector> using namespace std; В открытом разделе public предусмотрены два метода для чтения количества строк и столбцов матрицы, два перегруженных конструктора и десять методов для выполнения операций с матрицами, включая нахождение определителя. Для доступа к элементам матрицы перегружен оператор круглые скобки ( ), что позволяет обращаться к элементам матрицы также, как и к элементам двумерного массива, используя формулу преобразования номера элемента в одномерном массиве: Items[(Row-1)*FCols + Col - 1], где Row – текущая строка матрицы; Col – текущий столбец матрицы; FCols – количество столбцов в матрице. Минус единица в текущей строке и столбце учитывает тот факт, что элементы в матрице индексируется, начиная с единицы, а в классе vector – с нуля. В модуле с данным классом можно определить класс исключительных ситуаций EMatrixError для обработки ошибок, которые могут возникать при работе с матрицами. #define EMatrixError Exception Чтобы использовать этот класс, в исполняемом разделе модуля с расширением cpp необходимо подключить модуль SysUtils.hpp, в котором хранить базовый класс исключительных ситуаций Exception. После объявления класса TMatrix необходимо определить все его методы в исполняемом разделе модуля с расширением cpp в соответствии с ADT – форматом. double& TMatrix::operator()(int Row, int Col) { if ((Row > FRows)||(Col > FCols)||(Row < 1)||(Col < 1)) throw EMatrixError("Неправильный номер элемента"); return Items[(Row-1)*FCols + Col - 1]; }
TMatrix::TMatrix(int Rows, int Cols) { if (Rows < 1) throw EMatrixError("Количество строк меньше 1"); if (Cols < 1) throw EMatrixError("Количество столбцов меньше 1"); FRows = Rows; FCols = Cols; Items.resize(FRows*FCols, 0); }
TMatrix::TMatrix() { FRows = 0; FCols = 0; }
TMatrix TMatrix::operator+=(TMatrix Matrix) { if ((FRows != Matrix.FRows) || (FCols != Matrix.FCols)) throw EMatrixError("Матрицы имеют разный размер"); for (int i = 1; i <= FRows; i++) for (int j = 1; j <= FCols; j++) (*this)(i,j) += Matrix(i,j); return *this; }
TMatrix TMatrix::operator-=(TMatrix Matrix) { if ((FRows != Matrix.FRows) || (FCols != Matrix.FCols)) throw EMatrixError("Матрицы имеют разный размер"); for (int i = 1; i <= FRows; i++) for (int j = 1; j <= FCols; j++) (*this)(i,j)-= Matrix(i,j); return *this; }
TMatrix TMatrix::operator*=(double Number) { for (int i = 1; i <= FRows; i++) for (int j = 1; j <= FCols; j++) (*this)(i,j)*= Number; return *this; }
TMatrix TMatrix::operator *=(TMatrix Matrix) { if (FCols != Matrix.FRows) throw EMatrixError("Число столбцов первой матрицы не равно числу строк второй матрицы"); double Summa; TMatrix TempMatrix = *this; FCols = Matrix.FCols; Items.resize(FRows*FCols); for (int i = 1; i <= FRows; i++) for(int j = 1; j <= FCols; j++) { Summa = 0; for (int k = 1; k <= Matrix.FRows; k++) Summa += TempMatrix(i,k)*Matrix(k,j); (*this)(i,j) = Summa; } return *this; }
TMatrix TMatrix::operator+(TMatrix Matrix) { TMatrix Result = *this; Result+=Matrix; return Result; } TMatrix TMatrix::operator-(TMatrix Matrix) { TMatrix Result = *this; Result-=Matrix; return Result; }
TMatrix TMatrix::operator*(double Number) { TMatrix Result = *this; Result*=Number; return Result; }
TMatrix TMatrix::operator*(TMatrix Matrix) { TMatrix Result = *this; Result*=Matrix; return Result; }
TMatrix TMatrix::T() { TMatrix Result(FCols, FRows); for (int i = 1; i <= FRows; i++) for(int j = 1; j <= FCols; j++) Result(j,i) = (*this)(i,j); return Result; }
double TMatrix::Det() { if (FRows != FCols) throw EMatrixError("Матрица не имеет определителя"); switch (FRows) { case 1: return (*this)(1,1); case 2: return (*this)(1,1)*(*this)(2,2) – (*this)(2,1)*(*this)(1,2); case 3: return(*this)(1,1)*(*this)(2,2)*(*this)(3,3) +(*this)(1,2)*(*this)(2,3)*(*this)(3,1) +(*this)(1,3)*(*this)(2,1)*(*this)(3,2) -(*this)(3,1)*(*this)(2,2)*(*this)(1,3) -(*this)(3,2)*(*this)(2,3)*(*this)(1,1) -(*this)(3,3)*(*this)(1,2)*(*this)(2,1); } } После того, как определен класс TMatrix, его можно использовать в любом месте программы, подключив соответствующий модуль. void __fastcall TForm1::Button1Click(TObject *Sender) { TMatrix a(3,3), b(3,3), c; for (int i = 1; i <= StringGrid1->RowCount; i++) for (int j = 1; j <= StringGrid1->ColCount; j++) a(i,j) = StrToFloat(StringGrid1->Cells[j-1][i-1]); for (int i = 1; i <= StringGrid2->RowCount; i++) for (int j = 1; j <= StringGrid2->ColCount; j++) b(i,j) = StrToFloat(StringGrid2->Cells[j-1][i-1]); c=a+b; for (int i = 1; i <= c.Rows(); i++) for (int j = 1; j <= c.Cols(); j++) StringGrid3->Cells[j-1][i-1] = c(i, j); } Для представления данных в табличной форме в примере использован компонент StringGrid, который размещен на закладке Addition палитры компонентов среды Code Gear. Информация храниться в нем в строковом виде в массиве Cells (Таблица №1). Однако, в отличие от матриц, для доступа к элементам массива Cells вначале необходимо указать номер столбца, а затем – номер сроки. Кроме этого, индексация элементов начинается не с единицы, а с нуля. Таблица №1
|