
- •Алфавит и лексемы
- •Константы
- •Имена, ключевые слова и знаки операций
- •Ввод с клавиатуры
- •Вывод на экран
- •Условный оператор if
- •Оператор варианта case
- •Цикл с предусловием while
- •Цикл с постусловием repeat
- •Цикл с параметром for
- •Рекомендации по использованию циклов
- •Оператор перехода goto
- •Перечисляемый тип данных
- •Интервальный тип данных
- •Двумерные массивы
- •Операции
- •Процедуры и функции для работы со строками
- •Множества
- •Операции над множествами
- •Подпрограммы для работы со всеми типами файлов Процедуры
- •Функции
- •Текстовые файлы
- •Бестиповые файлы
- •Компонентные файлы
- •Прямой доступ
- •Процедуры
- •Функции
- •Глобальные и локальные переменные
- •Параметры-значения
- •Параметры-переменные
- •Параметры-константы
- •Нетипизированные параметры
- •Открытые массивы и строки
- •Рекурсивные подпрограммы
- •Описание модулей
- •Использование модулей
- •Модуль System
- •Модуль Crt
- •Работа с экраном
- •Работа с клавиатурой
- •Модули Dos и WinDos
- •Модуль Graph
- •Структура графической программы
- •Модуль Strings
Компонентные файлы
Компонентные файлы применяются для хранения однотипных элементов в их внутренней форме представления. Тип компонент задается после ключевых слов file of:
var имя : file of тип_компонент;
Компоненты могут быть любого типа, кроме файлового. В операциях ввода-вывода могут участвовать только величины того же типа, что и компоненты файла, например:
type mas = array [1 .. 100] of real;
var a, b : mas;
f : file of mas;
begin
assign(f, 'some_file.dat'); rewrite(f);
...
write(f, a, b);
close(f)
end.
За одну операцию записывается или считывается столько компонент, сколько перечислено в процедурах write или read.
Пример #2. |
|
|
Из текстового файла прочитать пары вещественных чисел, считая первое вещественной, а второе - мнимой составляющей комплексного числа, и записать их в файл комплексных чисел. |
program tip_file; type Complex = record d, m : real; end; var x : Complex; f1 : text; f2 : file of Complex; i : byte; begin assign(f1, 'tipfile.dat'); reset(f1); assign(f2, 'tipfile.res'); rewrite(f2); while not eof(f1) do begin read(f1, x.d, x.m); write(f2, x); end; close(f1); close(f2); end.
|
Прямой доступ
При последовательном доступе чтение/запись очередного элемента файла возможно только после аналогичной операции с предыдущим элементом. Бестиповые и компонентные файлы состоят из блоков одинакового размера. В бестиповом файле размер блока равен длине буфера, а в компонентном - длине компоненты. Это позволяет применить к таким файлам прямой доступ, при котором операции выполняются с заданным блоком.
С помощью стандартной процедуры seek производится установка текущей позиции в файле на начало заданного блока, и следующая операция чтения/записи выполняется, начиная с этой позиции. Первый блок файла имеет номер 0.
Ниже приведено описание стандартных подпрограмм, используемых для реализации прямого доступа.
filepos(var f) : longint
Функция возвращает текущую позицию в файле f. Для только что открытого файла текущей позицией будет 0. После чтения или записи первого блока текущая позиция станет равной 1.
filesize(var f) : longint
Функция возвращает количество блоков в открытом файле f.
seek(var f; n: longint)
Процедура выполняет установку текущей позиции в файле (позиционирование). В параметре n задается номер блока, к которому будет выполняться обращение. Блоки нумеруются с нуля.
truncate(var f)
Процедура устанавливает в текущей позиции признак конца файла и удаляет все последующие блоки.
Пример #3. |
|
|
Программа, которая выводит на экран заданную по номеру запись из файла, сформированного в программе create_bfile (с. ???$Rcrbfile). |
program get_bfile; var buf : array[1 .. 4] of real; f : file; i, k : integer; filename : string; begin {$I-} writeln('Введите имя входного файла'); readln(filename); assign(f, filename); reset(f, sizeof(real) * 4); if IOResult <>0 then begin writeln('Файл ', filename, ' не найден'); exit end; {$I+} while true do begin writeln('Введите номер записи или -1 для окончания'); readln(k); if (k > filesize(f)) or (k < 0) then begin writeln('Такой записи в файле нет',); exit end; seek(f, k); blockread(f, buf, 1); for i:= 1 to 4 do write(buf[i]:6:1); end; close(f); end. |
Подпрограммы
Подпрограммы нужны для того, чтобы упростить структуру программы и облегчить ее отладку. В виде подпрограмм оформляются логические законченные части программы.
Подпрограмма - это фрагмент кода, к которому можно обратиться по имени. Она описывается один раз, а вызываться может столько раз, сколько необходимо. Одна и та же подпрограмма может обрабатывать различные данные, переданные ей в качестве аргументов.
В Паскале два вида подпрограмм: процедуры и функции. Они имеют незначительные отличия в синтаксисе и правилах вызова. Процедуры и функции описываются в соответствующих разделах описания, до начала блока исполняемых операторов.
Само по себе описание не приводит к выполнению подпрограммы. Для того чтобы подпрограмма выполнилась, ее надо вызвать. Вызов записывается в том месте программы, где требуется получить результаты работы подпрограммы. Подпрограмма вызывается по имени, за которым следует список аргументов в круглых скобках. Если аргументов нет, скобки не нужны. Список аргументов при вызове как бы накладывается на список параметров, поэтому они должны попарно соответствовать друг другу.
Процедура вызывается с помощью отдельного оператора, а функция - в правой части оператора присваивания, например:
inc(i); writeln(a, b, c); { вызовы процедур }
y := sin(x) + 1; { вызов функции }
Внутри подпрограмм можно описывать другие подпрограммы. Они доступны только из той подпрограммы, в которой они описаны. Рассмотрим правила описания подпрограмм.