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

Описание такого указателя имеет вид:

<имя_переменной>: pointer;

Выделение памяти под динамическую переменную осуществляется с помощью процедуры NEW(<указатель>).

Например: NEW(P1), NEW(P2), после этого оказывается выделенным место, которые имеют идентификаторы P1^, P2^.

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

Для инициализации указателей (присваивание значения) существует несколько возможностей.

1) Процедура NEWотводит блок памяти в области динамических переменных и сохраняет адрес этой области в указателе;

2) Специальная операция @ ориентирует переменную-указатель на область памяти, содержащую уже существующую переменную. Эту операцию можно применять для ориентации на статическую и динамическую переменную.

Например,

type A= array [0..99] of char;

var X: array [0..49] of integer;

pA: ^A; {указатель на массив символов}

Объявлены переменные разных типов: массив из 50 целых чисел и указатель на массив символов. Чтобы указатель pA указывал на массив X, надо присвоить ему адрес X

pA:= @X;

3) Существует единственная константа ссылочного типа nil, которая обозначает «пустой» адрес. Ее можно присваивать любому указателю.

4) Переменной-указателю можно присвоить значение другого указателя того же типа. Используя указательный тип pointer как промежуточный, можно присвоить значение одного указателя другому при несовпадении типов.

Освобождение динамической памяти осуществляется процедурой DISPOSE (<указатель>).

Например, если динамическая переменная P1^ больше не нужна, то оператор Dispose(P1) удалит ее из памяти..

Любые действия над указателем в программе располагаются между процедурами new и dispose.

В Паскале определены стандартные функции для работы с указателями:

• addr(x): word – возвращает адрес x (аналогично операции @).

• seg(x): word – возвращает адрес сегмента для x;

• ofs(x): word – возвращает смещение для x;

• ptr(seg, ofs: word) :pointer – по заданному сегменту и смещению формирует адрес типа pointer.

Пример: Создать вещественный массив из 1000 чисел, заполнить его случайными. Вычислить среднее значение массива. Очистить динамическую память. Создать целый массив размером 1000, заполнить его случайными числами и вычислить его среднее значение.

  1. Структуры данных на основе указателей.

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

Элемент любой динамической структуры состоит из 2-ух частей: информационной, ради хранения которой и создается структура, и указателей, обеспечивающих связь элементов друг с другом.

Элемент динамической структуры описывается в виде записи, наример:

Type Pnode=^node;

Node=record

D:word; { информационная часть

S:string; }

P:pnode; {указатель на след. элементы}

End;

Связанные списки

Если в линейном списке каждый элемент связан со следующим, то список называется односвязным, а со следующим и предыдущим, то двухсвязным.

Если последний элемент связать указателем из первого, то получается кольцевой список.

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

Пример: Программа, которая формирует односвязный список из 5 элементов, содержащих число и его текстовое представление, а затем выполняет вставку и удаление заданного элемента. В качестве ключа используется число.

Существуют различные методы использования динамических списков:

1) Стек – особый вид списка, обращение к которому идет только через указатель на первый элемент.

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

Алгоритм работы со стеком характеризуется правилом: LIFO «последним пришел – первым вышел».

2) Очередь – это вид списка, имеющего два указателя на первый и последний элемент цепочки.

Новые элементы записываются вслед за последним, а выборка элементов идет с первого.

Этот алгоритм типа FIFO «первым пришел – первым вышел».

Деревья – представляют собой динамически связанные структуры, отличающиеся от списков тем, что система связей не носит линейного характера, а образует ветви. Деревья – рекурсивная структура данных.

  1. Базовые понятия объектно-ориентированного программирования. Основные принципы ООП.

Объектно-ориентированное программирование – это методология программирования, которая основана на представлении программы в виде совокупности объектов, каждый из которых является реализацией определенного класса, а классы образуют иерархию, основанную на принципах наследования.

Другими словами, ООП представляет собой набор объектов и связей между ними.

Три основные понятия, которые лежат в основе ООП:

  1. Инкапсуляция – комбинирование записей с процедурами и функциями, манипулирующими полями этих записей, формирует новый тип данных – объект.

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

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

В ОО-языках операции называют методами (процедуры и функции, объявление которых включено в описание объекта и которые выполняют действия).

Можно выделить 5 типов операций:

  1. Конструктор – создание и инициализация объектов.

  2. Деструктор – разрушает объект.

  3. Модификатор - изменяет состояние объекта.

  4. Селектор - для доступа к переменным объекта без их изменения.

  5. Итератор – для доступа к содержанию объекта по частям в определенной последовательности.

Объект ООП – это совокупность переменных состояния и связанных с ними методов.

Тип данных объект определяется зарезервированным словом Object. К полю объекта можно обращаться либо с помощью оператора with, либо путем уточнения имении с помощью точки.

Пример: Опишем объект «обыкновенная дробь» с методами «НОД числителя и знаменателя», «сокращение», «натуральная степень».

Наследование.

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

Описание:

<имя типa-потомкa>=Object(<имя типа-предка>),

Пример: Опишем объектный тип «Вычислитель» с методами «сложение», «вычитание», «умножение», «деление» (некоторый исполнитель) и производный от него тип «Продвинутый вычислитель» с новыми методами «степень», «корень n-й степени».

Type BaseType=Double;

Vichislitel=Object

А,В,С: BaseType;

Procedure Init; //ввод или инициализация полей

Procedure Slozh;

Procedure Vich;

Procedure Umn;

Procedure Delen

End;

NovijVichislitel=Object(Vichislitel)

N: Integers;

Procedure Stepen;

Procedure Koren

End;

Правила наследования:

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

  2. Доступ к полям и методам родительских типов в рамках описания любых типов-потомков выполняется так, как будто бы они описаны в самом типе потомке.

  3. Ни в одном из типов-потомков е могут использоваться идентификаторы полей, совпадающие с идентификаторами поле какого-либо из родительских типов (идентификаторы формальных параметров, указанных в заголовках методов).

  4. Тип-потомков может доопределить произвольное число собственных методов и информационных полей.

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

  6. В противоположность информационным полям идентификаторы методов в типах-потомках могут совпадать с именами методов в родительских методах.