1611678431-0e68e83522cb9d960ac896aa5d90854d (826635), страница 8
Текст из файла (страница 8)
Соответственно, сравнение двух массивов влогических выражениях типа «равно — не равно» производится сравнением адресов. Примерприсвоения одного массива другому:program UsingDynamicArrays2;varА, В: array of integer;{Описание двух переменных —динамических массивов целочисленныхэлементов}beginSetLength(A, 5);А[0] := 14;В := А;В[0] := 2;{ Установка размера массива А(5 элементов ) }{Присвоение значения 14 нулевомуэлементу массива А}{Присвоение массива А массиву В, теперьпеременные А и В указывают на один итот же массив}{Присвоение нулевому элементу массива Взначения 2, теперь нулевой элементмассива А также имеет значение 2}end.Отметим существенное отличие в работе со строками и динамическими массивами, имеющимиодинаковое внутреннее представление на основе указателей, но разные методы работы.
Дверазные строки, состоящие из одинакового набора символов, считаются равными, а два разныхмассива, содержащие одинаковые элементы, не равны.3. Гибкие массивы21. Записи в языке Паскаль, их представление на машинном уровне, упаковка и выравнивание,записи с вариантамиЗаписи в языке PascalЗапись —структурированныйтипданных.Записиявляютсянеоднородными неупорядоченными структурами с прямым доступом ккомпонентам. Компоненты записи называют полями записи.Обычно запись содержит совокупность разнотипных атрибутов,относящихся к одному объекту.Например, информация о рекордах по бегу у мужчин для открытыхстадионов может содержать следующие атрибутырекордсменстранастатус соревнований (Олимпиада, чемпионат мира)длина дистанциигод рекордавремяСтруктурная диаграмма для записиЗапись может быть объявлена в разделе type:идентификатор типа = Recordполе1: тип;поле2: тип;…полеN: типend;Например,type beg = recordfam: 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 = recordfam: string[25];srtana: string[20];status: boolean; {Олимпиада - true; чемпионат мира - false}dlina: longint;god: 1900..2009;vr: record min: longint;sec: realendend;Var a: beg1;Поля такой записи, находящиеся на третьем уровне, идентифицируютсятройным составным именем.
Например,a.vr.mina.vr.secВ программе могут использоваться массивы записей.Любая обработка записей, в том числе ввод и вывод, производитсяпоэлементно.Например,var b: array[1..200] of beg1;...write('Число рекордсменов? '); readln(n);for i:=1 to n dowith b[i] dobeginwrite('Фамилия спортсмена? '); 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 = recordfam: 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 байт}endend;Всего получаем: 26+21+1+4+2+4+6=65 байтМассив, описанный выше, занимает 65 байт × 200 элементов = 13000байт оперативной памяти.Записи с вариантамиПри определении типа записи в нее можно включать вариантную часть.Это означает, что разные переменные, хотя они относятся к одному типу, могутиметь различные структуры.Вариантная часть записи начинается выбором case и следует за общейчастью; после ее окончания в записи не могут появляться никакие другие поля,поэтому case закрывается служебным словом end.Любая запись может иметь только одну вариантную часть, которая должнаразмещаться в конце записи (после фиксированной части).
Однако, внутрикакого-либо варианта, в свою очередь, может присутствовать другая вариантнаячасть, вложенная в первую.При записи варианта (списков элементов) обязательно наличие круглыхскобок, даже если в них ничего не заключается.Структурная диаграмма для записи с вариантамиНапример, пусть необходимо задать информацию о некотором человеке,указав фамилию и год рождения, а также, если это мужчина, то сообщить,военнообязанный ли он и какую имеет специальность, а если это женщина, тоуказать, замужем ли она и сколько имеет детей.Type pol=(m,w);people=recordfam:string[20];godro:1900..2007;case mw:pol ofm: ( 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=recordfam: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;beginwrite('Количество деталей? ');readln(n);for i:=0 to n-1 doWith a[i] dobegin write('Информация об ', i, ' детали: ');readln(a);readln(kol);readln(st);end;max := 0;for i:= 1 to n-1 doif a[max].kol*a[max].st < a[i].kol*a[i].st then max:=i;writeln('Искомая деталь: ',a[max].a, ' стоимостью ',количестве ', a[max].kol);end.a[max].st,'в22. Множества в языке Паскаль, их представление на машинном уровнеМножества в языке PascalМножество — это структурированный тип данных, представляющийсобой набор взаимосвязанных по какому-либо признаку или группе признаковобъектов, которые можно рассматривать как единое целое.
Каждый объект вмножестве называется элементом множества.Все элементы множества должны принадлежать одному из порядковыхтипов, содержащему не более 256 значений. Этот тип называется базовымтипом множества. Базовый тип задается диапазоном или перечислением.Область значений типа множество — набор всевозможных подмножеств,составленных из элементов базового типа. В выражениях на языке Паскальзначения элементов множества указываются в квадратных скобках: [1,2,3,4],['а',‘b','с'], ['a'..'z'].Если множество не имеет элементов, оно называется пустым иобозначается как []. Количество элементов множества называется егомощностью.Множество может принимать все значения базового типа.
Базовый тип недолжен превышать 256 возможных значений. Поэтому базовым типоммножества могут быть byte, char, boolean и производные от них типы.Множество в памяти хранится как массив битов, в котором каждый битуказывает является ли элемент принадлежащим объявленному множеству илинет. Максимальное число элементов множества 256, а данные типа множествомогут занимать не более 32 байт.Число байтов, выделяемых для данных типа множество, вычисляется поформуле:ByteSize = (max div 8) - (min div 8) + 1,где max и min — верхняя и нижняя границы базового типа данного множества.Номер байта для конкретного элемента Е вычисляется по формуле:ByteNumber = (E div 8) - (min div 8),номер бита внутри этого байта по формуле:BitNumber = E mod 8Не имеет значения порядок записи элементов множества внутриконструктора.