- •Часть II Оглавление
- •Строки. Процедуры и функции для работы со строками.
- •Множества. Операции над множествами.
- •Подпрограммы для работы со всеми типами файлов
- •Текстовые файлы
- •Бестиповые файлы
- •Типизированные файлы
- •Прямой доступ
- •Оператор with.
- •Вариантная запись.
- •Динамические структуры данных
- •Процедуры и функции. Рекурсия. Модули.
- •Основы объектно-ориентированного программирования
- •Графика
Прямой доступ
При последовательном доступе чтение/запись очередного элемента файла возможно только после аналогичной операции с предыдущим элементом. Бестиповые и компонентные файлы состоят из блоков одинакового размера. В бестиповом файле размер блока равен длине буфера, а в компонентном - длине компоненты. Это позволяет применить к таким файлам прямой доступ, при котором операции выполняются с заданным блоком.
С помощью стандартной процедуры seek производится установка текущей позиции в файле на начало заданного блока, и следующая операция чтения/записи выполняется, начиная с этой позиции. Первый блок файла имеет номер 0.
Ниже приведено описание стандартных подпрограмм, используемых для реализации прямого доступа.
filepos(var f): longint
Функция возвращает текущую позицию в файле f. Для только что открытого файла текущей позицией будет 0. После чтения или записи первого блока текущая позиция станет равной 1.
filesize(var f): longint
Функция возвращает количество блоков в открытом файле f.
seek(var f; n: longint)
Процедура выполняет установку текущей позиции в файле (позиционирование). В параметреn задается номер блока, к которому будет выполняться обращение. Блоки нумеруются с нуля.
truncate(var f)
Процедура устанавливает в текущей позиции признак конца файла и удаляет все последующие блоки.
Задача.
Дан текстовый файл. Найти в нем заданную последовательность символов, и заменить их другой последовательностью.
var
stout, stin, str: string;
f: text;
i, len: integer;
begin
assign(f,1.txt');
reset(f);
writeln('Что удалить?');
readln(stout);
writeln('Что вставить? ');
readln(stin);
len:= length(stout);
while not Eof(f) do
begin
readln(f,str);
i := 1;
while i<>0 do
begin
i:= pos(stout,str);
if i<>0 then
begin
delete(str,i,len);
insert(stin,str,i);
end;
end;
writeln(str);
end;
close(f);
readln
end.
Задача.
Создать типизированный файл и записать туда n вещественных чисел.
var f: file of real;
i, n: integer;
a: real;
begin
Assign( f , ’OurFile’ );
rewrite (f);
writeln(’Введите N’);
readln(n);
for i :=1 to n do
begin
write(’a=’ );
readln(a);
write(f,a);
end;
Close(f);
end.
Задания для самостоятельной работы.
Дан текстовый файл. Вывести на экран его содержимое.
Создать типизированный файл. Заполнять его числами до тех пор, пока не будет введена цифра 5.
Дан текстовый файл. Осуществить копирование данного файла в другой текстовый файл. (Пользователь должен иметь возможность самостоятельно вводить имя нового файла).
Создать 3 файла: типизированные (тип real, integer) и текстовый. Заполнить их одинаковыми значениями. Сделать вывод о весе созданных файлов.
Дан типизированный файл (integer). Увеличить все его содержимое на самое часто встречающееся, в данном файле, число.
Дан текстовый файл. Посчитать в нем количество букв, слов, предложений.
Осуществить копирование не типизированного файла.
Записи
В большинстве случаев при написании программ применяются простые типы данных (числа, строки). Но часто возникает необходимость в объединении разных типов данных в один. В Free Pascal для этого применяется структурный тип данных - запись.
Запись – это структура, состоящая из фиксированного числа компонент, называемых полями. Данные одного поля разных записей имеют один и тот же тип, а разных полей могут иметь разные типы. Общий вид описания типа запись:
type
имя записи = record
поле 1 : тип;
поле 2 : тип;
. . .
поле N : тип;
end;
Элементами записей могут быть как простые, так и структурные типы. Никаких ограничений по уровню вложенности структур нет.
Рассмотрим пример: Создадим запись Person, которая будет содержать следующие поля: ФИО, дата рождения, адрес. В свою очередь адрес также сделаем записью, состоящей из полей: город, улица, дом.
type
adr = record
city , street : string;
house : integer;
end;
person = record
FIO, birth : string ;
address : adr;
end;
В программе переменная типа записи объявляется следующим образом:
var переменная : имя записи;
К каждому из компонентов записи можно получить доступ, используя составное имя. Для этого вначале пишется имя переменой, затем точка, затем имя поля.
Создадим переменную типа Person и заполним ее значениями.
var pr1:person;
people:array[1..100] of person;
begin
pr1.FIO:=’Иванов’;
pr1.birth:=’1 января 1980 года’;
pr1.address.city:=’Шадринск’;
pr1.address.street:=’Свердлова’;
pr1.address.house:=1;
people[1].FIO:=’Сидоров’;
people[1].address.city:=’Екатеринбург’;
people[2].FIO:=’Петров’;
people[2].address.city:=’Челябинск’;
end.
