Описание записи в языке Pascal осуществляется с помощью служебного слова RECORD, вслед за которым описываются компоненты записи. Завершается описание записи служебным словом END.
Например, записная книжка содержит фамилии, инициалы и номера телефона, поэтому отдельную строку в записной книжке удобно представить в виде следующей записи:
type Row = Record
FIO: String[20];
TEL: String[7];
end;
var str: Row;
Описание записей возможно и без использования имени типа, например:
var str: Record
FIO: String[20];
TEL: String[7];
end;
Обращение к записи в целом допускается только в операторах присваивания, где слева и справа от знака присваивания используются имена записей одинакового типа. Во всех остальных случаях оперируют отдельными полями записей. Чтобы обратиться к отдельной компоненте записи, необходимо задать имя записи и через точку указать имя нужного поля. Такое имя называется составным. Компонентой записи может быть также запись, в таком случае составное имя будет содержать не два, а большее количество имен.
Обращение к компонентам записей можно упростить, если воспользоваться оператором присоединения with. Он позволяет заменить составные имена, характеризующие каждое поле, просто на имена полей, а имя записи определить в операторе присоединения.
Иногда содержимое отдельной записи зависит от значения одного из ее полей. В языке Pascal допускается описание записи, состоящей из общей и вариантной частей. Вариантная часть задается с помощью конструкции case P of, где Р – имя поля из общей части записи. Возможные значения, принимаемые этим полем, перечисляются так же, как и в операторе варианта. Однако вместо указания выполняемого действия, как это делается в операторе варианта, указываются поля варианта, заключенные в круглые скобки. Описание вариантной части завершается служебным словом end. Тип поля Р можно указать в заголовке вариантной части. Инициализация записей осуществляется с помощью типизированных констант.
13. Множества
Понятие множества в языке Pascal основывается на математическом представлении о множествах: это ограниченная совокупность различных элементов. Для построения конкретного множественного типа используется перечисляемый или интервальный тип данных. Тип элементов, составляющих множество, называется базовым типом.
Множественный тип описывается с помощью служебных слов Set of, например:
type M = Set of B;
здесь М – множественный тип, В – базовый тип.
Принадлежность переменных к множественному типу может быть определена прямо в разделе описания переменных.
Константы множественного типа записываются в виде заключенной в квадратные скобки последовательности элементов или интервалов базового типа, разделенных запятыми.
К переменным и константам множественного типа применимы операции присваивания (:=), объединения (+), пересечения (*) и вычитания (-). Результат выполнения этих операций есть величина множественного типа:
1) ['A','B'] + ['A','D'] даст ['A','B','D'];
2) ['A'] * ['A','B','C'] даст ['A'];
3) ['A','B','C'] – ['A','B'] даст ['C']
К множественным величинам применимы операции: тождественность (=), нетождественность (<>), содержится в (<=), содержит (>=). Результат выполнения этих операций имеет логический тип:
1) ['A','B'] = ['A','C'] даст FALSE;
2) ['A','B'] <> ['A','C'] даст TRUE;
3) ['B'] <= ['B','C'] даст TRUE;
4) ['C','D'] >= ['A'] даст FALSE.
Кроме этих операций, для работы с величинами множественного типа используется операция in, проверяющая принадлежность элемента базового типа, стоящего слева от знака операции, множеству, стоящему справа от знака операции. Результат выполнения этой операции – булевский.
Величины множественного типа не могут быть элементами списка ввода-вывода. В каждой конкретной реализации транслятора с языка Pascal количество элементов базового типа, на котором строится множество, ограниченно.
14. Файлы. Операции с файлами
Файловый тип данных определяет упорядоченную совокупность однотипных компонент.
При работе с файлами выполняются операции ввода-вывода. Операция ввода – это перепись данных с внешнего устройства в память, операция вывода – пересылка данных из памяти на внешнее устройство.
Текстовые файлы
Для описания таких файлов имеется тип Text:
var TF1, TF2: Text;
Компонентные файлы
Компонентный, или типизированный файл, – это файл с объявленным типом его компонент.
type M = File Of T;
где М – имя файлового типа;
Т – тип компоненты. Операции производятся с помощью процедур.
Write(f, X1,X2,…XK)
Бестиповые файлы
Бестиповые файлы позволяют записывать на диск произвольные участки памяти ЭВМ и считывать их.
var f: File;
1. Procedure Assign(var F; FileName: String); Она сопоставляет имя файла с переменной.
2. Procedure Close(var F);
Она разрывает связь между файловой переменной и внешним дисковым файлом и закрывает файл.
3. Function Eof(var F): Boolean;
{Типизированные или нетипизированные файлы}
Function Eof[(var F: Text)]: Boolean;
{Текстовые файлы}
Проверяет на конец файла.
4. Procedure Erase(var F);
Удаляет внешний файл, связанный с F.
5. Function FileSize(var F): Integer;
Возвращает размер в байтах файла F.
6. Function FilePos(var F): LongInt;
Возвращает текущую позицию внутри файла.
7. Procedure Reset(var F [: File; RecSize: Word]);
Открывает существующий файл.
8. Procedure Rewrite(var F: File [; Recsize: Word]);
Создает и открывает новый файл.
9. Procedure Seek(var F; N: LongInt);
Перемещает текущую позицию файла к определенному компоненту.
10. Procedure Append(var F: Text);
Дозапись.
11. Function Eoln[(var F: Text)]: Boolean;
Проверяет на конец строки.
12. Procedure Read(F, V1 [, V2…, Vn]);
{Типизированные и нетипизированные файлы}
Procedure Read([var F: Text;] V1 [, V2…, Vn]);
{Текстовые файлы}
Читает компонент файла в переменную.
13. Procedure Readln([var F: Text;] V1 [, V2…, Vn]);
Считывает строку символов в файле, включая маркер конца строки, и переходит к началу следующей.
14. Function SeekEof[(var F: Text)]: Boolean;
Возвращает признак конца файла. Используется только для открытых текстовых файлов.
15. Procedure Writeln([var F: Text;] [P1, P2…, Pn]);
{Текстовые файлы}
Выполняет операцию Write, затем помещает метку конца строки в файл.
15. Модули. Виды модулей
Модуль(UNIT) в Pascal – это особым образом оформленная библиотека подпрограмм. Модуль, в отличие от программы, не может быть запущен на выполнение самостоятельно, он может только участвовать в построении программ и других модулей.
Модуль в Pascal представляет собой отдельно хранимую и независимо компилируемую программную единицу.
Все программные элементы модуля можно разбить на две части:
1) программные элементы, предназначенные для использования другими программами или модулями, такие элементы называют видимыми вне модуля;
2) программные элементы, необходимые только для работы самого модуля, их называют невидимыми (или скрытыми).
unit <имя модуля>; {заголовок модуля}
interface
{описание видимых программных элементов модуля}
implementation
{описание скрытых программных элементов модуля}
begin
{операторы инициализации элементов модуля}
end.
Для обращения к переменной, описанной в модуле, необходимо применить составное имя, состоящее из имени модуля и имени переменной, разделенных точкой.
Рекурсивное использование модулей запрещено. Перечислим, какие бывают виды модулей.
1. Модуль SYSTEM.
Модуль SYSTEM реализует поддерживающие подпрограммы нижнего уровня для всех встроенных средств, таких как ввод-вывод, работа со строками, операции с плавающей точкой и динамическое распределение памяти.
2. Модуль DOS.
Модуль Dos реализует многочисленные процедуры и функции Pascal, которые эквивалентны наиболее часто используемым вызовам DOS, как, например, GetTime, SetTime, DiskSize и так далее.
3. Модуль CRT.
Модуль CRT реализует ряд мощных программ, предоставляющих полную возможность управления средствами компьютера РС, такими, как управление режимом экрана, расширенные коды клавиатуры, цвета, окна и звуковые сигналы.
4. Модуль GRAPH.
С помощью процедур и функций, входящих в этот модуль, можно создавать различные графические изображения на экране.
5. Модуль OVERLAY.
Модуль OVERLAY позволяет уменьшить требования к памяти программы DOS реального режима.
16. Ссылочный тип данных. Динамическая память. Динамические переменные. Работа с динамической памятью
Статической переменной (статически размещенной) называется описанная явным образом в программе переменная, обращение к ней осуществляется по имени. Место в памяти для размещения статических переменных определяется при компиляции программы. В отличие от таких статических переменных в программах, написанных на языке Pascal, могут быть созданы динамические переменные. Основное свойство динамических переменных заключается в том, что они создаются, и память для них выделяется во время выполнения программы.
Размещаются динамические переменные в динамической области памяти (heap-области). Динамическая переменная не указывается явно в описаниях переменных, и к ней нельзя обратиться по имени. Доступ к таким переменным осуществляется с помощью указателей и ссылок.
Cсылочный тип (указатель) определяет множество значений, которые указывают на динамические переменные определенного типа, называемого базовым типом. Переменная ссылочного типа содержит адрес динамической переменной в памяти. Если базовый тип является еще не описанным идентификатором, то он должен быть описан в той же самой части описания типов, что и тип-указатель.