Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2361

.pdf
Скачиваний:
1
Добавлен:
15.11.2022
Размер:
1.46 Mб
Скачать

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

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

В тоже время, следует иметь в виду, что если элементы (поля) записи одного и того же типа, то можно использовать для их хранения и массивы.

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

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

TYPE < имя типа>= RECORD <список полей> END; Здесь <имя типа> - правильный идентификатор;

RECORD и END – зарезервированные (служебные) обязательные слова (запись и конец);

<список полей> - список полей – перечисления (через запятую) полей одного и того же типа с указанием их типа. При этом список каждого списка полей (раздел записи) должен заканчиваться точкой с запятой. Перед типом полей (поля) ставится двоеточие (после списка идет идентификатор – полей). Например, пусть в отделе кадров одной из фирм информация о работниках имеется в следующем виде:

идентификационный номер:

 

1234 ------------------------

ID

 

Имя : Иванов Иван Иванович ---------

Name

Пол: М ------------------------------------

Gender

 

Число иждивенцев: 2 -------------------

NumDepend

Почасовая справка:6 --------------------

Rate

 

Зарплата за неделю: 240 ----------------

Totwages

 

Тогда фрагмент описателей может выглядеть следующим образом

Const

String Length = 20; Type

ID Range =1111...9999;

String Type = String String Length];

Employce = RECORD ID: IDRanger;

Name: StringType;

Gender: Char;

NumDepend: Integer;

Rate, TotWages: Real; END;

Здесь информация будет сохраняться в записи шестью элементами данных ( полей). Для содержания информации из отдела кадров использован тип Emplogee. Этот тип включает два целочисленных значений (ID-IDRange и NumDepend),поле-

строку (Name-Stringtupe), поле (Genger) типа Char и два поля

(Rate,TotWager) для вещественных значений.

Как видно из данного фрагмента описаний программы кроме типа записиEmployee имеются и простые типы

данных(IDRangeтип диапозон и SnringTupe-

структуированныйстроковый тип).

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

Var

Clerk: Employec;

В этом случае переменнаязапись Clerk имеет структуру, которая задана в описатели типазапись Employec. Таким образом, выделенная для содержания этой переменной

память включает пространство для шести значений

Clerk. ID

1234

Clerk. Name

Иванов Иван Иванович

Clerk. Gender

M

Clerk. NumDepend

2

Clerk. Rate

6.00

Clerk. Tot Wager

240.00

Рис.4.2.10. Распределение памяти для переменной

Clerk.

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

поля, например:

Clerk. ID или Clerk. Rate и т.д.

Для того, чтобы в соответствующие поля на рисунке 4 ( в прямоугольникепамять) занести исходные данные необходимо в операторном разделе программы ( в скобках Begin-end) поместить следующие операторы присваивания

Clerk. ID:=1234;

Clerk. Name:= Иванов Иван Иванович ; Clerk. Gender:= M ;

Clerk. NumDepend:=2;

Clerk. Rate:=6.00;

Clerk. Tot Wager:=0.0; Clerk.Tot Wager:= Clerk. Tot Wager+40.0*

Clerk.Rate;

После того, как исходные данные присвоены полям записи этими полями можно манипулировать как и любыми другими переменными. Например, последний оператор присваивания вычисляет новую зарплату служащего, добавляя зарплату текущей недели к его предыдущей зарплате (0.0. в данном случае), число 40 – количество отработанных за неделю часов. Вычисленный результат (в данном случае 240) заносится в поле clerk. TotWages.

Рассмотрим простейший пример составления программы с использованием записи.

Пусть требуется составить программу для вычисления суммы, разности, произведения, частного двух комплексных чисел: program sap;

type complex=record re,im:integer end;

var x,y:complex; begin

x.re:=3;

x.im:=7;

y.re:=6;

y.im:=14;

writeln('x=',x.re,x.im,'y=',y.re,y.im);

