Программирование на языке Object Pascal
Методическое пособие - Компьютеры, программирование
Другие методички по предмету Компьютеры, программирование
), где (x) - любой объект программы (переменная, массив, объект указателя);
CSeg: word; - (возвращает значение хранящееся в регистре CS) в начале работы программы в регистре программы (CS) хранится сегмент кода;
DSeg: word; - (возвращает значение регистра DS) в начале работы программы в регистре (DS) хранится сегмент данных;
MaxAvail: int64; - (возвращает в байтах размер наибольшего непрерывного участка кучи);
MemAvail: int64; - (возвращает в байтах размер общего свободного пространства кучи);
Ofs(x): word; - (возвращает значение смещения адреса для указанного объекта (x)) (x) - выражение любого типа или имя процедуры;
Seg(x): word; - (возвращает значение содержащее сегмент адреса указанного объекта);
PTR(s, o: word): pointer; - (s - сегмент, o - смещение) возвращает значение типа pointer по заданному сегменту (s) и смещению (o).
Динамические структуры памяти
Преимущества динамической памяти становятся особенно очевидными при организации динамических структур. Элементы этих структур связанны через адреса. К таким структурам относятся: стеки, очереди, деревья, сети, …
Основой моделирования динамических структур являются списки (конечно множество динамических элементов размещающихся в разных областях памяти и объединенных в логически упорядоченную последовательность с помощью специальных указателей, адресов связи). В списке каждый элемент имеет информационное поле и ссылку, т.е. адрес другого элемента списка.
Список - линейная структура данных, с помощью которой задаются одномерные отношения.
Структуры элемента одномерного списка
Однонаправленный список:
Двунаправленный список:
Порядок расположения информационных и ссылочных полей в элементе произволен.
Информационная часть может содержать поля различных типов.
Ссылки должны быть однотипны.
В зависимости от числа ссылок список бывает однонаправленный и двунаправленный.
Линейный однонаправленный список:
- голова списка.
Список называется пустым, если указатель на первый элемент равен Nil: First=Nil;
Линейный двунаправленный список:
- голова списка.
Last - хвост списка.
Так же существуют кольцевые списки, у которых последний элемент указывает на первый.
Пример Описание элемента однонаправленного списка:
TypeType=^zap; point=^zap;=record; zap=record;: integer; int1: integer;: string; int2: string; : EL;next: point;;prev: point;
End;
Все действия над элементами списка (вставка, удаление, перестановка) сводятся к действиям со ссылками. Сами элементы при этом своего физического положения в памяти не меняют.
Задачи для работы с линейным списком.
1_Создание пустого списка:
Create_Empty_List (var first: EL);
First:= nil;
End;
_Добавление элемента в список:
Procedure Create_New_Elem (var p: EL);(p);^: inf1:= StrToInt (Edit1.text);^: inf2:= Edit2.text;^: next:= nil;;_Empty_List (first);_New_Elem (p1);:= p1;_New_Elem (p2);^.next:=p2
3_Подсчет количества элементов в списке:
Function Count_El (first: EL): integer;: integer;: EL;first=nil then k:=0:=1;:= first;q^.next <> nil do:=k+1;:=q*next;;;;:= k;;
Аналогично записывается процедура: 1. вывода списка на экран;
. поиск внутри списка…
_Вставка элемента в начало списка:
Procedure ins_Bea_List (p: EL; var first: EL);first=nil then:= p;^.next:= nil;;^.next:=first;:=p;
End;
End;
_Добавление элемента в конец списка:
Procedure ins_End_List (p: EL; var first: EL);: EL;first=nil then:=p;^.next:=nil;;:=first;q^.next<>nil do=q^.next;^.next:=p;^.next:=nil;;
End;
_Добавление элемента в середину списка (после i-того элемента):
ins_After_i (p: EL; first: EL; i: integer);,q: EL;,n: integer;:= Count_EL (first);(inil do:=q^.next;^.next:=p;;;:=first;:=1;k<i do:=k+1;:=t^.next;;:=t^.next;//в t:=i, a в q:=i+1^.next:=p;^.next:=q;;
End;
7_Удаление первого элемента в списке:
Procedure Del_Beg_List (var first: EL);: EL;first<>nil then:=first;p^.next=nil then(p);:=nil;;:=first;:=first^.next;(p);;
End;
End;
_Удаление последнего элемента в списке:
Procedure Del_End_List (var first: EL);,g: EL;first=nil then exit;first^.next=nil then:=first;(t);:=nil;;:=first;:=first;q^.next<>nil do:=q;:=q^.next;;
// t - предпоследний, q - последний.
Dispose (q);^.next:=nil;;
End;
9_Удаление i-того элемента из середины списка:
Procedure Del (var first: EL; i: integer);, q: EL;, n: integer;first=nil then exit;:=count_EL(first);(in) then(I задано не корректно);;;
If i=1 then
Begin
// удаление первого элемента в списке (процедура выше)
End;i=n then
// удаление последнего элемента в списке (процедура выше)
End;:= first;:= nil;:=1;k<I do:=k+1;:=t;:=t^.next;;:=t^.next;//(i-1):=q, (i):=t, (i+1):=k^.next:=k;(t);;
End;
10_Удаление всего списка:
Del_List (var first: EL);; q: EL;first=nil then exit;:=first;:=nil;q<>nil do:=q;:=q^.next;(p);;:=nil;;
Кроме линейных структур, с помощью указателей можно реализовать не линейные структуры (деревья).
Простейшим видим деревьев, являются бинарные (двоичные) деревья (конечное множество элементов, которые либо пустые, либо содержат одни элементы (корень дерева), а остальные элементы делятся на два не пересекающихся подмножества, каждое из которых само является бинарным деревом (эти подмножества - правые и левые поддеревья исходного дерева)).
np: ^node;=record;: string;: np;: np;;
Графика в Delphi
Delphi позволяет использовать графические возможности операционной системы Windows. В операционной системе Windows графические возможности предоставляет графический интерфейс Win32. в частности интерфейс известный как GDI. Интерфейс GDI используется в системе Win32 для рисования и раскраски изображений. До появления Delphi для программирования графики в среде Windows необходимо бы