Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
oaip.docx
Скачиваний:
7
Добавлен:
26.09.2019
Размер:
292.13 Кб
Скачать

1.Алгоритмы с возвратом, их реализация с помощью рекурсий и с использованием стека. Гамильтоновы циклы.

Поиск с возвратом (англ. Backtracking) — общий метод нахождения решений задачи, в которой требуется полный перебор всех возможных вариантов в некотором множестве М. Как правило позволяет решать задачи, в которых ставятся вопросы типа: «Перечислите все возможные варианты …», «Сколько существует способов …», «Есть ли способ …», «Существует ли объект…» и т. п.Рекурсия — это такой способ организации вспомогательного алгоритма (подпрограммы), при котором эта подпрограмма (процедура или функция) в ходе выполнения ее операторов обращается сама к себе. Вообще, рекурсивным называется любой объект, который частично определяется через себя.

{Функция на Pascal}

Function Factorial(N:integer):Extended;

Begin

If N<=1

Then Factorial:=1

Else Factorial:=Factorial(N-1)*N

End;

     

{Процедура на Pascal}

Procedure Factorial(N:integer; Var F:Extended);

Begin

If N<=1

Then F:=1

Else Begin Factorial(N-1, F); F:=F*N End

End;

Стеки. Организация стека в определенном смысле противоположна организации очереди,  поскольку здесь используется доступ по принципу "последней пошел, первый вышел". Поместить в стек и выбрать из стека - соответственно "затолкнуть" и "вытолкнуть".  Поэтому для реализации стека необходимо создать две функции:  "posh" /затолкнуть/, которая помещает элемент в вершину стека,  и "pop" / вытолкнуть/, которая выбирает из вершины стека значение. Необходимо также предусмотреть определенную область в памяти,  где фактически будет храниться стек. Для этого можно использовать массив или можно выделить область памяти.  Как и при работе с очередью при выборке значения из стека элемент будет потерян,  если его не сохранить гденибудь в памяти. Общая форма процедур установки в стек и выборки из стека.

     const        MAX = 100; var        stack:array[1..100] of integer;        tos:integer; {points to top of stask} { помещение объекта в стек }      procedure Push(i:integer);      begin        if tos>=MAX then WriteLn('Stask full')        else        begin          stack[tos]:=i;          tos:=tos+1;        end;      end; { конец процедуры помещения объекта в стек}          function Pop:integer; { выборка объекта из стека }      begin        tos:=tos-1;        if tos<1 then        begin          WriteLn('Stack underflow');          tos:=tos+1;          Pop:=0;        end        else Pop := stack[tos];      end; { конец функции выборки объекта из стека }

Переменная "tos" содержит значение индекса для следующего помещаемого в стек элемента. При реализации этих процедур никогда нельзя забывать о проверке ситуаций переполнения стека и выборки из пустого стека.  В приведенных процедурах нулевое значение указателя "tos" означает, что стек пуст, а значение этого указателя, равное или превышающее адрес последней ячейки памяти,  где содержится стек,  означает заполнение стека. Рис.7 иллюстрирует работу стека.

Операция                   Содержимое стека      Push(A)                    A      Push(B)                    B A      Push(C)                    C B A      Pop, выбирается С          В А      Push(F)                    F B A      Pop, выбирается F          B A      Pop, выбирается В          .

Рор, выбирается А           пуст.

2. Объект. Инициализация и разрушение объекта.Можно определить, что объект – это некоторая совокупность данных, рассматриваемая как единое целое.Для описания объектов в Pascal используется тип Object:

Type

имя_типа = object

поле: тип;

поле: тип;

метод;

end;

Пример

type

Car = object

Color: string;

Weight: real;

Smax: real;

Procedure Start;

Procedure Stop;

End;

Объект (object)

переменная классового типа. Перед использованием объекта необходимо его инициализировать с помощью конструктора, а после использования — разрушить с помощью деструктора. В Object Pascal все объекты распределяются динамически, поэтому имя объекта фактически представляет собой указатель на ту область памяти, которая содержит данный объект. Для доступа к полям, методами свойствам объекта используется составное обозначение:

<имя объекта>.<имя поля, метода или свойства>

Создание объектов( Инициализация)

В Турбо Паскале для создания объектов используются три зарезервированных слова: object, constructor, destructor к три стандартные директивы: private, public и virtual. Зарезервированное слово object используется для описания объекта. Описание объекта должно помещаться в разделе описания типов:

type

MyObject = object

(Поля объекта}

{Методы объекта} 

end ;

Если объект порождается от какого-либо родителя, имя родителя указывается в круглых скобках сразу за словом object:

type

MyDescendantObject = object(MyObject)

..

end;

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

Разрушение объектов (Деструктуризация)

Borland Pascal предоставляет специальный тип метода, называемый "сборщиком мусора" или деструктором, для очистки и удаления динамически размещенного объекта. Деструктор объединяет шаг удаления объекта с какими-либо другими действиями или задачами, необходимыми для данного типа объекта. Для единственного типа объекта можно определить несколько деструкторов.

Примечание: Деструктор может быть виртуальным и часто является таковым. Деструктор редко имеет параметры.

Приведем несколько примеров деструкторов:

destructor Field.Done;

begin

FreeMem(Name, Length (Name^) + 1);

end;

destructor StrField.Done;

begin

FreeMem(Value, Len);

Field.Done;

end;

Деструктор дочернего типа, такой как указанный выше TStrField.Done, обычно сначала удаляет введенные в порожденном типе поля указателей, а затем в качестве последнего действия вызывает соответствующий сборщик деструктор непосредственного родителя для удаления унаследованных полей-указателей объекта.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]