22-23) Записи
В программах часто возникает необходимость логического объединения данных. Например, база данных предприятия содержит для каждого сотрудника его фамилию, дату рождения, должность, оклад и так далее. Однотипные данные организуются в массивы, а для объединения разнотипных данных предназначен тип "запись". Он вводится с помощью ключевого слова record. Элементы записи называются полями:
type имя_типа = record
описание 1-го поля записи;
описание 2-го поля записи;
...
описание n-го поля записи;
end;
пример:Сведения о товарах на складе хранятся в текстовом файле. Для каждого товара отводится одна строка, в первых 20 позициях которой записано наименование товара, а затем через произвольное количество пробелов его цена и количество единиц. Программа по запросу выдает сведения о товаре или сообщение о том, что товар не найден.
program store;
const Max_n = 100;
type
str20 = string [20];
goods = record
name : str20;
price : real;
number : integer;
end;
var stock : array[1 .. Max_n] of goods;
i, j, len : integer;
name : str20;
found : boolean;
f : text;
begin
assign(f, 'stock.txt'); reset(f);
i := 1;
while not Eof(f) do begin
with stock[i] do readln(f, name, price, number);
inc(i);
if i > Max_n then begin {1}
writeln('Переполнение массива'); exit end;
end;
while true do begin {2}
writeln('Введите наименование'); Readln(name);
len := length(name);
if len = 0 then break; {3}
for j := len + 1 to 20 do name := name + ' '; {4}
found := false;
for j := 1 to i - 1 do begin {5}
if name <> stock[j].name then continue;
with stock[j] do writeln (name:22, price:7:2, number:5);
found := true;
break;
end;
if not found then writeln ('Товар не найден'); {6}
end;
end.
Инициализация записей выполняется в разделе констант, при этом для каждого поля задается его имя, после которого через двоеточие указывается значение:
const g : goods = ( name: 'boots';
price: 200; number: 10 );
Основные положения
- Тип «Запись» - наиболее общий и гибкий тип данных. Переменная этого типа состоит из фиксированного числа компонентов, называемых полями. Поля могут принадлежать к различным типам, возможно, структурированным, кроме файлового.
- Общая форма описания – с определением типа «Запись»
{Тип «Запись»}
type T = record
S1: T1;
S2: T2;
.....
Sn: Tn;
end;
{Переменная типа «Запись»}
var
<имя переменной>:T;
Здесь T - имя определяемого типа,
Si - список имен типа Ti; i=1,2, ... n. - Краткая форма описания переменной
Например:
{Тип - комплексное число}
type
complex=record
re:real; {первое поле - вещественная часть}
im:real; {второе поле - мнимая часть }
end;
{Переменная - комплексное число}
var
z:complex; - Обработка записей
- Для обращения к полям записи используется составное имя - селектор:
<имя переменной>. <имя поля>
Так, если ST - переменная описанного выше типа T, то ST.S1 - первое поле записи, ST.S2 - второе и т.д.
Для описанной выше переменной z - комплексного числа z .re - вещественная часть числа, z .im - мнимая часть.
Селектор используется в выражениях и обрабатывается как обычная переменная. - Для переменных-записей a и b одного типа возможно присваивание:
Необходимо учитывать особенности считывания вводимых полей:
- символов; считываются любые символы, включая eoln и eof ;
- чисел; число ограничивается справа и слева пробелами и/или символами eoln и/или eof ; левые пробелы и символы eoln пропускаются;
- строк (string); строка считывается либо до символов eoln или eof (eoln и eof не считываются), либо до исчерпания указанной в описании длины.
При размещении в одной строке числа и строки string по схеме:
<число><пробел><строка>
правый пробел, ограничивающий число, считывается как первый символ строки (и в интерактивном режиме, при вводе с клавиатуры, и из файла на диске).
Если строка string размещается в отдельной строке файла, правые пробелы воспринимаются по-разному в зависимости от режима ввода:
- при вводе с клавиатуры эти пробелы являются значащими и их число включается в длину строки; таким образом, если количество значащих символов строки меньше объявленной длины, можно дополнить строку до объявленной длины пробелами;
- при вводе из дискового файла правые пробелы игнорируются; таким образом, реальная длина строки равна количеству значащих символов и просто дополнить ее пробелами до объявленной длины нельзя. Если это сделать все же необходимо, то в строке файла следует набрать необходимое число пробелов, а затем - любой символ - не пробел. Считается число символов, соответствующее объявлению, где правые символы - пробелы; символ - не пробел не считается, так как выходит за границу строки.
При анализе строк необходимо учитывать, как они записаны в файле и как вводились. В противном случае результаты анализа, особенно сравнения на совпадение, могут оказаться неверными: при одних и тех же значащих символах каждая из сравниваемых строк может содержать пробелы слева, справа или не содержать последних.
Пример обработки записей
Рассматриваются следующие базовые действия при работе с записями:
- создание текстовых файлов для хранения записей;
- обработка текстовых файлов: чтение до конца файла, запись в файл;
- использование массива записей.