writeln('sum=',x.re+y.re,x.im+y.im); writeln('sum=',x.re-y.re,x.im-y.im); writeln('mult=',x.re*y.re-x.im*y.im,x.re*y.im+x.im*y.re); writeln('div=',(x.re*y.re+x.im*y.im)/(sqr(y.re)+sqr(y.im), (y.re*x im.- x.re+y.im) / (sqr(y.re)+sqr(y.im));

end.

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

Множества.

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

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

фигурные скобки, например{1,3,5,7,9}-это множество нечетных цифр от 1 до 9.

Итак, множества – это структуированные данные, содержащие перечни целочисленных или символьных

значений, либо значений перечислимого типа. Множество похоже на массив в том отношении, что оно так же содержит набор простых элементов. Но в отличии от массива, элементы множества не упорядочены.

В отличии от математической формы записи, на языке Pascal все элементы множества заключаются в квадратные

скобки, например: [1,3,5,7,9]. Поскольку элементы множества могут быть не

упорядочены, то [9,7,5,3,1] и [1,3,5,7,9]- это эквивалентные множества.

Количество элементов, входящих в множество, может меняться от 0 до 256. При этом, множество не содержащее элементов, называется пустым.

Поэтому, другим отличием множества от массива и записи является непостоянство количества элементов в массиве.

Следует иметь в виду, что если все элементы одного множества входят такие и в другое, то говорят о включении

первого множества во второе.

В общем виде описание типа множества может иметь вид:

Type

<имя типа>= SET OF <баз.тип>;

здесь <имя типа>- правильный идентификатор (имя множество);

SET и OF –зарезервированные(обязательные служебные ) слова(множество –из);

<баз. тип>- базовый тип элементов множества, в качестве которого, может использоваться любой порядковый

тип, кроме WORD, INTEGER и LONGINT.

Тип – множество или переменнуюмножество можно объявить так же, как объявляются прочие (предыдущие)

структуированные типы и принадлежащие к ним элементы, т.е. сначала объявляется типмножества (Type), а затем переменная этого типа (Var), например:

Type

DigitSet = SET OF 09;

Var

Odds, Evens, Middle, Mixed: DigitSet;

Здесь объявлен множественный тип DigitSet и четыре переменных этого типа: Odds, Evens, Middle, Mixed. Каждая

переменная типа DigitSet может содержать от 0 до 10 элементов, выбранных из диапазона целочисленных значений 0…9. Хотя память и выделяется сразу для четырѐх множеств, их содержимое первоначально не определено (память пуста). Для того, чтобы отведенную память заполнить (определить значения этого множества) каким-либо множеством (исходными данными) необходимо использовать операторы присваивания (в операторном разделе программы), например:

Odds : = [1,3,5,7,9];

Evens : = [0,2,4,6,8];

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

После выполнения этих операторов, множество Odds содержит набор нечетных цифр из диапазона от 0 до 9, а

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

С другой стороны, множество-литерал [‗0‘..‘9‘, ‗+‘, ‗-‗, ‗E‘, ‗.‘] представляет собой набор символов, встречающихся в вещественных числах. Данное множество содержит 14 элементов. В данном случае десять символов – цифр удобнее представить в виде диапазона 0..9 (TurboPascal это разрешает), чем перечислять каждый из этих символов отдельно.

Список элементов, обязательно разделенных запятыми и в обязательных квадратных скобках, присвоенных

арифметическому оператору присваивания, иногда называется

конструктором множества.

Стоит, также, отметить, что множество можно создать со значениями выбранными из ранее объявленного

перечисленного типа данных, например:

Type

Cars = (Dodge, Ford, Lincoln, Cadillak, Fiesta, Pontiac, Corvette, Blick, Chevrolet, Mercury, Mustang);

CarSet = SET, OF Cars; Var

Avis, Hertz, Merger: CarSet;

Нижеследующие операторы присваивают переменным – множеством некоторые значения:

Avis: = [Dodge, Lincoln, Fiesta];

Hertt: = [Dodge..Cadilac, Mercnry];

Merger: = [Dodge..Mustang];

Здесь множества Avis включает три элемента, которые здесь же перечислены. Множество Hertz включает пять элементов.

Наконец, множество Merger представляет универсальное множество для типа CarSet. Кроме того, справа от оператора присваивания, помимо литера, может так же стоять переменная – множество (операция переприсваивания), если обе переменные имеют совместные базовые типы. Например, следующий оператор присваивания изменяет значение переменной – множества Merger:

Merger : = Hertz;

Над множеством можно производить следующие операции: арифметические и логические:

7) Объединение множеств (+), результат содержит элемента первого множества, дополненные недостаточными элементами из второго множества:

[1,3,4] + [1,2,4] равно [1,2,3,4]

[1,3] + [2,4] равно [1,2,3,4]

[‗A‘, ‗C‘, ‗F‘] + [‗B‘, ‗C‘, ‗D‘, ‗F‘] равно [‗A‘, ‗B‘, ‗C‘, ‗D‘, ‗F‘]

[‗A‘, ‗C‘, ‗F‘] + [‗A‘, ‗C‘, ‗D‘, ‗F‘] равно [‗A‘, ‗C‘, ‗D‘, ‗F‘]

8) Разность множеств (-), результат содержит элементы из первого множества, которые не принадлежит второму:

