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

Учебное пособие 1601

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

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

TYPE < ИМЯ ТИПА>= RECORD <список полей> END;

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

RECOR и 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 может выглядеть следующим образом

VarClerk: Employee;

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

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

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))/(s qr(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 –зарезервированные(обязательные учебные) слова(множество –из);

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

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

Type

DigitSet = SET OF 0…9;

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, 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

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

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

[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‘]

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

принадлежит второму:

[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‘]

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

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

[1,3] * [2,4] равно [ ] [‗A‘, ‗C‘, ‗F‘] * [‗B‘, ‗C‘, [‗A‘, ‗C‘, ‗F‘] * [‗A‘, ‗C‘,

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

4)Проверка эквивалентности (=) – содержат ли два множества одинаковый набор элементов;

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

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

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

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

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

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

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

[ I ] <> [ 1 ] равно TRUE (истина)

6)Проверка вхождения ( ); возвращает 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

8)Проверка принадлежности (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. Элементы данных, которым предназначено стать членами множества, должны вводиться индивидуально и вставляться ( с помощью оператора объединения) в изначально пустое множество.

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