Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование на языке высокого уровня Паскаль. Учебное пособие для СПО

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
Множественный тип данных в языке Паскаль соответствует математическому представлению о множествах: это ограниченная совокупность различных элементов. Множество создается на основе элементов базового типа — это может быть перечисляемый тип, интервальный или byte. В множестве не может быть более 256 элементов, а их порядковые номера должны лежать в пределах от 0 до
255.
Множество описывается с помощью служебных слов set of.
type имя_типа = set of базовый_тип;
Примеры описания множественных типов:
type Caps = set of 'A' .. 'Z'; Colors = set of (RED, GREEN, BLUE); Numbers = set of byte;
Принадлежность переменных к множественному типу может быть определена прямо в разделе описания переменных, например:
var oct : set of 0 .. 7;
Тип 'множество' задает набор всех возможных подмножеств его элементов, включая пустое. Если базовый тип, на котором строится множество, имеет k элементов, то число подмножеств, входящих в это множество, равно 2k.
Константы множественного типа записываются в виде заключенной в квадратные скобки последовательности элементов или интервалов базового типа, разделенных запятыми, например:
['A', 'D'] [1, 3, 6] [2, 3, 10 .. 13].
Порядок перечисления элементов базового типа в константах не имеет значения. Константа вида [ ] означает пустое подмножество. Переменная типа 'множество' содержит одно конкретное подмножество значений множества. Пусть имеется переменная b интервального типа:
var b : 1 .. 3; { переменная может принимать три
Программирование на я зыке высокого уровня ПаскальТ.А. Павловская
61
различных значения: 1, 2 или 3 }
Переменная m типа 'множество'
var m : set of 1 .. 3;
может принимать восемь различных значений:
[ ] [1] [2] [3] [1, 2] [1, 3] [2, 3] [1, 2, 3]
Операции над множествами
Величины множественного типа не могут быть элементами списка ввода-вывода. Допустимые операции над множествами перечислены в табл. 3.1.
Таблица 3.1. Операции над множествами
Знак Название Математическая запись Результат
:= Присваивание
+ Объединение Множество
* Пересечение Множество
– Дополнение \ Множество
= Тождественность = Логический
<> Нетождественность Логический
<= Содержится в Логический
>= Содержит Логический
in Принадлежность Логический
Операции над множествами в основном соответствуют операциям, определенным в теории множеств.
В операциях могут участвовать переменные и константы совместимых множественных типов. Исключение составляет операция in: ее первый операнд должен принадлежать базовому типу элементов множества, записанного вторым операндом.
Программирование на я зыке высокого уровня ПаскальТ.А. Павловская
62
Рассмотрим примеры применения операций. Пусть задано множество, основанное на значениях прописных латинских букв.
type Caps = set of 'A' .. 'Z'; var a, b, c : Caps; begin a := ['A', 'U' .. 'Z']; b := [ 'M' .. 'Z']; c := a; { присваивание } c := a + b; { объединение, результат ['A', 'M' .. 'Z'] } c := a * b; { пересечение, результат ['U' .. 'Z'] } c := b – a; { вычитание, результат ['M' .. 'T'] } c := a – b; { вычитание, результат ['A'] } if a = b then writeln ('тождественны'); { не выполнится } if a <> b then writeln ('не тождественны'); { выполнится } if c <= a then writeln ('c содержится в а'); { выполнится } if 'N' in b then writeln ('в b есть N'); { выполнится } end.
С помощью констант-множеств часто проверяют, входит ли символ в заданный диапазон. Например, чтобы проверить, является ли введенный символ цифрой, можно написать:
var c : char; ... if c in ['0' .. '9'] then ...
Файлы
Файловые типы данных введены в язык для работы с внешними устройствами — файлами на диске, портами, принтерами и т. д. Передача данных с внешнего устройства в оперативную память называется чтением, или вводом, обратный процесс — записью, или выводом.
Файловые типы языка Паскаль бывают стандартные и определяемые программистом. Стандартными являются текстовый файл ( text ) и бестиповой файл ( file ). Они описываются в программе, например, так:
Программирование на я зыке высокого уровня ПаскальТ.А. Павловская
63
var ft : text; fb : file;
Программист может определить файл, состоящий из элементов определенного типа. Такой файл называется компонентным, или типизированным:
var fc : file of <тип_компонент>;
Компоненты могут быть любого типа, кроме файлового. Любой файл, в отличие от массива и записи, может содержать неограниченное количество элементов.
Текстовые файлы предназначены для хранения информации в виде строк символов. При выводе в текстовый файл данные преобразуются из внутренней формы представления в символьную, понятную человеку, при вводе выполняется обратное преобразование.
Бестиповые и компонентные файлы хранят данные в том же виде, в котором они представлены в оперативной памяти, то есть при обмене с файлом происходит побитовое копирование информации.
Доступ к файлам может быть последовательным, когда очередной элемент можно прочитать (записать) только после аналогичной операции с предыдущим элементом, и прямым, при котором выполняется чтение (запись) произвольного элемента по заданному адресу. Текстовые файлы позволяют выполнять только последовательный доступ, в бестиповых и компонентных можно использовать оба метода.
Прямой доступ возможен благодаря тому, что данные в этих файлах условно разделены на блоки одинакового размера, и перед операцией обмена выполняется установка текущей позиции файла на заданный блок. Прямой доступ в сочетании с отсутствием преобразований обеспечивает высокую скорость получения информации.
Чтобы не путать файлы в программе и файлы на диске, переменные файлового типа называют логическими файлами, а реальные устройства и файлы на диске — физическими файлами. Их имена задаются с помощью строк символов, например:
Программирование на я зыке высокого уровня ПаскальТ.А. Павловская
64
'primer.pas' — имя файла в текущем каталоге; 'd:\pascal\input.txt' — полное имя файла; 'CON' 'NUL' 'COM1' 'PRN' — имена устройств.
Для организации ввода-вывода необходимо выполнить следующие действия.
1. Объявить файловую переменную.
2. Связать ее с физическим файлом.
3. Открыть файл для чтения и/или записи.
4. Выполнить операции ввода-вывода.
5. Закрыть файл.
Все стандартные процедуры и функции Паскаля, обеспечивающие ввод­вывод данных, работают только с логическими файлами. Ввод-вывод выполняется через буфер — специальную область оперативной памяти. Буфер выделяется для каждого открытого файла. При записи в файл вся информация сначала направляется в буфер и там накапливается до тех пор, пока весь буфер не заполнится. Только после этого или после специальной команды сброса происходит передача данных на внешнее устройство. При чтении из файла данные вначале считываются в буфер, причем данных считывается не столько, сколько запрашивается, а сколько поместится в буфер.
Механизм буферизации позволяет более быстро и эффективно обмениваться информацией с внешними устройствами.
В Паскале есть подпрограммы, применяемые для работы со всеми типами файлов: assign, close, erase, rename, reset, rewrite,
eof и IOresult.
Текстовые файлы
Текстовый файл представляет собой последовательность строк символов переменной длины. Каждая строка заканчивается символами перевода строки и возврата каретки (их коды — 13 и 10). Эти символы вставляются в физический файл при нажатии клавиши Enter. При
Программирование на я зыке высокого уровня ПаскальТ.А. Павловская
65
чтении файла эти символы не вводятся в переменные в программе, а воспринимаются как разделитель.
Текстовый файл можно открыть не только для чтения или записи с помощью процедур reset и rewrite, но и для добавления информации в конец (процедура append ). Для чтения из текстового файла применяются процедуры read (f, список) и readln
(f, [список]) . Они отличаются от процедур ввода с клавиатуры
только наличием первого параметра — имени логического файла.
Процедуры записи в текстовый файл — write (f, список) и
writeln (f, [список]) . При записи в текстовый файл
происходит преобразование из внутренней формы представления выводимых величин в символьные строки. Чтение и запись выполняются последовательно, то есть записать или считать очередной символ можно только после предыдущего.
В Паскале есть несколько стандартных подпрограмм, которые предназначены только для работы с текстовыми файлами: flush,
settextbuf, seekEof и seekEoln.
Бестиповые файлы
Бестиповые файлы предназначены для хранения участков оперативной памяти на внешних носителях. После описания файловой переменной
var имя : file;
ее требуется связать с физическим файлом с помощью процедуры
assign. Чтение и запись производится через буфер 'порциями',
равными размеру буфера. Размер буфера, отличающийся от стандартного (128 байт), можно задать с помощью второго параметра процедур reset и rewrite при открытии файла.
reset(var f : file; bufsize : word) rewrite(var f : file; bufsize : word)
Размер буфера должен находиться в пределах от 1 байта до 64 Кбайт.
Программирование на я зыке высокого уровня ПаскальТ.А. Павловская
66
Собственно чтение и запись выполняются с помощью процедур
blockread и blockwrite.
blockread(var f : file; var x; count : word; var num : word); blockwrite(var f : file; var x; count : word; var num : word);
Процедура blockread считывает в переменную x количество блоков count. Длина блока равна размеру буфера. Значение count должно быть больше или равно 1, за одно обращение нельзя ввести больше 64 Кбайт. При вводе никаких преобразований данных не выполняется. Необязательный параметр num возвращает количество прочитанных блоков.
Процедура blockwrite записывает в файл количество блоков, равное count, начиная с адреса, заданного переменной x. Длина блока равна длине буфера. Необязательный параметр num возвращает число успешно записанных блоков.
Для бестиповых файлов применяется как последовательный, так и прямой доступ.
Пример. Программа выполняет ввод вещественных чисел из текстового файла и запись их в бестиповой файл блоками по четыре числа (пример
3.6).
program create_bfile; var buf : array[1 .. 4] of real; f_in : text; f_out : file; i, k : integer; name_in, name_out : string; begin {$I–} writeln('Введите имя входного файла'); readln(name_in); assign(f_in, name_in); reset(f_in); if IOResult <> 0 then begin writeln('Файл ', name_in,' не найден'); exit end; writeln('Введите имя выходного файла'); readln(name_out); assign(f_out, name_out); rewrite(f_out, sizeof(real) * 4);
Программирование на я зыке высокого уровня ПаскальТ.А. Павловская
67
{$I+} i := 0; while not eof(f_in) do begin inc(i); read(f_in, buf[i]); if i = 4 then begin blockwrite(f_out, buf, 1); i := 0; end; end; if i <> 0 then begin for k := i + 1 to 4 do buf[k] := 0; blockwrite(f_out, buf, 1); end; close(f_in); close(f_out); end.
Листинг 3.6. Запись в бестиповой файл
Компонентные файлы
Компонентные файлы применяются для хранения однотипных элементов в их внутренней форме представления. Тип компонент задается после ключевых слов 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)
Программирование на я зыке высокого уровня ПаскальТ.А. Павловская
68
end.
Обратите внимание, что компонентой этого файла является массив целиком. За одну операцию записывается или считывается столько компонент, сколько перечислено в процедурах write или read.
Компонентные файлы, как и бестиповые, применяются не для просмотра их человеком, а для использования в программах.
Прямой доступ
Бестиповые и компонентные файлы состоят из блоков одинакового размера. В бестиповом файле размер блока равен длине буфера, а в компонентном — длине компоненты. Это позволяет применить к таким файлам прямой доступ, при котором операции выполняются с заданным блоком. Прямой доступ применяется только для физических файлов, расположенных на дисках.
С помощью стандартной процедуры seek производится установка текущей позиции в файле на начало заданного блока, и следующая операция чтения-записи выполняется, начиная с этой позиции. Первый блок файла имеет номер 0.
Ниже описаны стандартные подпрограммы для реализации прямого доступа.
filepos (var f) : longint
Функция возвращает текущую позицию в файле f. Для только что открытого файла это будет 0.
filesize (var f) : longint
Функция возвращает количество блоков в открытом файле f.
seek (var f; n: longint)
Процедура выполняет установку текущей позиции в открытом файле (позиционирование). В параметре n задается номер блока, к которому
Программирование на я зыке высокого уровня ПаскальТ.А. Павловская
69
будет выполняться обращение.
truncate (var f)
Процедура устанавливает в текущей позиции признак конца файла и удаляет все последующие блоки.
Пример. Программа, которая выводит на экран заданную по номеру запись из файла, сформированного в пример 3.6.
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.
Листинг 3.7. Чтение из бестипового файла
Таким же образом можно изменять заданную запись в файле. Файл при этом может быть открыт как для чтения, так и для записи. Попытка чтения-записи несуществующего блока приводит к ошибке времени
Программирование на я зыке высокого уровня ПаскальТ.А. Павловская
70
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]