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

Свойство (Property)

Читайте также:
  1. Глава первая : Доказательства того, что до прихода посланника свойство быть мушриком действительно, несмотря на то, что человек находится в неведении.
  2. Как называется свойство организма отвечать изменением жизнедеятельности на различные воздействия окружающей среды?
  3. Опасность - негативное свойство живой и неживой материи, способное причинить ущерб самой материи: людям, природной среде, материальным ценностям.
  4. Отражение как всеобщее свойство материи
  5. Свойство
  6. Свойство Padding
  7. Свойство №1

Лекция 10

Процедурные типы

<Объявление типа «Процедура» >:: =

<Имя Типа> = procedure[ (<Список формальных параметров>)];

<Объявление типа «Функция» >:: =

<Имя Типа> = function[ (<Список формальных параметров>)]: <Тип>;


После объявления процедурного (или «функционального») типа можно объявлять переменные такого типа. Этим переменным можно будет присваивать «имена» уже описанных процедур или функций, а затем обращаться к ним по имени процедурной переменной.

 

На деле переменные процедурных типов являются указателями. До инициализации они имеют непредсказуемое значение. Не следует надеяться, что это именно Nil. Ответственность за вызов процедуры, на которую «указывает» неинициализированная процедурная переменная, несёт программист.

 

 


Пример

 

Type

MyFuncType = procedure (u: double; var v: double);

Var

z: double;

p: MyFuncType;

 

procedure MySqrt(x: double; var y: double);

Begin

y:= Sqrt(x);

Writeln('x=', x:0:7, ' y=', y:0:7);

end;

procedure MySqr(x: double; var y: double);

Begin

y:= Sqr(x);

Writeln('x=', x:0:7, ' y=', y:0:7);

end;

 

Begin

p:= Nil;

// Переменная процедурного типа ни на что не указывает

 

p:= MySqrt;

// Переменная процедурного типа указывает на процедуру MySqrt

p(2, z);

// Имя переменной процедурного типа использовано взамен MySqrt

 

p:= MySqr;

// Переменная процедурного типа указывает на процедуру MySqr

p(2, z);

// Имя переменной процедурного типа использовано взамен MySqr

 

ReadLN;

end.

 

 

Пример. Написать программу, которая будет находить корень уравнения двумя способами: методом хорд и методом Ньютона (методом касательных).

Численному поиску корня функции f(x) (корня уравнения f(x) =0) должно предшествовать хотя бы грубое аналитическое исследование вопроса. Названные методы предназначены для случая, когда функция f(x) непрерывна на промежутке [ xL, xR ], на котором корни разыскиваются.

Будем считать, что функция f(x) меняет на промежутке свой знак ровно один раз (корень единственен). Следовательно, f(xL) и f(xR) имеют противоположные знаки.

Для метода Ньютона, кроме того, потребуем, чтобы первая и вторая производные функции f(x) были постоянны по знаку на [ xL, xR ].


Коротко о методе хорд. В начале очередного, i -го шага (i = 1, 2, …) строится прямая, проходящая через точки (xL, f(xL)), (xR, f(xR)), и находится точка её пересечения с осью Ox – число xi (i -е приближение). Эта точка делит промежуток на две части. Затем оценивается, на какой из этих частей расположен корень. От этого зависит, какая из переменных, xL или xR, примет на себя новое, только что вычисленное значение xi. Новый промежуток [ xL, xR, ] становится более «узким» в сравнении со старым. f(xL) и f(xR) для новых xL, xR должны иметь противоположные знаки.

Процесс останавливается, когда новое приближение отличается от предыдущего менее, чем на Eps.

На Рис.1 пояснено, как работает метод хорд.

 

Рис.1.


Коротко о методе касательных (методе Ньютона). В начале каждого очередного, i -го шага (i = 1, 2, …) строится прямая, касательная к графику функции y=f(x) в точке (xi-1 , f(x i-1)), и находится точка её пересечения с осью Ox – число xi (i -е приближение).

