КРАТКИЕ СВЕДЕНИЯ ИЗ ТЕОРИИ
Под записью понимается структура данных, об"единяющая под одним именем данные различных типов. Записи состоят из фиксированного числа элементов, называемых полями. Поле - это переменная определенного типа. Различные поля могут иметь (в отличии от элементов массива) различный тип. Обращение к элементу записи выполняется с помощью составного (уточненного) имени. Первая часть составного имени - это имя записи, вторая часть - имя поля. Между именем записи и именем поля ставится точка: ZAP.IMP, где ZAP - имя записи, IMP - имя поля.
При решении многочисленных задач обработки больших об"емов информации, бухгалтерского учета, ведения различных картотек, справочников и баз данных используются файлы, которые позволяют запоминать, изменять, хранить и читать различную информацию на внешних носителях (магнитных дисках). Файл представляет собой структурированный тип данных, содержащий последовательность компонентов (чаще всего записей) одного типа и одной длины. Число элементов в файле (длина файла) не фиксировано. Это является основным отличием файла от массива. Файл, не содержащий ни одного элемента, называется пустым, его длина равна нулю.
Файл можно представить как магнитную ленту, у которой есть начало, а конец не фиксирован. Элементы файла записываются на эту ленту последовательно, друг за другом с помощью некоторого устройства (указателя файла). При чтении или записи этот указатель перемещается к следующему элементу и делает его доступным для обработки. В каждый момент доступен для записи (чтения) только этот элемент файла, на который установлен указатель.
При необходимости формирования или использования файла в разделе описаний программы должна быть описана файловая переменная. Описание файловой переменной имеет следующий вид:
type имя-типа=file of базовый-тип;
var имя-файловой-переменной : имя-типа;
или
var имя-файловой переменной : file of базовый-тип;
В качестве базового типа элементов файла можно использовать любой тип данных (как простой, так и сложный), за исключением типа file.
Так как, по определению, число элементов файла не задается, то в Turbo Pascal введена стандартная функция
Eof(var F:file):boolean;
Когда будет достигнут конец файла, Eof(F) примет значение True, в в противном случае - False.
ПРИМЕР 1: Создать файл для хранения записей вида:
Запрос выводится с новой строки для каждого поля. Например:
Телевизор
Название . . . . . . . . . РЕКОРД
Цена (тыс.) . . . . . . . 3000
Диагональ . . . . . . . . 59
Изображение (ц/ч) . . Ц
Производитель . . . . .
Завод . . . . . . . . Фотон
Город . . . . . . . . Москва
Директор . . . . . Иванов
После записи файла осуществить поиск в нем названий телевизоров стоиостью менее 2 млн.руб.
program zapis;
const maxn = 30;
type TV = record
Name : string[20];
Price : 1 .. 32000;
Diagonal : 1 .. 50;
Color : char;
Proizv : record
city : string[25];
factory : string[50];
director : string[30];
end;
end;
tele = file от TV;
var f : tele;
was : boolean;
z:TV;
begin
writeln ('Ввод записей');
writeln ('Признак окончания ввода - *');
assing (f,'f.dat');
rewrite(f);
writeln (' Телевизор ');
write (' Название . . . . . .');readln(z.name);
while z.name <> ' * ' do
begin
write (' Цена (тыс.). . . . . .');readln(z.Price);
write (' Диагональ . . . . . .');readln(z.Diagonal);
write (' Изображение (ц/ч). . .');readln(z.Color);
writeln (' Производитель. . . . . ');
with z.Proizv do
begin
write (' Завод . . . . . . .');readln(city);
write (' Город . . . . . . .');readln(factory);
write (' Директор. . . . . .');readln(director);
tnd;
write (f,z)
writeln (' Телевизор');
write ('Название .......'); readln (z.name)
end;
close (f);
writeln ('Файл сформирован');
reset (f);
was:=false; {признак того, что искомые телевизоры найдены)
writeln ('Названия телевизоров стоимостью менее 2 млн.руб.');
while not eof(f) do
begin
read (F,Z);
if z.price < 2000 then
begin
writeln (z.name);
was:=true
end
end;
if was=false then
writeln ('Не найдены');
close(f)
end.
Упражнения:
1. Дан файл f, компоненты которого являются целыми числами. Найти наибольший и наименьший из компонентов файла.
2. Дан файл f, компоненты которого являются целыми числами. Найти количество четных чисел и количество квадратов нечетных чисел среди компонентов файла.
3. Даны символьные файлы f1 и f2.Поменять местами содержимое файлов, не используя стандартных процедур.
4. Дан файл f, компоненты которого являются действительными числами. Найти сумму и произведение компонентов файла, а также значение последнего элемента.
5. Дан файл f, компоненты которого являются символами. Получить копию файла в файле g, не используя стандартных процедур.
6. Дан файл f, компоненты которого являются целыми числами. Записать в файл g все четные числа файла f, а в файл n-все нечетные.
7. Дан файл f, компоненты которого являются символами. Записать в файл g компоненты файла f в обратном порядке.
8. Дан файл f, компоненты которого являются целыми числами.. Переписать компоненты файла f в файл g, так чтобы в файле g сначала или отрицательные, затем положительные числа.
9. Даны символьные файлы f и g. Определить, совпадают ли компоненты файла f с компонентами файла g. Если нет, то получить номер первой компоненты, в которой файлы f и g отличаются между собой.
10. Дан символьный файл f. Найти самое длинное слово в файле.
11. Дан текстовый файл f. Получить самую длинную строку файла.
12. Дан текстовый файл f. Записать в перевернутом виде строки файла f в файл g.
13. Дан текстовый файл f и строка s. Получить все строки файла f, содержащие в качестве фрагмента строку s.
14. Дан текстовый файл f. Получить самую короткую строку файла.
15. Дан текстовый файл f. Проверить соответствие числа открывающих и закрывающих скобок.
16. Даны текстовые файлы f и g. Определить совпадают ли компоненты файлов.
17. Дан текстовый файл f. Определить сколько строк в файле начинаются с символа 'р'.
18. Дан текстовый файл f. Вывести на печать последнюю из строк длиною 45 символов.
19. Дан текстовый файл f. Исключить пробелы, стоящие в начале его строк. Результат поместить в файл f1.
20. Дан текстовый файл f. Записать в файл g строки, содержащие менее 50 символов.