[1,3,4] - [1,2,4] равно [3] [1,3] - [2,4] равно [1,3]

[‗A‘, ‗C‘, ‗F‘] - [‗B‘, ‗C‘, ‗D‘, ‗F‘] равно [‗A‘]

[‗A‘, ‗C‘, ‗D‘, ‗F‘] - [‗A‘, ‗C‘, ‗F‘] равно [‗D‘]

9) Пересечение множеств (*); результат содержит элементы, общие для обоих множеств:

[1,3,4] * [1,2,4] равно [1,4] [1,3] * [2,4] равно [ ]

[‗A‘, ‗C‘, ‗F‘] * [‗B‘, ‗C‘, ‗D‘, ‗F‘] равно [‗C‘, ‗F‘] [‗A‘, ‗C‘, ‗F‘] * [‗A‘, ‗C‘, ‗D‘, ‗F‘] равно [‗A‘, ‗C‘, ‗F‘]

10) Проверка эквивалентности (=) – содержат ли два множества одинаковый набор элементов; возвращает TRUE (истина), если оба множества эквивалентны:

[1,3] = [1,3] равно TRUE (истина)

[1,3] = [2,4] равно FALSE (ложь)

[1,3] = [3,1] равно TRUE (истина)

[+] = [1] равно FALSE

11)Проверка неэквивалентности (≠) – возвращает TRUE, если оба множества не эквиваленты:

[1,3] <> [1,3] равно FALSE (ложь) [1,3] <> [2,4] равно TRUE (истина) [1,3] <> [3,1] равно FALSE (ложь) [+] <> [ 1 ] равно TRUE (истина)

12)Проверка вхождения ( ); возвращает TRUE, если первое множество включено во второе:

[1,3]

[1,2,3,4] равно TRUE

[1,3]

[1,3] равно TRUE

[1,2,3,4]

[1,3] равно FALSE

[1,3]

[

] равно FALSE

[ ]

[1,3] равно TRUE

[‗A‘, ‗B‘]

[‗A‘] равно FALSE

Пусто множество [ ] является подмножеством любого множества.

7) Проверка вхождения ( ); возвращает TRUE, если второе множество включено в первое:

[1,3] [1,2,3,4] равно FALSE [1,3] [1,3] равно TRUE [1,2,3,4] [1,3] равно TRUE [1,3] [ ] равно TRUE

[ ] [1,3] равно FALSE

[‗A‘, ‗B‘] [‗B‘] равно TRUE

9)Проверка принадлежности (IN); в этой бинарной операции первый элемент – выражение, а второй – множество одного и того же типа; возвращает телу,

если выражение имеет значение, принадлежащее множеству:

3 in

[1..9] равно TRUE;

2*2

in [ ‗1‘, ‗2‘, ‗3‘ ] равно FALSE;

Дополнительно к этим операциям имеются еще две дополнительные процедуры:

9) INCLUDE – включает новый элемент во множество. Обращение к процедуре:

INCLUDE (S, I);

Здесь S – множество, состоящее из элементов базового типа

Tset Base

I – элемент типа TsetBase, который необходимо включить во множество S.

10) EXCLUDE – исключает элемент из множества.

Обращение: EXCLUDE (S, I)

Здесь параметры обращения S и I такие же, как у процедуры INCLUDE ( только I исключается из S).

Отметим, что подобно мысли другим данным, принадлежащим структуированным типам, множество не может использоваться в качестве параметра стандартных процедур READ и WRITE. Элементы данных, которым предназначено стать членами множества, должны

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

Procedure PrintSet (Letters: Letterset); Var

NextLetter: ‗A‖..‘Z‖;

Begin

For NextLetter: = ‗A‘ to ‗Z‘ do

If NextLetter in Letters then Write(NextLetters)

End;

Таким образом, все множество выводится по элементно в цикле.

Данная процедура PRINNTSET выводит прописные буквы из множества, которое представлено параметром Letters. Например, если вызвать эту процедуру с множеством [‗A‘, ‗C‘, ‗Z‘] в качестве параметра, вывод с помощью этой процедуры будет: A, C, Z.

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

Пример 1. Пусть задано три различных множества:Vowels, Uppercase и Lowetcase. Необходимо определить является ли введенное для переменной NextChar значение (символ) – гласной, строчной или прописной буквой.

Вариант программы следующий

program mnog;

type CharSet=Set of Char;

var Vowels,Uppercase,LowerCase:CharSet; NextChar:Char;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]