
- •Билет 2 Лексическая структура языка Pascal.
- •Билет 3 Структура Pascal-программы. Составной оператор. Константы. Переменные.
- •Билет 4. Концепция переменной языка паскаль.
- •Билет 5 Концепция типа данных языка Pascal.
- •Билет 6 Простые типы.
- •Билет 7 Стандартные типы языка Pascal.
- •Билет 8 Тип Boolean
- •Билет 9 Перечисляемый тип.
- •Билет 10. Ограниченные типы (диапазоны).
- •Билет 11 Условный оператор
- •Билет 12 Оператор варианта
- •Билет 13 Оператор цикла с постусловием
- •Билет 14 Оператор цикла с предусловием
- •Билет 15 Оператор цикла с параметром
- •Билет 16 Составные типы
- •Билет 17 Массивы, примеры использования
- •Билет 18 Записи, примеры использования
- •Билет 19 Оператор сцепления
- •Билет 20 Записи с вариантами
- •Билет 21 Множества (определение, примеры, операции).
- •Билет 22 Представления множеств, примеры использования.
- •Билет 22. Представления множеств.
- •Билет 23 Файловые типы
- •Билет 24 Операции с файлами
- •Билет 25 Текстовые файлы
- •Билет 26 Типизированные файла
- •Билет 27 Нетипизированные файлы
- •Билет 28 Процедуры и функции
- •Билет 29 Описание процедур и функций
- •Билет 30 Локальные и глобальные переменные
- •Билет 31 Параметры процедур и функций
- •Билет 32 открытые параметры.
- •Билет 33. Нетипизированные параметры.
- •Билет 34. Необходимость и преимущества модульного программирования. Структура модуля в языке Pascal.
- •Билет 35. Процедурный тип. Передача процедур и функций в качестве параметра.
- •Билет 36. Рекурсия.
- •Билет 37. Рекурсия и итерация.
- •Билет 38. Линейный поиск.
- •Билет 39. Поиск делением пополам.
- •Билет 40. Сортировка.
- •Билет 41. Сортировка простыми включениями.
- •Билет 42. Сортировка бинарными включениями
- •Билет 43. Сортировка простым выбором.
- •Билет 44. Сортировка простым обменом(пузырек).
- •Билет 45. Шейкер-сортировка.
- •Билет 46. Сортировка шелла.
- •Билет 47. Сортировка с разделением(быстрая сортировка).
- •Билет 48. Ссылочные типы.
- •Билет 49. Динамические структуры данных.
- •Билет 50. Создание и уничтожение динамических переменных.
- •Билет 51. Связные списки.
- •Билет 52. Связные списки. Создание очередного элемента. Просмотр списка.
- •Билет 53. Добавление компонента в середину списка.
- •Билет 54. Исключение компонент из середины списка.
- •Билет 55. Рекурсивная обработка списка.
- •Билет 56. Двусвязные кольца.
- •Билет 57. Деревья. Двоичные деревья. Двоичные деревья поиска.
- •Билет 58. Добавление узла к двоичному дереву поиска.
- •Билет 59. Поиск в двоичном дереве.
- •Билет 60. Просмотр двоичного дерева.
- •Билет 61. Удаление из дерева.
- •Билет 62. Деревья общего вида.
Билет 48. Ссылочные типы.
Указатель – это какой-либо адрес в памяти. Это может быть адрес переменной, процедуры или ф-и. Обычно в Паскале нам не надо заботится о том где находятся в памяти. Мы только ссылаемся на эти данные при помощи его имени. Компилятор сам знает где его искать.
var Number:integer
Но можно найти этот адрес используя операнд @.
@Number Addr(Number)
Можно присвоить этот адрес типа Pointer - var P:Pointer;
Pointer – это нетипизированный указатель, т. е. он не имеет информации о том на какой тип указывает. Чаще удобней определять указатели на определенный тип (записи объекты). Чтобы определить указатели используется знак ^ за которым следует идентификатор типа.
Например определим указатель на тип Integer
Type pinteger=^integer Var X:Pinteger. А можно написать сразу Y:^Integer;
Cтавя ^ этот знак после идентификатора указателем можно получить то данное на которое этот указатель указывает. Например
NumAddress:Pinteger….. Number:=7;…… NumAddress:=@Number Writeln(Number); {7} Writeln(NumAddree^);{7}
Эта операция называется разименованием. Переменная типа Pointer не может быть разименованной. Среди всех возможных указателей в ТР выделяется один специальный, который никуда не указывает. Обозначается служебным словом nil. Указатель nil считается константой совместимой с любым ссылочным типом (переменная типа Pointer так же считается совместимой с любым ссылочным типом)
Размиенование считается некорректным если ссылочная переменная имеет значение nil. Предположим что у нас есть следующие определения
Type указатель = ^ объект
Важно понимать разницу между ссылкой и тем объектом на который она ссылается. Пусть есть P и Q типа указатель ссылающиеся на различные объекты.
Для описания ссылочных типов сделано одно исключение из общих правил – указатель на какой-либо тип может быть описан до объявления самого типа.
Пример
Type PTRMyType = ^ MyType; MyType = record X,y:Real; End;
Билет 49. Динамические структуры данных.
Различают статистические и динамические переменные. Например, к глобальным переменным память отводится в начале выполнения программы, и существуют они в течение всего периода работы программы. Для локальных переменных память отводится при вызове подпрограммы , а при выходе из нее она освобождается , то есть распределение памяти в обоих случаях производится автоматически. Помимо этого в Pascal существует возможность создавать и уничтожать переменные в любой момент работы программы, в зависимости от потребности задачи. Переменные, созданием и уничтожением которых может явно управлять программист называется динамическим. Динамическое распределение памяти активно используется в большом количестве приложений ( причины динамического распределения памяти):
- Управление большим объемом данных.
При объявлении глобальной переменной компилятор отводит ей место в сегменте данных, которые имеют размер 64 К, то есть все глобальные переменные должны иметь размер не более 64 К. Например, программа требует иметь массив из 400 элементов типа string по 100 символов. Этот массив приблизительно занял бы 40 К , а если нужно 2 массива, то они уже не поместятся в сегмент данных. То есть, необходимо использовать динамическую область памяти, которая называется Куча (heap) – это вся память, которую ваша операционная система делает доступной и которая не используется кодом программы, сегментом данных и сегментом стека. Размер Кучи необходимо контролировать различными способами.
-Управление данными неизвестного размера.
Некоторые типы данных Pascal , особенно string и массивы требуют определить их размер во время компиляции, хотя вполне возможно, что не все пространство памяти, которое они зарезервировали будет использовано. Если расположить эти переменные в Куче во время выполнения, то можно потребовать столько байтов, сколько нужно для конкретной переменной.
-Использование временных буферов данных.
Когда программе необходимо временное пространство памяти: например, редактор файлов требует буфер для данных, для каждого файла, который редактируется. Можно разместить буфер для каждого файла в Куче, причем для конкретного размера файлов и для конкретного количества файлов во время выполнения программы.
-Динамические структуры данных.
Динамические переменные можно организовать в различные структуры. Для этого для каждого объекта такой структуры искать тип запись. И эта запись содержит один или более указателей на другие объекты этой структуры.