Возникает вопрос, какое число следует взять в качестве начального приближения x 0. Для определённости потребуем, чтобы первая и вторая производные функции f(x) были постоянны по знаку на [ xL, xR, ]. Тогда начальным приближением x 0 должен стать тот из концов промежутка [ xL, xR, ], на котором функция f(x) и её вторая производная имеют один знак. Этим будет гарантировано, что ни одно из чисел xi (i = 1, 2, …) не «вылетит» за пределы промежутка [ xL, xR, ].

Процесс останавливается, когда новое приближение отличается от предыдущего менее, чем на Eps.

На Рис.2 пояснено, как работает метод касательных. Сходимость к искомому корню более быстрая, чем в методе хорд. Это видно и по рисунку, и по численным результатам.


 

Рис.2.


program Project1;

 

{$APPTYPE CONSOLE}

 

Uses

SysUtils;

 

Type

MyFuncType = function (x: double): double;

 

Const

nMax = 100; // Предел числа шагов

 

function f(x: double): double; // Сама функция

Begin

f:= x * Exp(-x) + 2;

end;

 

function dfdx(x: double): double; // Первая производная функции

Begin

dfdx:= Exp(-x) * (1 - x);

end;

 

function d2fdx2(x: double): double; // Вторая производная функции

Begin

d2fdx2:= Exp(-x) * (x - 2);

end;

 

procedure ChordSearchRoot(xL, xR, Eps: double; f: MyFuncType);

Var

yL, yR, xOld, xNew, yNew:

double;

n:

integer;


Begin

n:= 0;

yL:= f(xL);

yR:= f(xR);

xNew:= xL;

 

while true do

Begin

xOld:= xNew;

xNew:= (xR * yL - xL * yR) / (yL - yR);

 

yNew:= f(xNew);

 

if yNew * yR < 0 then

Begin

xL:= xNew; yL:= yNew;

// Пододвинулась вправо левая граница промежутка

End

Else

Begin

xR:= xNew; yR:= yNew;

// Пододвинулась влево правая граница промежутка

end;

 

if Abs(xNew - xOld) < Eps then break;

Inc(n);

if n > nMax then

Begin

Writeln(‘За ’, nMax, ‘ шагов требуемая точность не достигнута.’);

break;

end;

end;

 

xNew:= (xR * yL - xL * yR) / (yL - yR);

Writeln('Result: x=', xNew:0:12, ‘ n=’, n);

end;

 

procedure NewtonSearchRoot(xL, xR, Eps: double;

f, df, d2f: MyFuncType);

Var

xOld, xNew:

double;

n:

integer;

Begin

n:= 0;

 

if f(xL) * d2f(xL) > 0 then xNew:= xL else xNew:= xR;

 

while true do

Begin

xOld:= xNew;

xNew:= xOld - f(xOld) / df(xOld);

 

if Abs(xNew - xOld) < Eps then break;

Inc(n);

if n > nMax then

Begin

Writeln(‘За ’, nMax, ‘шагов требуемая точность не достигнута.’);

break;

end;

end;

 

Writeln('Result: x=', xNew:0:12, ‘ n=’, n);

end;

 

Begin

ChordSearchRoot(-2, 0, 0.000000000001, f);

NewtonSearchRoot(-2, 0, 0.000000000001, f, dfdx, d2fdx2);

Readln;

end.

 


Результат работы программы:

 

Result: x = - 0.852605502013 n = 55

Result: x = - 0.852605502014 n = 6

 

 


Свойство (Property)

 

Свойство, как и поле класса, задает атрибут объекта. Но если поле есть просто хранилище данных, то свойство есть механизм обращения к данным и, возможно, механизм изменения данных. Свойство ограничивает доступ к данным теми рамками, которые задает программист.

Не существует единого мнения о том, нужны ли свойства. Методы класса всегда могут заменить собой свойства. Правда, синтаксис после такой замены может оказаться неудобным.

Объявление:

Public

property <Имя свойства>: <Тип>

read <Имя функции или поля для чтения> // Может отсутствовать, если есть write

write <Имя процедуры для модификации> // Может отсутствовать, если есть read

;


1 | 2 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.02 сек.)