Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по информатике все.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
986.62 Кб
Скачать

Вложенные записи

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

Объявим соответствующую структуру данных:

type     Kod1 = record         Bukva: char;         Nomer: integer;     end;     KartaR = record         Kod: Kod1;         Avtor: record             Fio: record                 Fam, Im, Ot: string;             end;             GodR: integer;         end;     end; var     Kr1 : KartaR;

Переменная Kr1 является вложенной записью, т.к. в типе записи KartaR объявлен тип Avtor, являющийся типом записи. Как видно из примера, можно заранее объявить ти п записи (Kod1), а потом использовать его в объявлении поля или указать тип записи непосредс твенно при описании поля (Fio). Теперь можно обратиться к отдельным полям записи Kr1, задавая их полные имена:

Kr1.Avtor.Fio.Fam := 'Зуев'; Kr1.Avtor.GodR := 1950; Kr1.Kod.Bukva := 'П';

Для упрощения доступа к отдельным полям записи используется оператор With <список имен> do <оператор>. Если объявлена переменная

var Uravn: record A,B,C: real end;,

то вместо операторов присваивания вида Uravn.A := -2.5; Uravn.B := 37.2; Uravn.C := 0.7; можно написать, используя оператор With:

with Uravn do begin     A := -2.5; B := 37.2; C := 0.7; end;

Оператор With присоединяет префикс Uravn к именам полей A, B, C. Для вложенной записи Kr1;

with Kr1,Avtor,Fio do begin     Fam := 'Иванов';     Im := 'Виктор';     Ot := 'Иванович'; end;

Следует отметить, что кроме удобства записи оператор With позволяет компилятору оптимизировать время доступа к полям, указанным в области действия оператора.

Массивы записей

Тип записи может быть использован при объявлении компонентов массива. Например, используя тип записи Student, можно объявить массив Gruppa:

type     Student = record         Fam: string;         Ball: array[1..4] of 2..5;     end; var     Gruppa: array [1..30] of Student;

Каждый элемент этого массива представляет собой запись, содержащую фамилию студента и его 4 оценки. Для занесения в массив отличной оценки за первый экзамен второму студенту группы можно использовать оператор:

Gruppa[2].Ball[1] := 5;

а для I-того студента за третий экзамен хорошей оценки: Gruppa[I].Ball[3] := 4;

Пример обработки массива записей

Рассмотрим задачу обработки массива записей. Запись имеет следующую структуру:

Требуется определить в заданном массиве записей "стул" фамилию директора, выпускающего самые дешевые в среднем стулья. Опишем структуру записи:

type     Izgot = record    {запись "изготовитель"}         Gor, Fab, Fam : string;     end;     Stul = record         Mater: string;    {запись "стул"}         H : real;         Cena : integer;         Iz : Izgot;     end;     MasZap = array[1..100] of Stul;

Исходные данные:

N - число записей в массиве;

Mas[1..N] - массив записей "стул" типа MasZap

Результат:

фамилия директора

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

1. Формирование массивов:

MasFab - содержит все различные фабрики-изготовители; KolSt - содержит число видов стульев, выпускаемых каждой фабрикой; SumCen - содержит сумму цен всех видов стульев, выпускаемых на соответствующей фабрике.

2. Вычисление номера фабрики (в массиве MasFab), выпускающей стулья с минимальной средней ценой. После этого можно напечатать фамилию директора этой фабрики.

Покажем, как можно, осуществив систематическую декомпозицию, свести поставленную задачу к комбинации простых типовых алгоритмов.

Алгоритм Обработка_массива_записей Начало

обнуление счетчика числа различных фабрик цикл перебора всех записей

поиск фабрики в массиве MasFab если фабрика-изготовитель текущего стула еще не встречалась ранее то

- запоминание новой записи "изготовитель" в массиве MasFab; - инициализация счетчика числа видов стульев в массиве KolSt; - инициализация суммарной цены стульев в массиве SumCen;

иначе

- увеличение счетчика числа видов стульев в массиве KolSt для найденной фабрики; - увеличение суммарной цены стульев в массиве SumCen для найденной фабрики;

все

кц Min = большое положительное число цикл перебора средних цен стульев всех различных фабрик

если средняя цена < Min то

- запоминание номера соответствующей фабрики; - запоминание в Min средней цены;

все

кц вывод (фамилии директора фабрики с найденным номером)

Конец

Решение использует следующие типовые алгоритмы:

- вычисление нового массива, число элементов которого заранее неизвестно (использование счетчика); - вычисление массива, содержащего все различные элементы ("отсутствие/присутствие"); - вычисление суммы элементов массива; - поиск номера минимального элемента в массиве.

ФАЙЛЫ