Лабораторная работа № 11. Динамические переменные. Списки
В языке Паскаль, есть переменные, которые создаются и уничтожаются в процессе выполнения программы. Они не входят в явные описания программы и, следовательно, к ним нельзя обращаться с помощью имен. Память для них выделяется только динамически в ходе работы программы.
Доступ к динамическим переменным осуществляется с помощью указателей (или ссылок), которые становятся определенными после создания динамического объекта.
Динамические переменные очень широко используется в программировании, более того, современные операционные системы имеют функции поддержки динамических областей памяти.
Так как динамические переменные отсутствуют в разделах описаний, до для указания на них используются указатели. Тип указателя сам по себе не является динамической структурой данных, часто его называют ссылочным типом. Это обычное четырехбайтное (или больше, в зависимости от установленной разрядности и операционной системы) число, содержащее адрес, с которого начинается динамическая переменная. Адрес в архитектуре процессоров фирмы Intel – два целых беззнаковых числа, определяющие номер сегмента памяти и смещение внутри этого сегмента. Указатели используются для установления отношений или связей между динамическими структурами данных. Эти связи могут быть весьма сложными.
В стандартном языке Паскаль указатели должны ссылаться на однотипные элементы данных, то есть являются типизированными. Существует специальное значение указателя NIL (пустой указатель), принадлежащее всем типам указателей. В этом случае указатель не указывает ни на какой элемент. Это значение применяется для обозначения конца списка или ветви дерева (по аналогии в функцией EOF).
Для того чтобы присвоить переменной ссылочного типа определенное значение, необходимо воспользоваться операцией взятия адреса (указателя), – символа амперсанд «@» и переменной базового типа.
Для реализации косвенного доступа к переменной через указатель используется разыменование. То есть, чтобы по указателю получить доступ к переменной, необходимо после указателя поставить знак «^».
Основные действия над динамическими переменными — это их создание и уничтожение. Первое реализуется стандарт-ной процедурой
NEW (<указатель>);
Для освобождения памяти, выделенной под динамическую переменную, используется процедура, обратная по действию процедуре New:
DISPOSE (<указатель>);
Работа с динамическими переменными требует большой аккуратности, иначе «засорение» памяти ненужными переменными может привести к быстрому ее переполнению.
Связный список – базовая динамическая структура данных в информатике, состоящая из узлов, каждый из которых содержит как собственно данные, так и одну или две ссылки («связки») на следующий и/или предыдущий узел списка. Принципиальным преимуществом перед массивом является структурная гибкость: порядок элементов связного списка может не совпадать с порядком расположения элементов данных в памяти компьютера, а порядок обхода списка всегда явно задаётся его внутренними связями.
Типы списков.
Кольцевой. Следующий элемент для конца списка является начальным элементом (и следующий для первого элемента – последний в списке). При обычной организации списков при просмотре влево остановка происходит на первом элементе (никаких действий не предпринимается). При просмотре вправо – на последнем.
Двусвязный. Перемещаться по списку можно как от начала к концу, так и от конца к началу. Для односвязных списков движение возможно только в одну сторону.
Маркеры(указатели). Чаще всего указывают на начало списка. Обозначаются либо специальным символом, либо выделяются цветом, либо отмечаются как-то иначе. Часто маркеры не поддаются удалению обычными средствами, – например, для их удаления вводится специальный элемент меню. Обычно маркер является первым элементом списка, и при возможности удаления удаляется весь список.
Задание.
Использовать динамические переменные со структурой «Запись», состоящие из информационного поля заданного типа и одного или двух указателей.
Предусмотреть с выбором из меню 6 пунктов работы с динамическими переменными:
1. Создание списка (с формированием начальных условий)
2. Запись в файл
3. Удаление
4. Вставка
5. Просмотр вправо
6. Просмотр влево (для односвязных списков – только одно направление)
7. Чтение из файла (опционально)
Варианты заданий приведены в табл.14.1.
Таблица 14.1. Варианты заданий
№ вар. | Тип данных | Тип списка |
Целый | Кольцевой, двусвязный, с удалением маркера из специального пункта меню. | |
Вещественный | Двусвязный, с неудаляемым маркером начала списка | |
Логический | Кольцевой, движение вправо с удалением маркера из специального пункта меню. | |
Строка | Кольцевой, двусвязный, с удалением маркера из специального пункта меню. | |
Целый | Двусвязный, с удалением маркера из специального пункта меню | |
Вещественный | Кольцевой, движение влево с удалением маркера из специального пункта меню. | |
Логический | Кольцевой, двусвязный, с удалением маркера из специального пункта меню. | |
Строка | Двусвязный, с неудаляемым маркером начала списка | |
Целый | Кольцевой, движение вправо с удалением маркера из специального пункта меню. | |
Вещественный | Кольцевой, двусвязный, с удалением маркера из специального пункта меню. | |
Логический | Двусвязный, с удалением маркера из специального пункта меню | |
Строка | Кольцевой, движение влево с удалением маркера из специального пункта меню. | |
Целый | Кольцевой, двусвязный, с удалением маркера из специального пункта меню. | |
Вещественный | Двусвязный, с неудаляемым маркером начала списка | |
Логический | Кольцевой, движение вправо с удалением маркера из специального пункта меню. | |
№ вар. | Тип данных | Тип списка |
Строка | Кольцевой, двусвязный, с удалением маркера из специального пункта меню. | |
Целый | Двусвязный, с удалением маркера из специального пункта меню | |
Вещественный | Кольцевой, движение влево с удалением маркера из специального пункта меню. | |
Логический | Кольцевой, двусвязный, с удалением маркера из специального пункта меню. | |
Строка | Кольцевой, движение вправо с удалением маркера из специального пункта меню | |
Целый | Двусвязный, с неудаляемым маркером начала списка | |
Вещественный | Двусвязный, с удалением маркера из специального пункта меню | |
Логический | Кольцевой, движение влево с удалением маркера из специального пункта меню. | |
Строка | Кольцевой, двусвязный, с удалением маркера из специального пункта меню. | |
Вещественный | Кольцевой, движение вправо, с неудаляемым маркером начала списка | |
Логический | Кольцевой, двусвязный, с неудаляемым маркером начала списка | |
Целый | Кольцевой, движение вправо с удалением маркера из специального пункта меню. | |
Строка | Кольцевой, двусвязный, с удалением маркера из специального пункта меню. | |
Вещественный | Двусвязный, с неудаляемым маркером начала списка | |
Логический | Двусвязный, с удалением маркера из специального пункта меню |
Лабораторная работа № 12.
Графический режим монитора. Построение графиков
Целью работы является ознакомление с использованием функций графического режима работы монитора на примере построения графиков.
Так как Турбо-Паскаль разрабатывался под ОС MS DOS, то основным режимом работы монитора был текстовый. С появлением Windows 95 стал графический режим. Поэтому Турбо-Паскаль (так же, как и Free Pascal) ориентирован на работу в текстовом режиме. Так как модуль Graph в Турбо-Паскале и Free Pascal существенно различаются, то рассмотрим только модуль для Free Pascal.
Для перевода в графический режим необходимо выполнять определенные действия.
1. Подключить модуль Graph, в котором находятся все процедуры и функции графического режима монитора. Делается это с помощью описания подключаемых модулей:
Uses Graph
Это описание следует сразу же за заголовком программы.
2. Для перехода в графический режим (на месте блока в алгоритме «Очистка экрана») могут использоваться процедуры DetectGraph и InitGraph, например:
DetectGraph (driver,razmer);
InitGraph (driver,razmer,’’);
Здесь driver задает номер драйвера видеорежима, razmer – размер экрана в пикселях, оба параметра – целые. Последний параметр в InitGraph (пустая строка) задает шрифт по умолчанию. Эта пустая строка пишется всегда, так как дополнительные шрифты с Free Pascal не поставляются.
3. Затем задаются цвета фона и переднего плана (точек, линий, букв и т.д.), по умолчанию они соответственно черный и белый. Так как выводятся два графика, то их лучше всего обозначать разными цветами. Для установки цвета переднего плана используется процедура SetColor с одним целым параметром, который указывает цвет:
0 – черный;
1 – синий;
2 – зеленый;
3 – светло-синий;
4 – красный;
5 – фиолетовый;
6 – коричневый;
7 – светло-серый;
8 – серый;
9 – светло-синий;
10 – светло-зеленый;
11 – голубой;
12 – светло-коричневый;
13 – светло-фиолетовый;
14 – желтый;
15 – белый.
4. В модуле Graph много различных процедур и функций, предназначенных для рисования геометрических фигур. Кроме этого, координаты каждой фигуры могут быть как абсолютными, так и относительными. В этой лабораторной работе используются только абсолютные координаты и несколько процедур, например, такие:
OutTextXY(X0,Y0,Text)
Здесь Х0 – смещение по оси Х с начала координат,
Y0 – смещение соответственно по Y, обе целые,
Text – выводимый, начиная с указанной точки, текст.
Начало координат находится в левом верхнем углу, то есть увеличение значений по Y приводит не к подъему по оси, а к спуску.
Line(X0,Y0,X1,Y1)
Прямая линия с начальными координатами X0 и Y0, и конечными X1 и Y1.
PutPixel(X0,Y0,color)
Вывод точки (пикселя) на экран с указанными координатами и цветом.
Для Pascal АВС подключаемый модуль называется GraphABC. Кроме этого, пропускаются пункты 2 и 3.
Вместо процедуры OutTextXY используется TextOut с теми же параметрами. Процедура Line изменений не претерпела, процедура PutPixel заменена на SetPixel с теми же параметрами, кроме цвета. Цвет выбирается из списка предопределенных имен, описанных в справке по Pascal АВС: «Стандартные модули» > «Модуль GraphABC» > «Цветовые константы». Кроме этого, цвет линий и текста может быть установлен процедурой SetPenColor.
Требования к оформлению графиков функций.
Чтобы график не был, с одной стороны, с очень маленьким разрешением по высоте, с другой не вылезал за экран, необходимо функцию отмасштабировать. То есть сначала в программе вычисляются минимальное и максимальное значения, затем вручную они округляются в бόльшую по модулю сторону. Так как округление может производиться не обязательно по целым числам, то проще это сделать вручную, как описано в блок-схеме алгоритма к этой работе (рис.15.1).
График должен иметь заголовок и шкалы с указанием осей, засечек на шкалах и проставленными значениями. Обозначение осей абсцисс и ординат. То есть программа должна иметь, кроме общего цикла вывода графиков, ещё 2 цикла: по осям Х и Y.
Варианты графиков функций приводятся для разных ИСР на рис.15.2-15.4. Варианты заданий приведены в табл.15.1.
Рис.15.1. Общая блок-схема алгоритма вывода графиков функций.
Рис. 15.2. Вариант вывода графиков с помощью модуля Graph для Турбо-Паскаля.
Рис. 15.3. Вариант вывода графиков с помощью модуля Graph для Free Pascal.
Рис. 15.4. Вариант вывода графиков с помощью модуля GraphABC для Pascal ABC.
Таблица 15.1. Варианты заданий
№ вар. | Функции | Начальное значение х | Конечное значение х |
0,05 | |||
0,6 | 1,5 | ||
0,2 | |||
0,1 | |||
1,05 | |||
0,1 | |||
0,2 | |||
0,5 | |||
0,05 | |||
№ вар. | Функции | Начальное значение х | Конечное значение х |
0,05 | |||
0,25 | 0,5 | ||
-1 | |||
-2 | |||
0,1 | |||
0,1 | 1,5 | ||
Приложение А. Основные стандартные функции
В приложении А собраны основные функции модулей, подключаемых автоматически (для Турбо-Паскаля и Free Pascal это модуль System, для Pascal ABC.NET – модуль PABCSystem), то есть используемые по умолчанию.
Для Free Pascal используется дополнительный модуль «Math», который нужно подключать принудительно. Функции, входящие в модуль «Math», отмечены «*».
Таблица А.1. Стандартные функции ИСР Турбо-Паскаль, Free Pascal и Pascal ABC.NET, версия 2.2
Название функции | Математическая запись | Запись на языке Паскаль | Наличие в Турбо-Паскале | Наличие в Free Pascal | Наличие в Pascal ABC |
Математические функции | |||||
Абсолютная величина | |x| | Abs(x) | есть | есть | есть |
Арктангенс | arctg x | Arctan(x) | есть | есть | есть |
Косинус | cos x | Cos(x) | есть | есть | есть |
Экспоненциальное значение | ex | Exp(x) | есть | есть | есть |
Дробная часть числа, результат - вещественный | Frac(x) | есть | есть | есть | |
Старший байт аргумента | Hi(i) | есть | есть | нет | |
Целая часть числа, результат - вещественный | Int(x) | есть | есть | есть | |
Натуральный логарифм | ln x | Ln(x) | есть | есть | есть |
Младший байт аргумента | Lo(x) | есть | есть | нет | |
Является ли аргумент нечетным числом? | Odd(i) | есть | есть | есть | |
Значение числа π | π | Pi | есть | есть | есть |
Случайное число в диапазоне 0-i | Random(i) | есть | есть | есть | |
Случайное вещественное число | Random | есть | есть | есть | |
Округление по правилам арифметики, результат - длинное целое | Round(x) | есть | есть | есть | |
Синус | sin x | Sin(x) | есть | есть | есть |
Квадрат аргумента | х2 | Sqr(x) | есть | есть | есть |
Квадратный корень | √х | Sqrt(x) | есть | есть | есть |
Переставляет местами старший и младший байты | Swap(i) | есть | есть | есть(1) | |
Округление значения с отбрасыванием дробной части | Trunc(x) | есть | есть | есть | |
Арккосинус | arccos x | Arccos(x) | нет | есть* | есть |
Арккосинус гиперболический | arcch x | Arccosh(x) Arcosh(x) | нет | есть* | нет |
Арксинус | arcsin x | Arcsin(х) | нет | есть* | есть |
Арксинус гиперболический | arcsh x | Arcsinh(х) Arsinh(x) | нет | есть* | нет |
Арктангенс c аргументом x/y | arctg x/y | Arctan2(x,y) | нет | есть* | нет |
Арктангенс гиперболический | arcth x | Arctanh(x) Artanh(x) | нет | есть* | нет |
Округление в направлении к положительной бесконечности | Ceil(x) | нет | есть* | есть | |
Косеканс | cosec x | Cosecant(x) Csc(x) | нет | есть* | нет |
Косинус гиперболический | ch x | Cosh(x) | нет | есть* | нет |
Котангенс | ctg x | Cot(x) Cotan(x) | нет | есть* | нет |
Преобразование оборотов в радианы | CycleToRad(x) | нет | есть* | нет | |
Преобразование градусов в грады | DegToGrad(x) | нет | есть* | нет | |
Преобразование градусов в радианы | DegToRad(x) | нет | есть* | есть | |
Округление в направлении к отрицательной бесконечности | Floor(x) | нет | есть* | есть | |
Преобразование градов в градусы | GradТoDeg(x) | нет | есть* | нет | |
Преобразование градов в радианы | GradToRad(x) | нет | есть* | нет | |
Возведение х в целую степень i | xi | Intpower(x,i) | нет | есть* | нет |
Вычисление экспоненциальной функции | х*2i | Ldexp(x,i) | нет | есть* | нет |
Вычисление натурального логарифма | ln(х+1) | LnXP1(x) | нет | есть* | нет |
Вычисление десятичного логарифма | log x | Log10(x) | нет | есть* | есть |
Вычисление двоичного логарифма | log2 x | Log2(x) | нет | есть* | есть |
Вычисление логарифма х2 по основанию х1 | Logx1 x2 | Logn(x1,x2) | нет | есть* | есть |
Максимальное их двух значений | Max(a,b) | нет | есть* | есть | |
Максимальное значение в целочисленном массиве | MaxIntValue(a) | нет | есть* | нет | |
Максимальное значение в целочисленном или вещественном массиве | MaxValue(a) | нет | есть* | нет | |
Минимальное их двух значений | Min(a,b) | нет | есть* | есть | |
Минимальное значение в целочисленном массиве | MinIntValue(a) | нет | есть* | нет | |
Минимальное значение в целочисленном или вещественном массиве | MinValue(a) | нет | есть* | нет | |
Возведение х1 в дробную степень х2 | x1х2 | Power (x1,x2) | нет | есть* | есть |
Преобразование радианов в обороты | RadToCycle(x) | нет | есть* | нет | |
Преобразование радианов в градусы | RadToDeg(x) | нет | есть* | есть | |
Преобразование радианов в грады | RadToGrad (x) | нет | есть* | нет | |
Секанс | sec x | Secant(x) Sec(x) | нет | есть* | нет |
Синус гиперболический | sh x | Sinh(x) | нет | есть* | нет |
Тангенс гиперболический | th x | Tanh(x) | нет | есть* | нет |
Функции для работы со строками и символами | |||||
Преобразование целого числа i в символы, содержащие k двоичных разрядов | BinStr(i,k) | нет | есть | нет | |
Символ, соответствующий указанному значению кода ASCII | Chr(i) | есть | есть | есть | |
Конкатенация (объединение) последовательности строк | Concat(s1, …) или + | есть | есть | есть | |
Копирование подстроки c количеством символов i2 из строки s, начиная с i1 | Copy(s,i1, i2) | есть | есть | есть | |
Преобразование целого значения i в символы, содержащие k шестнадцатеричных разрядов | HexStr(i,k) | нет | есть | нет | |
Динамическая длина строки | Length(s) | есть | есть | есть | |
Преобразует символы в строчные буквы | LowerСase(s) | нет | есть | нет | |
Преобразование целого значения i в символы, содержащие k восьмеричных разрядов | OctStr(i,k) | нет | есть | нет | |
Поиск подстроки s1 в строке s2, результат – целое (byte) | Pos(s1,s2) | есть | есть | есть | |
Задает содержимое строки и ее длину | SetString(s,c,i) | нет | есть | нет | |
Преобразование числового значения x в строковую переменную s | Str(х,s) | есть | есть | есть | |
Размножение символа с i раз с получением в результате строки | StringOfСhar (с,i) | нет | есть | нет | |
Преобразует символы в прописные буквы | UpCase(s) | есть | есть | есть | |
Преобразование из строки s в числовую переменную х. Где i – признак завершения операции | Val(s,x,i) | есть | есть | есть | |
Функции для работы с памятью, адресами и указателями | |||||
Адрес заданного объекта, результат - указатель | Addr(x) | есть | есть | нет | |
Проверка, имеет ли указатель или переменная значение nil | Assigned(p) | есть | есть | нет | |
Текущее значение регистра CS | CSeg | есть | есть | нет | |
Текущее значение регистра DS | DSeg | есть | есть | нет | |
Размер наибольшего непрерывного свободного блока в динамически распределяемой области | MaxAvail | есть | нет | нет | |
Число свободных блоков в динамически распределяемой области памяти | MemAvail | есть | нет | нет | |
Смещение в памяти заданной переменной | Ofs(x) | есть | есть | нет | |
Преобразует адрес, заданный в виде базового сегмента i1 и смещения i2, в значение типа указатель | Ptr(i1,i2) | есть | есть | нет | |
Сегмент для указанной переменной | Seg(x) | есть | есть | нет | |
Текущее значение регистра SР (указателя стека) | SPtr | есть | есть | нет | |
Текущее значение регистра SS | SSeg | есть | есть | нет | |
Функции для работы с файлами | |||||
Конец файла | Eof(f) | есть | есть | есть | |
Конец строки | Eoln(f) | есть | есть | есть | |
Определяется текущая позиция в файле | FilePos(f) | есть | есть | есть | |
Определяется текущий размер файла | FileSize(f) | есть | есть | есть | |
Текстовый файл с именем f, открытый на чтение в кодировке Windows | OpenRead(f) | нет | нет | есть | |
текстовый файл с именем f, открытый на запись в кодировке Windows | OpenWrite(f) | нет | нет | есть | |
Определение для файла статуса «конец файла» | SeekEof(f) | есть | есть | есть | |
Определение для файла статуса «конец строки» | SeekEoln(f) | есть | есть | есть | |
Прочие функции | |||||
Определяется максимум заданной величины | High(i) | есть | есть | есть | |
Целое значение, представляющее собой состояние последней выполненной операции ввода-вывода. | IOResult | есть | есть | нет | |
Определяется минимум заданной величины | Low(x) | есть | есть | есть2 | |
Порядковый номер для значения перечислимого типа | Ord(x) | есть | есть | есть3 | |
Число параметров, переданных в командной строке | ParamCount | есть | есть | нет | |
Заданный параметр командной строки | ParamStr(i) | есть | есть | есть | |
Предшествующее значение аргумента | Pred(x) | есть | есть | есть | |
Число байтов, занимаемых аргументом | SizeOf(x) | есть | есть | нет | |
Следующее значение агрумента | Succ(x) | есть | есть | есть | |
Указатель на таблицу методов объекта | TypeOf(x) | есть | есть | нет |
Примечания. (1) В Pascal ABC функция Swap меняет местами не байты в одной переменной, а две переменных, поэтому имеет 2 параметра.
(2) В Pascal ABC функция Low возвращает 0.
(3) В Pascal ABC функция Ord преобразует символ в код в кодировке Unicode.
Приложение Б. Отличия языка ИСР PascalABC.NET от Delphi
Добавлено
1. Операции += -= для событий .NET и для процедурных переменных.
2. Операции += -= *= для целых и += -= *= /= для вещественных.
3. Операция += для строк.
4. Подпрограммы с переменным числом параметров.
5. Операция new для вызова конструктора (ident := new type_name(params);).
6. Операция new для создания динамического массива.
7. Операция typeof .
8. Использование uses для подключения пространств имен .NET (реализовано в Delphi Prism).
9. Вид доступа internal (наряду с public, private, protected).
10. Инициализация переменных: var a: integer := 1;
11. Инициализация переменных: var a := 1;
12. Объявление локальных переменных в блоке.
13. Объявление параметра цикла в заголовке цикла: for var i := 1 to 10 do, foreach x: real in a do.
14. Оператор lock, обеспечивающий синхронизацию потоков.
15. Методы в записях.
16. Инициализаторы полей в классах и записях.
17. Обобщенные классы (generics).
18. Реализованы типизированные файлы (в отличие от Delphi Prism, где они убраны).
19. Упрощенный синтаксис модулей.
20. Описание методов внутри интерфейса класса или записи.
21. Реализация записью интерфейса.
22. Методы расширения.
23. Лямбда-выражения.
Изменено
1. Только сокращенное вычисление логических выражений.
2. Другой синтаксис foreach.
3. Интерфейсы interface в стиле .NET.
4. Другой синтаксис перегрузки операций.
5. Статические методы классов вместо классовых методов. Отсутствие типа TClass.
6. Деструкторы оставлены лишь для совместимости и не выполняют никаких действий.
7. Тип object - синоним System.Object.
8. Тип exception - синоним System.Exception.
9. Индексация string с 1, директива переключения на индексацию с 0.
10. Процедура write выводит любые типы.
11. Структурная эквивалентность типов для процедурных переменных, динамических массивов, типизированных указателей и множеств (в Delphi Object Pascal - именная эквивалентность типов за исключением открытых массивов).
12. Множества на базе произвольных типов (set of string).
13. Запрет использования указателей на управляемую память.
14. Процедурные переменные (делегаты) вместо procedure of object.
15. С бестиповыми файлами file можно работать с помощью процедур read, write.
16. Массивы массивов отличаются по типу от двумерных массивов (в частности, записи a[i][j] и a[i,j] неэквивалентны).
17. Перегрузка выполняется без ключевого слова overload.
18. Все конструкторы имеют имя Create.
19. Автоматическое управление памятью с помощью сборщика мусора (за исключением указателей на неуправляемую память).
Отсутствует
1. Ключевые слова и директивы, и связанные с ними возможности:
1. Packed
2. Threadvar
3. Inline
4. Asm
5. Exports
6. Library
7. Unsafe
8. Resourcestring
9. Dispinterface
10. In
11. Out
12. Absolute
13. Dynamic
14. Local
15. Platform
16. Requires
17. Abstract
18. Export
19. Message
20. Resident
21. Assembler
22. Safecall
23. Automated
24. Far
25. Near
26. Stdcall
27. Cdecl
28. Published
29. Stored
30. Contains
31. Implements
32. Varargs
33. Default
34. Deprecated
35. Package
36. Register
37. Dispid
38. Pascal
39. writeonly.
2. Приведение типов для переменных: Char(b) := 'd'.
3. Возможность присвоить адрес подпрограммы указателю pointer.
4. Записи с вариантами.
5. Строки PChar.
6. Возможность использовать операцию @ для процедурных переменных.
7. Вариантные типы.
8. Бестиповые параметры (var a; const b).
9. Открытые массивы (не путать с динамическими!).
10. Методы, связанные с сообщениями (message).
11. Классовые свойства.
12. Вложенные определения классов.
13. Константы-поля классов.
Литература
1. Сайт «PascalABC.NEТ. Современное программирование на языке Pascal», http://pascalabc.net/
2. Цветков А.С. Язык программирования PASCAL. Система программирования ABC Pascal. Учебное пособие для школьников 7-9 классов. – СПб.: Павловск: Школа им. А.М. Горчакова, 2012-2013. – 46 с., ил.
3. Махно В.В., Михалкович С.С., Пучкин М.В. Основы программирования графики. Методические указания для преподавателей факультета математики, механики и компьютерных наук, ведущих курсы по основам программирования. – Ростов-на-Дону: Федеральное агентство по образованию, «Южный федеральный университет», 2007. – 49 с.
4. Сайт «Free Pascal. Open source compiler for Pascal and Object Pascal», http://www.freepascal.org/
5. Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Free Pascal и Lazarus: Учебник по программированию. – М.: ALT Linux; Издательский дом ДМК-пресс, 2010. – 440 с.: ил. – (Библиотека ALT Linux).
6. Кетков Ю.Л. Свободное программное обеспечение. FREE PASCAL для студентов и школьников. – СПб.: БХВ-Петербург, 2011. — 384 с.: ил.
7. Павловская Т.А. Паскаль. Программирование на языке высокого уровня. Учебник для вузов. – СПб.: Питер, 2007. – 393 с.: ил.
8. Турбо Паскаль 7.0. Самоучитель. – СПб.: Питер; К.: Издательская группа BHV, 2002. – 416 с.: ил.