Читайте также:
|
|
//T_VECTOR.PAS
unit T_Vector;
interface
uses math,dialogs;
type
DVector=array of extended; { Тип: динамический вектор. Заполнение динамического вектора начинается с 0 и заканчивается len-1}
TVector = class { Определяем класс векторов с действительными числами }
len:integer; // Длина вектора
Vector:DVector; // Сам вектор
procedure SetLen(l:integer);virtual;{Установка длины вектора}
constructor VCreate(l:integer); { Конструктор класса: создаёт вектор длины l }
private
protected
public
// Внутренние ф-ции
function VMultOnDig(d:Real): TVector;virtual;//Умножение вектора на число
function VNormir:TVector;virtual; //Нормировка
function VModul:Real;virtual; //Возвращает модуль вектора
published
end;
// Внешние ф-ции
function VSumma(v1,v2:DVector): DVector;far;//Сумма векторов
function VRazn(v1,v2:DVector):DVector;far; //Разность векторов
function VMult(v1,v2:DVector):DVector;far; //Произведение векторов
function VScalarMult(v1,v2:DVector): real;far;//Скалярное произведение векторов
procedure MessageBox(s:string);far;
// Просто сообщение
implementation
procedure TVector.SetLen(l:integer);
begin
setlength(vector,l); {Установка длины динамического массива vector равной l}
len:=l; // Заносим в поле len длину вектора
end;
function TVector.VMultOnDig(d:real):TVector; //Умножение вектора на число
var t:TVector;i:integer;
begin
t:=TVector.VCreate(len); { Создаём экземпляр объекта Tvector}
for i:=0 to len-1 do t.Vector[i]:=Vector[i]*d;
result:=t;
end;
procedure MessageBox(s:string);
begin
MessageDlg(s,mtInformation,[mbOk],1);// Без слов
end;
constructor TVector.VCreate(l:integer);{Конструктор для объекта}
TVector
var i:integer;
begin
inherited Create; {Вызываем родительский конструктор (TObject.Create)}
// Все объекты являются наследниками TObject
setlen(l); // Вызываем нашу ф-цию установки длинны вектора
for i:=0 to len-1 do vector[i]:=0;{Сразу заносим нули}
end;
function TVector.VModul:real; // Модуль вектора
var tt:real;i:integer;
begin
tt:=0;
for i:=0 to len-1 do
tt:=tt+Power(vector[i],2); {Сумма квадратов всех элементов массива}
result:=Sqrt(tt);//Корень квадратный из этой суммы
end;
function VSumma(v1,v2:DVector):DVector; {Сумма векторов}
var i:integer;d:DVector;
begin
if high(v1)>high(v2) then begin
setlength(d,high(v1)+1);
for i:=0 to high(v1)
do d[i]:=v1[i]; { Заносим в вектор-результат пока значения большего вектора}
for i:=0 to high(v2) do d[i]:=v1[i]+v2[i]; {Находим сумму}
end else begin
setlength(d,high(v2)+1);
for i:=0 to high(v2) do d[i]:=v2[i]; {здесь аналогично}
for i:=0 to high(v1) do d[i]:=v1[i]+v2[i];
end;
result:=d;
end;
function VRazn(v1,v2:DVector):DVector; {Разность векторов}
var i:integer;d:DVector;
begin
if high(v1)>high(v2) then begin
setlength(d,high(v1)+1);
for i:=0 to high(v1) do d[i]:=v1[i];
for i:=0 to high(v2) do d[i]:=v1[i]-v2[i];
end else begin
setlength(d,high(v2)+1);
for i:=0 to high(v2) do d[i]:=v2[i];
for i:=0 to high(v1) do d[i]:=v1[i]-v2[i];
end;
result:=d;
end;
function VMult(v1,v2:DVector):DVector; {Произведение векторов}
var i:integer;d:DVector;
begin
if high(v1)>high(v2) then begin
setlength(d,high(v1)+1);
for i:=0 to high(v1) do d[i]:=v1[i];
for i:=0 to high(v2) do d[i]:=v1[i]*v2[i];
end else begin
setlength(d,high(v2)+1);
for i:=0 to high(v2) do d[i]:=v2[i];
for i:=0 to high(v1) do d[i]:=v1[i]*v2[i];
end;
result:=d;
end;
function VScalarMult(v1,v2:DVector):real; {Скалярное произведение векторов}
var d:DVector;tt,n1,n2:real;i:integer;
tc:TVector;
begin
if high(v1)=high(v2) then begin {Нужно чтобы вектора были одинаковой длины}
tc:=TVector.VCreate(high(v1)+1);
tt:=0;
d:=VMult(v1,v2); // Произведение векторов
for i:=0 to high(d) do tt:=tt+d[i]; {Сумма элементов вектора d}
tc.vector:=v1;n1:=tc.VModul;//n1- модуль вектора v1
tc.vector:=v2;n2:=tc.VModul;//n2- модуль вектора v2
if (n1=0) or (n2=0) then begin
MessageBox('Один из векторов нулевой;(Модуль T_Vector)');
result:=0;
exit;
end;
result:=tt/(n1*n2); // Результат
tc.Free; // Очистка памяти от мусора
exit;
end else result:=0;
end;
function TVector.VNormir:TVector;
var t:TVector;tt:real;i:integer;
begin
t:=TVector.VCreate(len);
tt:=VModul;
// Проверка деления на ноль
if tt=0 then begin
MessageBox('Деление на ноль;(Модуль T_Vector)');
result:=self;
exit;
end;
for i:=0 to len-1 do t.Vector[i]:=Vector[i]/tt;
result:=t;
exit;
end;
//End file
end.
Дата добавления: 2015-07-25; просмотров: 41 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Класс комплексных чисел | | | Класс комплексных векторов |