Приветствую Вас Гость | RSS

ПРАКТИКУМ ПО ТЕХНОЛОГИЯМ СОЗДАНИЯ ОБЪЕКТНО-ОРИЕНТИРОВАННЫХ ПРОЕКТОВ РЕШЕНИЯ МАТЕМАТИЧЕСКИХ ЗАДАЧ В DELPHI

Суббота, 12.07.2025, 05:13
Меню сайта
Наш опрос
Как вы попали к нам на сайт?
Всего ответов: 140
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Создание модуля Matrisa с описанием класса TMatr.

 

 

Аналогичным образом опишем свойства для второго класса TMatr. В разделе type (раздел описания типов) опишем класс TMatr. Указатель Orig на начало этого участка определен в секции Protected, поэтому он доступен потомкам класса TMatr. Свойство Property Elemm и методы OutElemm и InpElemm – для записи и чтения значений элементов определены в секции Public, а значит доступны в других модулях и программах.

При работе конструктора значения полей kMin, kMax, jMax и jMin, также как и в классе TMas, в классе TMatr передаются как параметры, определяющие количество элементов массива. Метод ElemPP позволяет интерпретировать байты памяти, отведенные под элементs с номерами k и j, как значение вещественного типа. Они также записываются в секции Protected, поэтому доступны потомкам класса TMatr.

Процедуры GetMem и FreeMem выделяют и освобождают в динамической памяти область размера (jMax – jMin + 1) * Sizeof(Real) и присваивают адрес этой области указателю Orig. Метод Clearance очищает массив.

Описание процедур и функций, реализующих методы, помещается после слова implementation того модуля, где объявлен класс, и выглядят так:

function имя_класса.метод1(список параметров): тип результата;

begin тело функции;

end;

procedure имя_класса.метод2(список параметров);

begin тело процедуры;

end;

В результате работы конструктора инициализируются все поля класса. Процедура GetMem, использующая в методе Constructor, выделяет в динамической памяти область размера (то есть создает динамические переменные заданного размера и помещает их адрес в указатель(Orig)):

GetMem(Orig,((kMax-kMin+1)*(jMax-jMin+1)*Sizeof(Real)));

Метод Clearance очищает массив.

Метод destructor уничтожает объект и освобождает занимаемую им память. Процедура FreeMem освобождает память, занятую динамическими переменными данного размера:

FreeMem(Orig,((kMax-kMin+1)*(jMax-jMin+1)*Sizeof(Real)));

Модуль Matrisa описывает двухместные операции Add, Mul. Здесь действуют соглашение: при выполнении двухместной операции первым операндом является сам объект, вторым операндом – тот, который является формальным параметром метода. Результат сохраняется в полях первого операнда. В методе Det2 () вычисляется определитель матрицы второго порядка:

begin

S:=0;

S:=Elemm[1,1]*Elemm[2,2]-Elemm[1,2]*Elemm[2,1];

Det2:=S;

end;

Если в классе TMatr не описывать свойство Elem[k,j:integer], то в модуле Unit Matrisa необходимо обращаться не к Elemm[i], а к ElemPP[i]^. Как пример ниже фрагмент описания метода Mul:

Также и в модуле Unit Uses_Massiv, при использовании объектов класса TMatr необходимо обращаться не к Elemm[i], а к ElemPP[i]^, а также к операциям InpElem и OutElem. Как пример ниже фрагмент процедуры вычисления z5:

Полное описание модуля Matrisa, в котором описан класс TMatr с операциями над координатами точек прямой и направляющего вектора прямой, необходимыми для решения данной задачи, описано ниже:

Unit Matrisa;

interface

type Real=Single;

RealP=^Real;

type TMatr=class

protected

Orig: Pointer;

kMin, kMax, jMin, jMax:Integer;

function ElemPP(k,j:Integer):RealP;

public

function OutElemm(k,j:integer):Real;

procedure InpElemm(k,j:integer;r:Real);

constructor Create(kMin_, kMax_, jMin_,jMax_:Integer);

destructor destroy; override;

property Elemm[k,j:integer]:Real read OutElemm write InpElemm;

default;

procedure Clearance;

procedure Add(x:TMatr);

procedure Mul(x:TMatr);

function Det2():Real;

end;

implementation

uses Uses_Massiv;

function TMatr.ElemPP;

begin

ElemPP:=Ptr(LongInt(Orig)+((k-kMin)*(jMax-jMin+1)+j-

jMin)*Sizeof(Real));

end;

function TMatr.OutElemm(k,j:integer):Real;

begin

Result:=ElemPP(k,j)^;

end;

procedure TMatr.InPElemm(k,j:integer;r:Real);

begin

ElemPP(k,j)^:=r;

end;

constructor TMatr.Create(kMin_,kMax_,jMin_,jMax_:integer);

begin

inherited Create;

kMin:=kMin_;kMax:=kMax_;

jmin:=jMin_;jMax:=jMax_;

GetMem(Orig,((kMax-kMin+1)*(jMax-jMin+1)*Sizeof(Real)));

Clearance;

end;

destructor TMatr.destroy;

begin

FreeMem(Orig,((kMax-kMin+1)*(jMax-jMin+1)*Sizeof(Real)));      

inherited Destroy;

end;

procedure TMatr.Clearance;

var k,j:Integer;

begin

for k:=kMin to kMax do

for j:=jMin to jMax do

Elemm[k,j]:=0.0;

end;

procedure TMatr.Add(x:TMatr);

var k,j:integer;

begin

for k:=kMin to kMax do

Elemm[k,j]:= Elemm[k,j]+x.Elemm[k,j];

end;

procedure TMatr.Mul(x:TMatr);

var k,j:Integer;

begin

for k:=kMin to kMax do

for j:=jMin to jMax do

Elemm[k,j]:=Elemm[k,j]*x.Elemm[k,j];

end;

function TMatr.Det2;

var S:Real;

begin

S:=0;

S:=Elemm[1,1]*Elemm[2,2]-Elemm[1,2]*Elemm[2,1];

Det2:=S;

end;

end.

 

Вход на сайт
Поиск
Календарь
«  Июль 2025  »
ПнВтСрЧтПтСбВс
 123456
78910111213
14151617181920
21222324252627
28293031

Copyright MyCorp © 2025
Сделать бесплатный сайт с uCoz