- •2 Статические и динамические объекты программ.
- •6 Вектор. Функциональная спецификация. Логическое описание и физическое представление.
- •14 Стек. Физическое представление (динамические объекты).
- •8 Очередь. Логическое описание и физическое представление (файл).
- •9 Очередь. Логическое описание и физическое представление (массив).
- •10 Очередь. Логическое описание и физическое представление (динамические объекты).
- •61 Обьектно-ориентированное программирование.
- •11 Стек. Функциональная спецификация
- •12 Стек. Логическое описание.
- •17 Линейный список. Физическое представление. Итераторы.
- •Void Create(List *l){ //создание списка
- •If(!res.Node) //если не удалось выделить память (массив заполнен)
- •19 Линейный список. Физическое представление (динамические объекты).
- •29 Рекурсивные структуры данных и их связь с алгоритмической рекурсией
- •1 Уровни описания структур данных.
- •Деревья. Двоичные деревья.
- •23 Двоичное дерево. Функциональная спецификация
- •24 Двоичное дерево. Логическое описание. Построение и визуализация
- •27 Особенности представления и обработки деревьев общего вида (преобразование к двоичному,...)
- •28 Деревья выражений
- •33 Поиск по образцу в последовательностях и таблицах.
- •34 Алгоритм Кнута-Морриса-Пратта
- •37 Таблицы с прямым доступом.
- •43 Турнирные сортировки.
- •46 Сравнение методов сортировки.
- •50 Абстрактные типы данных. Пример модуля лтд очередь.
- •52 Типизация языка программирования. Контроль типов.
- •53 Средства ослабления типового контроля в языке Паскаль. Преобразование и передача типов.
- •54 Полиморфизм операций, отношений и процедур. Родовые модули.
- •41 Обменные сортировки
2 Статические и динамические объекты программ.
Некоторые свойства объекта и связи с другими объектами остаются неизменными при любом исполнении его
области действия (участка программы, где этот объект считается существующим). Такие свойства и связи называются статическими. Их можно определить по тексту программы, без ее исполнения [21].
Другие свойства и связи изменяются в процессе исполнения области действия. Их называют динамическими. Например, конкретное значение переменной — динамическое свойство. Связь формального параметра с конкретным фактическим в результате вызова процедуры — динамическая связь. Размер конкретного массива с переменными границами динамическое свойство.
Часто статические и динамические характеристики называют соответственно характеристиками периода компиляции (трансляции) и периода выполнения (runtime), подчеркивая то обстоятельство, что в период компиляции исходные данные программы неизвестны и, следовательно, динамические характеристики недоступны. Известна лишь информация, извлекаемая непосредственно из текста программы и тем самым относящаяся к любому ее исполнению (т. е. статическая информация).
Если память выделяется (распределяется) в процессе трансляции и ее объем не меняется от начала до конца выполнения программы, то такой объект является статическим. Если же память выделяется во время выполнения программы и ее объем может меняться, то такой объект является динамическим.
Поскольку транслятор распределяет память на основе информации, содержащейся в описаниях объектов программы, то все объекты, описанные в основной программе являются статическими, в отличие от локальных переменных процедур.
Если память выделяется в процессе трансляции и ее объем не меняется от начала до концв выполнения программы, то такой объект явл. статич. Если память выделяется во время выполн. прогр. и ее объем может меняться, то такой объект – динамический.
3 Ссылочный тип данных. Кроме известных нам статических объектов, многие языки программирования допускают также и динамические объекты. При этом в языках со строгой дисциплиной описаний, например, в Паскале динамический объект не может иметь собственного имени, гак как все идентификаторы языка, кроме идентификаторов стандартных (предопределенных) процедур и функций, должны быть описаны в соответствующих разделах программы. Поэтому принято по именовать, а обозначать динамический объект посредством ссылки на него. В Паскале это достигается присоединением символа | (<< стрелочка тут) к имени связываемой с каждым таким объектом переменной — ссылки на этот динамический объект. Переменная-ссылка должна быть описана в разделе объявлений программы как переменная ссылочного типа, в Паскале это раздел переменных var. При этом сама ссылка является статическим объектом. Ссылка занимает всего лишь одно машинное слово, что совсем немного (O(l)) по сравнению с возможным размером растущего динамического объекта. В яз.Си указатель ссылочного типа обозначется *. Ссылочн. тип мб именованным и неименованным.Пример: typedef T*pointer;
Для переменных в точности одного и того же ссылочного типа определены операции присваивания и разыменования и отношение равенства.. Если, например, результатом сравнения р = nil является значение true, то ссылочная переменная р не указывает ни на какой объект. Операция разыменования обеспечивает доступ к значению обозначаемого ссылкой объекта. В Паскале разыменование обозначается стрелкой, приписываемой справа от указателя (р), а в Си — звездочкой слева от него (*р). Операция разыменования имеет аппаратную поддержку в любом современном процессоре (косвенная адресация). «Важно делать различие между переменной-указателем и указуемым объектом и быть очень осторожным при присваивании и сравнении указателей» [84].
Ссылочный тип идентичен адресному
4 Файл. Функциональная спецификация.
Функциональной спецификацией какого-либо типа данных называют внешнее формальное определение этого типа данных, не зависящее ни от языка программирования, ни от конкретной вычислительной машины. Дать формальное определение типа данных это значит задать множество значений этого типа и множество изображений этих значений вместе с правилом их интерпретации (только через изображения можно работать со значениями объектов типа), а также базовое множество атрибутов этого типа, включающее изображения некоторых выделенных значений, операции и их свойства, отношения и их свойства, функции создания, доступа и модификации объектов этого типа [6]. Обозначим через FT файловый тип с компонентами типа Т.Значениями типа FT являются сколь угодно длинные, по конечные последовательности компонент типа 7 (изображаемые по правилам интерпретации типа компонент 7 ). Такое бесконечное множество значений можно определить формально с помощью операции конкатенации (слияния, склеивания, сцепления) двух файлов, состоящих из компонент одного и того же типа: если f1 = {x1,. . ., хm} и f2 = {y1,...,Уn}-> то f1||f2= { x 1 ,… ,хm, y1, . . ., уn}, где || знак операции конкатенации. Тогда множество значений файлового типа строго определяется следующими порождающими правилами |72):
1.{} есть файл типа FT (пустая последовательность, пустой файл);
2.если / есть файл типа FT и t есть объект типа Т, то / ||{t} есть файл типа FT
3.никакие другие значения не являются файлами типа FT.
Базовое множество атрибутов файлового типа: 1. операция конкатенации, определенная выше; ее свойство — несимметричность; 2. операции присваивании определяется как покомпонентное копирование одного файла. в другой с сохранением порядка и количества компонент. 3. отношение равенства: два файла, состоящие из компонент одного и того же типа, равны тогда и только тогда, когда они имеют одинаковую длину, а их соответствующие компоненты — равные значения; отношение равенства симметрично; 4. функции: создание (порождение пустого файла), доступ (последовательный доступ к каждой компоненте, причем только для чтения значения: чтобы прочитать значение k-той компоненты файла, надо прочитать предварительно k-1 компоненту от начала файла), модификация (дозапись компоненты того же типа и конец файла— фактически это конкатенация файла и новой компоненты типа Т), уничтожение (стирание) файла.
5 Файл. Логическое описание. Физическое представление. Логическое описание — это отображение функциональной спецификации на средства выбранного языка программирования. При выполнении этого отображения могут быть две ситуации: 1) в выбранном языке программирования есть подходящий тип данных; 2) подходящий тип данных в языке не определен.
В первом случае в программу включают описание объектов имеющегося типа в соответствии с синтаксическими правилами этого языка.
Во втором случае необходима декомпозиция объекта на такие составные части, которые могут быть описаны как отдельные объекты программы средствами выбранного языка программирования, или программное моделирование требуемого для решения задачи типа данных. При таком моделировании следует использовать типы данных, определенные в языке как базовые, и реализовать необходимые операции и отношения процедурами и функциями.
Физическое представление — это конкретное отображение на память машины объектов программы в соответствии с логическим описанием. Такое отображение всегда связано с линеаризацией структуры [5], так как память машины обычно состоит из некоторых единиц (слов или байтов), пронумерованных последовательными целыми числами, начиная с нуля. Используя многомерный массив на языке программирования, иногда необходимо знать принцип его линеаризации, и учитывать его при ручной навигации по массиву.
Конструктивные особенности памяти как последовательности слов с произвольным доступом обуславливают два вида физического представления объектов в памяти машины: сплошное и цепное.
Сплошное представление — это представление, при котором объект размещается в памяти машины в непрерывной последовательности единиц хранения. Например, переменная целого типа представляется на физическом уровне одним машинным словом, состоящим из двух, четырех или восьми байтов с последовательными адресами.
Цепное представление — это такое представление, при котором значение объекта разбивается на отдельные части, которые могут быть расположены в разных участках памяти машины (необязательно подряд), причем эти участки тем или иным способом связаны «в цепочку» с помощью указателей, т. е. они содержат ссылки на следующие части объекта. Цепное представление используется, как правило, для динамических структурных объектов (списки, деревья, очереди, стеки и деки).
Для описания файла в Си необходимо объявить переменную предопределённого типа FILE*. Созданный компилятором виртуальный файловый дескриптор может быть динамически связан с конкретным файлом, потоком или устройством с помощью функций стандартной библиотеки языка Си.
FILE* <имя объекта - файла>;
В заключение еще раз заметим, что файлового типа в Си нет. Для работы с файлами в стандартной библиотеке Си имеются определения файловых дескрипторов и функций, доступных через заголовочный файл <stdio.h>. Вместо описания файловой переменной в Си необходимо определить переменную-дескриптор файла.
Файлы обычно ассоциируются с устройствами внешней памяти и устр-ами вводы-вывода.