Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
программирование на паскале2.doc
Скачиваний:
145
Добавлен:
31.03.2015
Размер:
935.94 Кб
Скачать

3.2. Тип запись

Пока мы рассматривали одну сложную структуру (сложный тип) - массив; одним из основных свойств массива является однотипность его компонент. Многие информационно-логические задачи связаны с обработкой документов, содержащих в себе информация разного типа (числовую, символьную и т. д.) Примеры таких документов: пла­тежные ведомости (фамилии и имена - символьная информация, де­нежные суммы - числовая), карточки больных в поликлинике, библио­течная информация. Как обрабатывать такие данные с помощью строковых типов, показано в §3.1.3; при этом приходится выделять подстроки и переводить некоторые из них в число. Для упрощения программирования алгоритмов обработки такой информации необходимо иметь сложный тип, объединяющий разнотипные компоненты. Таким типом в Паскале является запись.

Запись- это переменная, состоящая из фиксированного числа компонент, вообще говоря, разного типа, причем каждая компонента имеет свое имя. Компоненты записи также называютсяполями записи. Сравним два типа - массив и запись. Компоненты массива имеют одинаковый тип; компоненты записи могут иметь разный тип (хотя могут быть и однотипны). Для обращения к элементу массива надо указать его номер (индекс), при обращении к полю записи указывается его имя.

Описание типа запись:

TYPE имя_типа= RECORD

список_1_имен_полей:тип_1;

список_2_имен_полей:тип_2;

. . .

список_N_имен_полей:тип_N;

END;

Например:

TYPE COMPLEX=RECORD{значения переменныx этого типа - комплексные числа}

Re,Im:REAL {действительная и мнимая части}

END;

DATE = RECORD {для описания дат (число, месяц, год)}

Day : 1..31; {число}

Month = (January, February, March, April, May, June, July, August, September, October, November, December); {месяц}

Year : Integer; {год}

END;

BOOK = RECORD {для описания книг в каталоге библиотеки}

Author,Title,Publisher:String;

{автор, название, издательство}

Year,Volume,Pages:Integer;

{год издания,том,количество страниц}

END;

Память, занимаемая записью, равна сумме объемов памяти полей (если исключить из рассмотрения особенности, связанные с выравниванием). В любом случае для определения размера памяти записи можно использовать функцию sizeof(переменная_или_тип).

Для обращения к полю записинадо указать имя записи, а затем, через точку, имя поля. Например:

VAR C:COMPLEX; D,D1:DATE; B:BOOK;

BEGIN . . . C.Re:=5; D.Month:=January; B.Author:='Smith';

{*} D1.Day:=6; D1.Month:=June; D1.Year:=1799;{*} . . .

Чтобы не писать многократно имя записи при работе с ее полями, используется оператор

WITHИмя_записи DOоператор

Три оператора, ограниченные {*}, эквивалентны оператору:

WITH D1 DO

BEGIN Day:=6; Month:=June; Year:=1799

END;

Пример. Ниже приведена программа для задачи §3.1.3, использующая для отображения строки таблицы тип запись (вместо типа строка)

Program Toys;

TYPE SVED=RECORD {тип "запись", описывающий игрушку}

name:String; {название игрушки}

MinAge, MaxAge,Rub:Real;

{возрастные границы и стоимость}

END;

VAR N:Integer; {число наименований игрушек}

Toy:SVED; {переменная, описывающая игрушку}

max:Real; {максимальная стоимость конструктора для детей до 7 лет}

namemax:String; {название искомого конструктора}

i:Integer; {счетчик наименований игрушек}

BEGIN

Writeln(' Введите число наименований игpушек');

ReadLn(N);

max:=0;

For i:=1 to N Do

With Toy Do {работаем с полями записи Toy}

BEGIN

Writeln('Введите название игpушки с номером', i:2);

Readln(name);

Writeln('Введите мин. и макс. возраст и стоимость');

Readln(Minage,Maxage,Rub); {вводим запись по полям}

If ((Pos('констpуктоp',name)>0) or {содержит ли название}

(Pos('Констpуктоp',name)>0)) and {слово "конструктор" }

(MaxAge<=7) Then

If Rub>max Then

BEGIN

max:=Rub;

namemax:=name

END;

END;

If max=0 Then

WriteLn(' Констpуктоpов для детей до семи лет нет')

Else

BEGIN

WriteLn('Cамый доpогой констpуктоp для детей до семи лет');

WriteLn(namemax);

WriteLn('стоит ', max:6:0, ' pублей')

END;

END.

Замечания:

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

  2. Недостатки программы, отмеченные в §3.1.3, имеют место и для этой программы. Они устраняются использованием файлов.