Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Синтаксис объявления класса TMatrix




class 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


Поделиться:

Дата добавления: 2015-08-05; просмотров: 79; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.007 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты