- •Часть 1
- •1. With elem 50
- •2.1. Если поступившая запись предшествует корневой, идти в левое 98
- •2.2. Иначе – в правое поддерево. 98
- •Введение Основные этапы решения задач на эвм
- •Языки программирования
- •Трансляторы
- •2. Данные в паскале. Простые типы данных
- •1. Общие сведения о языке паскаль
- •1.1. Алфавит языка. Идентификаторы и зарезервированные слова
- •2.1. Целочисленный тип
- •2.2. Вещественный тип
- •2.3. Логический тип
- •2.4. Символьный тип
- •2.5. Перечисляемый тип
- •Var m1, m2: metall;
- •2.6. Ограниченный (диапазонный) тип данных
- •Над значениями ограниченного типа допустимы те же операции, что и над значениями базового типа, используемыми при задании в разделе определения типов. Если, к примеру, задано определение:
- •Var y:bukva;
- •3. Операции и выражения
- •2.1. Целочисленный тип
- •3.2. Арифметические выражения и операции
- •3.3. Логические операции и выражения
- •3.4. Операции отношения
- •3.5. Стандартные функции
- •3.6. Приоритеты операций
- •4. Структура программы
- •4.1. Раздел определения констант
- •4.2. Раздел определения типов
- •4.3. Раздел описания переменных
- •V: boolen;
- •4.4. Раздел описания процедур и функций
- •4.5. Раздел операторов
- •4.6. Директивы компилятора и управляющие символы
- •5. Операторы языка паскаль
- •5.1. Оператор присваивания
- •5.2. Оператор вывода информации
- •5.3. Оператор ввода информации
- •5.4. Составной оператор
- •5.5. Условный оператор
- •5.6. Оператор варианта case
- •5.7. Операторы цикла
- •5.7.1. Оператор цикла по счетчику (цикл с параметром )
- •Иденти-фикатор перемен-ной
- •I,n:integer; {I -пар-р цикла, n - его кон.Занч.}
- •X,s,p;integer;
- •5.7.2. Оператор цикла с предусловием
- •Пример составления таблицы переменных
- •Var a,Summa:real;
- •Inc (Summa, a);
- •5.7.3. Оператор цикла с постусловием
- •X,Summa:real;
- •6. Структурированные типы данных
- •6.1. Массивы
- •I,ne:integer;
- •6.1.1. Сортировка массивов
- •Vr:char;
- •Vr : char;
- •6.2. Строки
- •6.3. Множества
- •I : byte;
- •6.4. Записи
- •With elem
- •7. Типизированные константы
- •7.1. Типизированные константы скалярных типов
- •7.2. Типизированные константы - массивы и строки
- •7.3. Типизированные константы – множества
- •Var a: hvor;
- •I, j, k, simp: byte;
- •7.4. Типизированные константы – записи
- •8. Файлы
- •8.1. Типизированные файлы
- •8.2. Текстовые файлы
- •Var f : text;
- •9. Подпрограммы
- •9.1. Процедуры и функции
- •9.2. Процедуры и функции пользователя
- •Var p: real;
- •Var p: real;
- •9.3. Параметры подпрограмм
- •Var X: real; m: integer;
- •Var I : integer;
- •10. Рекурсии
- •10.1. Рекурсивные алгоритмы и определения
- •10.2. Рекурсивные процедуры и функции
- •Var f : longint ;
- •Var a, y, z : real;
- •10.3. Виды рекурсивных процедур
- •If условие
- •If условие
- •If условие then Recur ; then begin
- •Var k : integer;
- •Var c : char;
- •Var c : char;
- •11. Графика в паскале
- •11.1. Основы работы в графическом режиме
- •11.1.1. Аппаратная и программная поддержка графики
- •Init Graph (Driver, Mode, Path);
- •11.1.3. Обработка ошибок
- •11.1.4. Закрытие видеорежима
- •11.2. Система координат дисплея
- •11.1.2. Запуск графической системы
- •Var Driver, Mode: integer;
- •11.3. Экран и окно
- •11.4. Установка цвета, заполнения и палитры
- •11.5. Построение простейших геометрических образов
- •11.6. Работа с текстом OutText (X,y:integer; txt:string) – вывести строку txt с текущего положения указателя.
- •11.7. Вывод числовых значений
- •12. Программные модули
- •12.1. Структура программного модуля
- •Interface –интерфейсные раздел («видимая» часть модуля)
- •Implementation – раздел реализации («черный ящик»)
- •Interface
- •Var X:integer;
- •Implementation
- •Interface
- •X: integer;
- •Implementation
- •12.3. Ссылки на модули
- •Unit hlp _ sr;
- •Xa, ya, xb, yb, xc, yc: integer;
- •13. Динамическая память
- •Var a1: array[1..300,1..300] of integer.
- •13.1. Адресация памяти
- •13.2. Указатели
- •13.2.1. Операции с указателями
- •13.2.2. Нетипизированные указатели
- •X: integer;
- •13.2.3. Типизированные указатели
- •13.3. Создание и уничтожение динамических переменных
- •X: real;
- •13.4. Администратор кучи
- •Heapend содержит адрес конца кучи
- •13.5. Примеры использования указателей
- •Объявление
- •Var Pr:preco;
- •14. Использование указателей для организации связанных динамических структур
- •14.1. Списки
- •14.1.1. Алгоритмы работы со списками
- •14.2. Организация стека в динамической памяти
- •Var p, st :pstack; {st - указатель на вершину стека}
- •I: integer;
- •14.3. Очереди
- •14.4. Деревья
- •14.4.1. Организация деревьев в динамической памяти
- •14.4.2. Построение полного двоичного дерева
- •I,j :I nteger; I - значение инф. Поля очередной
- •Var p,h:pstack;
- •Inc(I); {создаем новый узел – вершину}
- •Inc(j); {переместим указатель t и переход
- •14.4.3. Алгоритмы работы с двоичными упорядоченными деревьями (деревьями поиска)
- •14.4.4. Рекурсивные алгоритмы работы с двоичными деревьями
- •I, X : integer;
- •Литература
- •Часть 1. Язык программирования Паскаль
13.4. Администратор кучи
Администратор кучи – специальная программа, которая компонуется совместными программами на Паскале и выполняет действия по выделению и освобождению памяти в куче. Имеются стандартные переменные, в которых хранятся адреса кучи (рис. 13.4):
HEAPORG КУЧА - содержит адрес начала кучи
СВОБОДНАЯ
HEAPPTR ЧАСТЬ указатель кучи – текущая граница
свободной динамической памяти
FREELIST первый свободный блок кучи
Heapend содержит адрес конца кучи
Рис. 13.4. Указатели кучи
HEAPERROR обрабатывает ошибки, связанные с выделением памяти в куче.
FREELIST содержит адрес первого свободного блока. Фактически указывает на структуру, предназначенную для описания всех свободных блоков памяти ниже границы.
HEAPPTR содержит адрес нижней границы свободной части кучи.
Они равны, пока память не фрагментирована.
Фрагментация памяти в куче (появление свободных блоков) связана со случайным порядком использования new - dispose и getmem - freemem. Запись, на которую ссылается FREELIST, состоит из двух полей: размер свободного участка и адрес следующего свободного участка (т. е. 4 + 4 = 8 байт). Как только освобождается участок в памяти, в первые 8 байт этого участка помещается запись, на которую указывает FREELIST. Таким образом, все свободные участки в занятой части кучи объединяются в список: в каждом свободном участке содержится указание на следующий участок. Следовательно, администратор кучи всегда может просмотреть весь список свободных блоков.
Mark(p:pointer) – запоминает текущее значение указателя кучи HEAPPTR в переменной p.
Release(p:pointer) – освобождает участок кучи, начиная от адреса, хранящегося в p (запомненного процедурой Mark) до конца кучи (до HEAPPTR). При этом список FREELIST уничтожается.
П р и м е р ы
New(pt1); New(pt2); Mark(M1);
New(pt3); New(pt4); Mark(M2);
New(pt5); New(pt6); New(pt7);
Release(M2);
Release(M1);
Release(Heaporg);
Операторы Mark и Release удобны для программ, в которых порядок освобождения полей обратный порядку их выделения. Не рекомендуется одновременно использовать Release и Dispose, FreeMem.
MAXAVAIL: longint – возвращает размер (в байтах) наибольшего непрерывного участка кучи. За один вызов NEW или GETMEM нельзя зарезервировать памяти больше, чем значение, возвращаемое этой функцией.
MEMAVAIL: longint – возвращает размер общего свободного пространства кучи.
13.5. Примеры использования указателей
Объявление
При объявлении переменной типа «указатель» выделяются лишь ячейки памяти для хранения собственно указателей. В начале работы программы эти ячейки пусты, конкретных адресов в них нет.
П р и м е р ы объявлений:
Type ip = ^integer;
A = array[1..5] of byte;
Var x, y : ip;
B: ^byte;
R: ^real;
Pa: ^A;
p, q: pointer;
Type preco = ^struct;
Struct=record
C:char;
n:integer;
end;
