пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

pogromirovanie:
» sooqa
Уася:
» History motherfuckers

Понятие структуры данных запись. Область ее использования. Иерархические записи, массивы записи, оператор присоединения. (Пример программ с использованием записи).

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 );

Основные положения

  1. Тип «Запись» - наиболее общий и гибкий тип данных. Переменная этого типа состоит из фиксированного числа компонентов, называемых полями. Поля могут принадлежать к различным типам, возможно, структурированным, кроме файлового.
  2. Общая форма описания – с определением типа «Запись»
    {Тип «Запись»}
    type T = record
    S1: T1;
    S2: T2;
    .....
    Sn: Tn;
    end;
    {Переменная типа «Запись»}
    var
    <имя переменной>:T;
    Здесь T - имя определяемого типа,
    Si - список имен типа Ti; i=1,2, ... n.
  3. Краткая форма описания переменной
    Например:
    {Тип - комплексное число}
    type
    complex=record
    re:real; {первое поле - вещественная часть}
    im:real; {второе поле - мнимая часть }
    end;
    {Переменная - комплексное число}
    var
    z:complex;
  4. Обработка записей
  5. Для обращения к полям записи используется составное имя - селектор:
    <имя переменной>. <имя поля>
    Так, если ST - переменная описанного выше типа T, то ST.S1 - первое поле записи, ST.S2 - второе и т.д.
    Для описанной выше переменной z - комплексного числа z .re - вещественная часть числа, z .im - мнимая часть.
    Селектор используется в выражениях и обрабатывается как обычная переменная.
  6. Для переменных-записей a и b одного типа возможно присваивание: 

 

Необходимо учитывать особенности считывания вводимых полей:

  1. символов; считываются любые символы, включая eoln и eof ;
  2. чисел; число ограничивается справа и слева пробелами и/или символами eoln и/или eof ; левые пробелы и символы eoln пропускаются;
  3. строк (string); строка считывается либо до символов eoln или eof (eoln и eof не считываются), либо до исчерпания указанной в описании длины.

При размещении в одной строке числа и строки string по схеме:

<число><пробел><строка>

правый пробел, ограничивающий число, считывается как первый символ строки (и в интерактивном режиме, при вводе с клавиатуры, и из файла на диске).
Если строка string размещается в отдельной строке файла, правые пробелы воспринимаются по-разному в зависимости от режима ввода:

  1. при вводе с клавиатуры эти пробелы являются значащими и их число включается в длину строки; таким образом, если количество значащих символов строки меньше объявленной длины, можно дополнить строку до объявленной длины пробелами;
  2. при вводе из дискового файла правые пробелы игнорируются; таким образом, реальная длина строки равна количеству значащих символов и просто дополнить ее пробелами до объявленной длины нельзя. Если это сделать все же необходимо, то в строке файла следует набрать необходимое число пробелов, а затем - любой символ - не пробел. Считается число символов, соответствующее объявлению, где правые символы - пробелы; символ - не пробел не считается, так как выходит за границу строки.

При анализе строк необходимо учитывать, как они записаны в файле и как вводились. В противном случае результаты анализа, особенно сравнения на совпадение, могут оказаться неверными: при одних и тех же значащих символах каждая из сравниваемых строк может содержать пробелы слева, справа или не содержать последних.

 

Пример обработки записей
Рассматриваются следующие базовые действия при работе с записями:

  1. создание текстовых файлов для хранения записей;
  2. обработка текстовых файлов: чтение до конца файла, запись в файл;
  3. использование массива записей.

27.01.2014; 07:09
хиты: 736
рейтинг:0
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь