
- •Этапы жизненного цикла программы:
- •Основные характеристики программного продукта:
- •Операции над множествами:
- •Типы файлов. Организация доступа к файлам. Стандартные процедуры и функции для файлов разного типа.
- •Описание такого указателя имеет вид:
- •В Паскале определены стандартные функции для работы с указателями:
- •Структуры данных на основе указателей.
- •Полиморфизм.
- •Пример события в Object Pascal:
Описание такого указателя имеет вид:
<имя_переменной>: 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, заполнить его случайными числами и вычислить его среднее значение.
Структуры данных на основе указателей.
Из динамических структур, программа чаще всего использует линейные списки, стеки, очереди, бинарные деревья.
Элемент любой динамической структуры состоит из 2-ух частей: информационной, ради хранения которой и создается структура, и указателей, обеспечивающих связь элементов друг с другом.
Элемент динамической структуры описывается в виде записи, наример:
Type Pnode=^node;
Node=record
D:word; { информационная часть
S:string; }
P:pnode; {указатель на след. элементы}
End;
Связанные списки
Если в линейном списке каждый элемент связан со следующим, то список называется односвязным, а со следующим и предыдущим, то двухсвязным.
Если последний элемент связать указателем из первого, то получается кольцевой список.
Каждый элемент списка содержит ключ, идентифицирующий этот элемент. Ключи разных элементов списка могут совпадать.
Пример: Программа, которая формирует односвязный список из 5 элементов, содержащих число и его текстовое представление, а затем выполняет вставку и удаление заданного элемента. В качестве ключа используется число.
Существуют различные методы использования динамических списков:
1) Стек – особый вид списка, обращение к которому идет только через указатель на первый элемент.
Если в стек нужно добавить элемент, то он добавляется впереди первого элемента, при этом указатель на начало стека переключается на новый элемент.
Алгоритм работы со стеком характеризуется правилом: LIFO «последним пришел – первым вышел».
2) Очередь – это вид списка, имеющего два указателя на первый и последний элемент цепочки.
Новые элементы записываются вслед за последним, а выборка элементов идет с первого.
Этот алгоритм типа FIFO «первым пришел – первым вышел».
Деревья – представляют собой динамически связанные структуры, отличающиеся от списков тем, что система связей не носит линейного характера, а образует ветви. Деревья – рекурсивная структура данных.
Базовые понятия объектно-ориентированного программирования. Основные принципы ООП.
Объектно-ориентированное программирование – это методология программирования, которая основана на представлении программы в виде совокупности объектов, каждый из которых является реализацией определенного класса, а классы образуют иерархию, основанную на принципах наследования.
Другими словами, ООП представляет собой набор объектов и связей между ними.
Три основные понятия, которые лежат в основе ООП:
Инкапсуляция – комбинирование записей с процедурами и функциями, манипулирующими полями этих записей, формирует новый тип данных – объект.
Наследование – определение объекта и его дальнейшее использование для построения иерархий порожденных объектов с возможностью для каждого порожденного объекта, относящегося к иерархии, доступа к коду и данным всех порождающих объектов.
Полиморфизм – присваивание действиям одного имени, которое затем совместно используется вниз и вверх по иерархии объектов, причем каждый объект иерархии выполняет это действие способом именно ему подходящим.
В ОО-языках операции называют методами (процедуры и функции, объявление которых включено в описание объекта и которые выполняют действия).
Можно выделить 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;
Правила наследования:
Информационные поля и методы родительского типа наследуются всеми его типами-потомками независимо от числа промежуточных уровней иерархии.
Доступ к полям и методам родительских типов в рамках описания любых типов-потомков выполняется так, как будто бы они описаны в самом типе потомке.
Ни в одном из типов-потомков е могут использоваться идентификаторы полей, совпадающие с идентификаторами поле какого-либо из родительских типов (идентификаторы формальных параметров, указанных в заголовках методов).
Тип-потомков может доопределить произвольное число собственных методов и информационных полей.
Любое изменение текста в родительском методе автоматически оказывает влияние на все методы порожденных типов-потомков, которые его вызывают.
В противоположность информационным полям идентификаторы методов в типах-потомках могут совпадать с именами методов в родительских методах.