Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование(лекции).pdf
Скачиваний:
183
Добавлен:
14.02.2015
Размер:
1.89 Mб
Скачать

П.П.Кудрявцев. Курс лекций по дисциплине: "Информатика и программирование"

begin

x := a[j-1]; a[j-1] := a[j]; a[j] := x;

k := j; end;

end;

L := k + 1;

for j := L to R do begin

if a[j-1] > a[j] then begin

x := a[j-1]; a[j-1] := a[j]; a[j] := x;

k := j; end;

end;

R := k-1; until L > R

end;

Лекция 11. Записи

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

Структура объявления типа записи такова: type

<имя типа> = record

<имя поля 1> : <тип поля 1>; <имя поля 2> : <тип поля 2>;

...

<имя поля N> : <тип поля N>; end;

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

Описание переменных-записей, или, как их принято называть, экземпляров записей, может осуществляется и без предварительного объявления типа:

var

48

Лекция 11. Записи

<имя переменной> : record <имя поля 1> : <тип поля 1>; <имя поля 2> : <тип поля 2>;

...

<имя поля N> : <тип поля N>; end;

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

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

<имя переменной>.<имя поля>

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

Опера тор присоединения with

Часто возникает необходимость обращаться к одному и тому же полю записи, или к нескольким полям одной и той же записи, несколько раз на небольшом отрезке текста программы. Чтобы упростить доступ к полям записи используется оператор присоединения

with:

with <переменная> do <оператор>;

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

Записи с вариан тными полями

Записи одного и того же типа не обязательно должны содержать те же самые компоненты. Паскаль разрешает использовать записи с вариантными полями. Такие записи разделяются на две части. Первая часть называется общей частью, а вторая часть носит название

вариантной части. case <селектор> of

<константа 1> : (<список полей 1>); <константа 2> : (<список полей 2>);

...

<константа N> : (<список полей N>);

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

49

П.П.Кудрявцев. Курс лекций по дисциплине: "Информатика и программирование"

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

Селектор в предложении case ... of фактически игнорируется компилятором. Единственное требование, предъявляемое к нему, чтобы селектор определял некоторый стандартный или предварительно объявленный порядковый тип. Причем сам этот тип никак не влияет ни на количество следующих ниже вариантных полей, ни даже на характер констант выбора.

Пример использования записей

Например, анкетные сведения о студенте вуза могут быть представлены в виде информационной структуры (Рисунок 1).

Рисунок 1 - Двухуровневое дерево анкеты студента

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

type

Anketa = record

FIO : string[50]; Pol : char;

Dat : string[16]; Adres : string[50] ; Curs : 1..5;

Grup : 1..10; Stip : real

end; var

Student : Anketa;

50

Лекция 11. Записи

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

Student.Fio;

Student.Dat;

Если, например, требуется полю курс присвоить значение 3, то это делается так:

Student.Curs := 3;

Поля записи могут иметь любой тип, в частности сами могут быть записями. Такая возможность используется в том случае, когда требуется представить многоуровневое дерево (более 2 уровней).

Например, те же сведения о студентах можно отобразить трехуровневым деревом.

Рисунок 2 - Трехуровневое дерево анкеты студента

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

type

Anketa = record FIO: string[50]; Pol: char;

Dat: record; God: integer;

Mes: string[10]; Den: 1..31

end;

Adres: record

Gorod: string[20]; UlDomKv: string[30]

end;

Curs: 1..5;

51

П.П.Кудрявцев. Курс лекций по дисциплине: "Информатика и программирование"

Grup: 1..10; Stip: real

end;

var

Student: Anketa;

Поля такой записи, находящиеся на третьем уровне, идентифицируются тройным составным именем.

Например:

Student.Dat.God;

Student.Adres.Gorod;

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

var

Student: Array[1..500] of Anketa;

В таком случае, например, год рождения пятого в списке студента хранится в переменной

Student[5].Dat.God.

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

for I := 1 tо 500 do with Student[I] do begin

write('Ф.И.О.:');

readln(FIO); write('Пол (м/ж):'); readln(Pol);

write("Дата рождения:'); readln(Dat); write('Адрес:'); readln(Adres); write('Курс:'); readln(Curs); write('Группа:'); readln(Grup); write('Стипендия (руб.):'); readln(Stip)

end;

В этом примере использован оператор присоединения.

52