Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
[ Монахов ] Объектно-ориентированное программирование.doc
Скачиваний:
94
Добавлен:
16.08.2013
Размер:
490.5 Кб
Скачать

2.15. Рекурсия

Очень часто в математических выражениях используется так называемое рекурсивное определение функций:

factorial(1)=1; для n>1: factorial(n)= factorial(n-1)*n.

Многие алгоритмы задаются рекурсивно. Например, анализ транслятором вложенных процедур. Для реализации такого рода алгоритмов используется рекурсивный вызов процедур. Например, вычисление факториала можно задать как

function factorial(n:integer):extended;

begin

result:=1;

if n>=1 then result:=n*factorial(n-1)

end;

У рекурсии есть недостатки: а) при каждом вложенном вызове создается копия локальных переменных процедуры, они храняться в стеке. При большой глубине вложенности стек может переполниться; b) очень часто встречается ситуация бесконечной рекурсии. Так, если бы мы не написали условия n>=1, рекурсные вызовы продолжались бы вплоть до переполнения:

function factsfoo(n:integer):extended;

begin

result:>=n*factorial(n-1)

end;

Основные принципы объектно-ориентированного программирования (ООП) на примере языка Object Pascal (Delphi) со статической версией объектной модели

Рассматриваемая версия объектной модели характерна для языка TurboPASCAL (TP5.5 – TP7.0) и очень близка к объектной модели C++ ( за исключением того, что в C++ поддерживается также множественное наследование и ряд других дополнительных возможностей). В Delphi эта модель поддерживается, но рассматривается как устаревшая. Основной считается модель с динамически создаваемыми объектами, во многом близкая по идеологии к объекной модели языка Java.

2.1. Инкапсуляция. Объект. Поля данных и методы объекта

Инкапсуляцией называется объединение каких-либо относительно независимых элементов в единое целое. В стандартном PASCAL существует тип record — "Запись":

type

tLocation=

record {поля записи}

X,Y:Integer

end;

var Location1,Location2:tLocation;

a:integer;

Поля записи — самостоятельные переменные. Доступ к ним — через квалификацию с помощью точки (составное имя с разделительной точкой). К полям можно обращаться по отдельности. Например, присвоить переменной a значение поля X:

a:=Location1.X

Либо изменить значение поля Y:

Location1.Y:=212

А можно действовать с инкапсулированными в запись полями как с единым целым:

Location2:=Location1

при этом полю X записи Location1 будет присвоено значение X записи Location2, и, аналогично, полю Y в Location1 — значение Y записи Location2.

Развитием идеи объединения (инкапсуляции) различных полей стали объекты.

Пример:

объект:

точка на экране tDot;

ее данные:

координаты X и Y — целые переменные;

светится или нет на экране active — булевская переменная;

ее методы действия:

"нарисовать": Show;

"скрыть": Hide;

"передвинуть по X и Y на величины dX и dY": Move(dX,dY)

"передвинуть в точку с координатами X и Y": MoveTo(X,Y)

Использование в программе:

var aDot:tDot;

...

aDot.X:=10; {координате X точки Dot присвоить значение 10}

aDot.Y:=20;

aDot.Show; {вызвать метод показа точки Show; говорят: "точка себя рисует"}

Описание методов:

procedure tDot.Show;

begin

… {рисование точки текущим цветом пера}

active:=true;

end;

procedure tDot.Hide;

begin

… {рисование точки цветом фона}

active:=false;

end;

procedure tDot.Move(dX,dY:Integer);

begin

Hide;

X:=X+dX;

Y:=Y+dY;

Show;

end;

Соседние файлы в предмете Информатика