- •Лабораторная работа № 1 рациональные числа
- •Теоретические сведения
- •Синтаксис объявления класса tRational
- •Программа работы
- •Исходные данные
- •Контрольные вопросы
- •Лабораторная работа № 2 комплексные числа
- •Теоретические сведения
- •Синтаксис объявления класса tComplex
- •Программа работы
- •Исходные данные
- •Контрольные вопросы
- •Лабораторная работа № 3 векторы
- •Теоретические сведения
- •Синтаксис объявления класса tVector
- •Программа работы
- •Контрольные вопросы
- •Лабораторная работа № 4 матрицы
- •Теоретические сведения
- •Арифметические операции с матрицами
- •Синтаксис объявления класса tMatrix
- •Основные свойства и методы компонента StringGrid
- •Программа работы
- •Исходные данные
- •Исходные данные
- •Контрольные вопросы
- •Лабораторная работа № 5 строки
- •Теоретические сведения
- •Программа работы
- •Исходные данные
- •Контрольные вопросы
- •Лабораторная работа № 6 стек
- •Теоретические сведения
- •Синтаксис объявления класса tStack
- •Программа работы
- •Контрольные вопросы
- •Лабораторная работа № 7 очередь
- •Теоретические сведения
- •Синтаксис объявления класса tQueue
- •Программа работы
- •Контрольные вопросы
- •Лабораторная работа № 8 деревья
- •Теоретические сведения
- •Синтаксис объявления класса tTreeNode
- •Синтаксис объявления класса tTree
- •Программа работы
- •Контрольные вопросы
- •Библиографический список
- •Содержание
Синтаксис объявления класса tMatrix
classTMatrix
{
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();
doubleDet();
};
Класс TMatrixсодержит три поля для хранения числа строк, столбцов и элементов матрицы в виде одномерного динамического массива, представленного шаблонным классомvector. Для доступа к нему необходимо подключить модульvectorи использовать пространство именstd.
#include <vector>
using namespace std;
В открытом разделе publicпредусмотрены два метода для чтения количества строк и столбцов матрицы, два перегруженных конструктора и десять методов для выполнения операций с матрицами, включая нахождение определителя.
Для доступа к элементам матрицы перегружен оператор круглые скобки ( ),что позволяет обращаться к элементам матрицы также, как и к элементам двумерного массива, используя формулу преобразования номера элемента в одномерном массиве:
Items[(Row-1)*FCols+Col- 1],
где Row– текущая строка матрицы;
Col– текущий столбец матрицы;
FCols– количество столбцов в матрице.
Минус единица в текущей строке и столбце учитывает тот факт, что элементы в матрице индексируется, начиная с единицы, а в классе vector – с нуля.
В модуле с данным классом можно определить класс исключительных ситуаций EMatrixErrorдля обработки ошибок, которые могут возникать при работе с матрицами.
#defineEMatrixErrorException
Чтобы использовать этот класс, в исполняемом разделе модуля с расширением cppнеобходимо подключить модульSysUtils.hpp, в котором хранить базовый класс исключительных ситуацийException.
После объявления класса TMatrixнеобходимо определить все его методы в исполняемом разделе модуля с расширениемcpp в соответствии сADT– форматом.
double& TMatrix::operator()(int Row, int Col)
{
if ((Row > FRows)||(Col > FCols)||(Row < 1)||(Col < 1))
throwEMatrixError("Неправильный номер элемента");
return Items[(Row-1)*FCols + Col - 1];
}
TMatrix::TMatrix(int Rows, int Cols)
{
if (Rows < 1)
throw EMatrixError("Количество строк меньше 1");
if(Cols< 1)
throwEMatrixError("Количество столбцов меньше 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))
throwEMatrixError("Матрицы имеют разный размер");
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))
throwEMatrixError("Матрицы имеют разный размер");
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)
throwEMatrixError("Число столбцов первой матрицы не
равно числу строк второй матрицы");
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;
}
doubleTMatrix::Det()
{
if (FRows != FCols)
throwEMatrixError("Матрица не имеет определителя");
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