Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Записи в языке Pascal
Запись — структурированный тип данных. Записи являются неоднородными неупорядоченными структурами с прямым доступом к компонентам. Компоненты записи называют полями записи. Обычно запись содержит совокупность разнотипных атрибутов, относящихся к одному объекту. Например, информация о рекордах по бегу у мужчин для открытых стадионов может содержать следующие атрибуты рекордсмен страна статус соревнований (Олимпиада, чемпионат мира) длина дистанции год рекорда время Структурная диаграмма для записи Запись может быть объявлена в разделе type: идентификатор типа = Record поле1: тип; поле2: тип; … полеN: тип end; Например, type beg = record fam: string[25]; srtana: string[20]; status: boolean; {Олимпиада - true; чемпионат мира - false} dlina: longint; god: 1900..2009; vr: string[15]; end;
Var a: beg; К каждому элементу записи можно обратиться, используя составное имя, которое имеет следующую структуру: < имя переменной>.< имя поля> Например, a.fam; a.dlina и т.п. Если, например, требуется полю " status" присвоить значение «true», то это делается так: a.status: = true; Поля записи могут иметь любой тип, кроме файла, в частности, сами могут быть записями. Например, type beg1 = record fam: string[25]; srtana: string[20]; status: boolean; {Олимпиада - true; чемпионат мира - false} dlina: longint; god: 1900..2009; vr: record min: longint; sec: real end end;
Var a: beg1; Поля такой записи, находящиеся на третьем уровне, идентифицируются тройным составным именем. Например, a.vr.min a.vr.sec В программе могут использоваться массивы записей. Любая обработка записей, в том числе ввод и вывод, производится поэлементно. Например, var b: array[1..200] of beg1;
... write('Число рекордсменов? '); readln(n); for i: =1 to n do with b[i] do begin write('Фамилия спортсмена? '); readln(fam); write('Гражданин какой страны спортсмен? '); readln(strana); write('Статус соревнования? '); readln(status); write('Длина дистанции? '); readln(dlina); write('Год проведения соревнования? '); readln(god); write('Время, за которое спортсмен пробежал дистанцию (мин, сек)? '); readln(vr.min, vr.sec); end; ... В примере был использован оператор присоединения, который имеет следующий вид: with < переменная типа запись> do < оператор>; Он позволяет, один раз указав имя переменной типа " запись" после слова with, работать в пределах одного оператора (простого или составного) с именами полей как с обычными переменными, т.е. не писать громоздких составных имен. Объём памяти, занимаемый записью, определяется суммарным объёмом, занимаемым её полями: type beg1 = record fam: string[25]; {26 байт} srtana: string[20]; {21 байт} status: boolean; {1 байт} dlina: longint; {4 байта} god: 1900..2009; {2 байта} vr: record min: longint; {4 байта} sec: real {6 байт} end end; Всего получаем: 26+21+1+4+2+4+6=65 байт Массив, описанный выше, занимает 65 байт × 200 элементов = 13000 байт оперативной памяти. Записи с вариантами При определении типа записи в нее можно включать вариантную часть. Это означает, что разные переменные, хотя они относятся к одному типу, могут иметь различные структуры. Вариантная часть записи начинается выбором case и следует за общей частью; после ее окончания в записи не могут появляться никакие другие поля, поэтому case закрывается служебным словом end. Любая запись может иметь только одну вариантную часть, которая должна размещаться в конце записи (после фиксированной части). Однако, внутри какого-либо варианта, в свою очередь, может присутствовать другая вариантная часть, вложенная в первую. При записи варианта (списков элементов) обязательно наличие круглых скобок, даже если в них ничего не заключается. Структурная диаграмма для записи с вариантами Например, пусть необходимо задать информацию о некотором человеке, указав фамилию и год рождения, а также, если это мужчина, то сообщить, военнообязанный ли он и какую имеет специальность, а если это женщина, то указать, замужем ли она и сколько имеет детей. Type pol=(m, w); people=record fam: string[20]; godro: 1900..2007; case mw: pol of m: (voen: boolean; spec: string[15]); w: (merry: boolean; child: byte) end; var p1, p2: people; Все имена элементов должны быть различными, даже если они встречаются в разных вариантах. К элементам вариантной части можно обращаться так же, как к элементам фиксированной части записи. P1.mw: =m; p1.voen: =true; p2.child: =2; В процессе выполнения программы в структуру записи включается тот вариант, элементам которого в данный момент было присвоено значение. Как только какому-либо элементу другого варианта присваивается некоторое значение, в структуру записи включается этот вариант, а элементы предыдущего варианта становятся неопределенными. Данное обстоятельство учитывается и при подсчете объема памяти, отводимого под запись с вариантами. Статические поля учитываются обычным образом, а среди вариативной части отыскивается тот случай, где суммарный объем памяти для полей максимальный. Type pol=(m, w); people=record fam: string[20]; {21} godro: 1900..2007; {2} case mw: pol of {1} m: (voen: boolean; spec: string[15]); {1+16=17} w: (merry: boolean; child: byte) {1+1=2} end;
21 + 2 + 1 + max(17, 2) = 41 (байт)
Рассмотрим пример работы с записями без вариантов. Задача. Сведения о деталях, хранящихся на складе, содержат следующие атрибуты: название, количество, стоимость одной детали. Вывести информацию о детали, суммарная стоимость для которой максимальна. program ex_zap; type detal = record a: string[30]; kol, st: integer; end; var a: array [0..99] of detal; n, i, max: integer; begin write('Количество деталей? '); readln(n); for i: =0 to n-1 do With a[i] do begin write('Информация об ', i, ' детали: '); readln(a); readln(kol); readln(st); end; max: = 0; for i: = 1 to n-1 do if a[max].kol*a[max].st < a[i].kol*a[i].st then max: =i; writeln('Искомая деталь: ', a[max].a, ' стоимостью ', a[max].st, ' в количестве ', a[max].kol); end.
Контрольные вопросы и задания 1. Чем отличается тип " запись" от других структурированных типов? 2. Могут ли поля записи быть одного и того же типа? 3. Как обратиться к отдельному полю записи? 4. Что такое " оператор присоединения"? В каких целях он используется? 5. Что такое " запись с вариантами"? 6. Как определить объем памяти под статическую запись? запись с вариантами? 7. Как заполнить массив записей?
|