В.Г. Абрамов, Н.П. Трифонов, Г.Н. Трифонова - Введение в язык Паскаль (1107618), страница 49
Текст из файла (страница 49)
Оба операнда должны принадлежать одному и томуже множественному типу значений. Для простоты при объяснении множественных операций в паскале в качестве операндов будем использовать множественные константы (множества).Пусть А и В — множества. Тогда объединением двух множеств А и Вназывается множество, состоящее из элементов, входящих хоты бы в одноиз множеств А или В (наглядно это изображено на рис. 11.1,а).Например, если в качестве множества А взягь [1, 2, 3, 4, 5 ] , а в качествемножества В — [2, 5, 6, 7, 8 ] , то объединением этих множеств будет множество [1, 2, 3, 4, 5, 6, 7, 8 ] . В теории множеств эта операция обозначаетсяследующим образом: A U В.
В паскале для обозначения этой операции используется знак + (плюс). Таким образом, предыдущий пример объединения двух множеств на паскале запишется в виде [1, 2, 3, 4, 5] + [2, 5, 6,7, 8 ] , что равно множеству [1, 2, 3, 4, 5, 6, 7, 8 ] .Пересечением двух множеств А и В называется множество, состоящееиз элементов, одновременно входящих и в множество А, и в множество В207(наглядно это изображено на рис.
1 1.1,6). Например, если в качестве множеств Л и В использовать множества, приведенные в предыдущем примере,то их пересечение есть множество [2, 5 ] . В теории множеств эга операцияобозначается следующим образом: А Л В. В паскале для обозначенияоперации пересечения множеств используется знак * (звездочка).Пример пересечения двух множеств, приведенных выше, запишется какаб6Рис. 11.1. Операции над множествами.Разностью двух множеств А и В (в теории множеств эта операция обозначается А \ В) называется множество, состоящее из элементов множества А, пе входящих в множество В. Для обозначения этой операции в паскале используется знак — (минус). Например, если в качестве множеств Аи В взять те же самые множества, что были использованы ранее, то разностьмножеств[1, 2, 3, 4, 5][2, 5, 6, 7, 8] есть множество [1, 3, 4](рис.
11.1, в ) .С использованием множественных операций могут строиться множественные выражения дня получения новых множественных значений.При вычислении значений множественных выражений используется старшинство операций, аналогичное старшинству операций при вычисленииарифметических выражений, а именно: в первую очередь вычисляютсязначения выражений, заключенных в скобки, затем выполняются операции *, после чего выполняются операции + и - в порядке их следованияслева направо. Полный синтаксис множественного выражения может бытьзадан следующим образом:множественное выражение ::=*слагаемое->.*,^слагаемое ::=sмножитель< конструктор множества—переменная(———•^ (множественное выражение(предполагается, чтоздесь (переменная) имеет)-множественныйтип).Примеры множественных выражений:[ 1 . 2 . 5 .
6 , 7 ] * [2..6] + [3, 9] (значение выражения равно [2. 3. 5, 6. 9 ] )( [ 3 . 4 . 5 ] + [1. 3. 6. 7] ) * [5 ..7] - [ 6 ] (значение выражения равно [ 5 , 7 ] )Операции отношения. Наряду с рассмотренными выше операциями,над значениями множественного типа определены и некоторые операцииотношения. Операндами операций отношения над множественными значениями в общем случае являются множественные выражения. Среди операций отношения над значениями множественного типа особое месго занимает специальная операция проверки вхождения элемента в множество,обозначаемая служебным словом in.
В отличие от остальных операций отношения, в которых значения обоих операндов относятся к одному и тому же множественному типу значений, в операции in первый операнд должен принадлежать базовому типу, а второй — множественному типу значений, построенному на основе этого базового типа. Результатом операцийотношения, как обычно, является логическое значение (true или false).Пусть А и Вмножества, принадлежащие одному и тому же множественному типу значений, х — значение соответствующего базового типа.В таблице 11.1 приведены операции отношения над множествами в паскале, соответствующая теоретико-множественная запись этих операций и даноих объяснение.Следует отметить, что применение операций < и > над операндами множественного типа недопустимо.Пусть, например, задано описание переменнойМ: set o-f 1..10и выполнен оператор присваивания М: = [2.
3, 5, 7]. Тогда6 in М равно false[3. 5. 7] < М равно trueМ= [ 1 . 2 , 3 . 7 ] равно false[ ] < М равно true(7 in М) and ([7] < М ) равно trueТаблица 11.1Операции отношения над множествамиЗапись на паскале Математ. записьА=ВА=ВЛ*НАФВЛ« ВАС ВА>ВADВX in Ал: е А14. В.Г. АбрамовЗначениеtrueмножества А и Всовпадаютмножества А и Вне совпадаютвсе элементы множества Апринадлежат множеству Ввсе элементы множества Впринадлежат множеству Аэлемент х входитв множество Аfalseв противномслучаев противномслучаев противномслучаев противномслучаеВ противномслучае209Напомним, что поскольку указанные выше конструкции являютсяотношениями, их необходимо — согласно общему правилу — заключатьв круглые скобки, если они входят в состав более сложных выражений.11.4.
Примеры использования множественного типаСледующий пример иллюстрирует типичное использование множественных типов значений.П р и м е р 11.1. В заданной последовательности литер, состоящей избукв латинского алфавита и оканчивающейся точкой, определить общеечисло вхождений в него букв а, е, с, h.Идея решения этой задачи проста: будем по очереди вводить литерыисходной последовательности и для каждой очередной литеры проверять,является ли она одной из интересующих нас букв. Но как делать проверку?Конечно, можно последовательно сравнивать текущую литеру с каждойиз указанных букв, но в этом случае запись будет громоздкая.
С использованием же константы множественного типа, состоящей из заданных в условии букв, и операции отношения in запись того же условия выглядитзначительно короче и нагляднее. Ниже приведена программа, с помощьюкоторой может быть решена поставленная задача.{Пример 11.1.Баула В.Г.ф-т ВМиК МГЦ30.4.87г.Подсчет общего числа вхождений заданных буквa,e,c,h в заданную последовательность литер,оканчивающуюсяточкой}{Пример работы с множеством}program подсчет (i nput., output) ;varчисбк: integer; литера: char;beginчисбк:=0;read(литера);while литера^'.'dcbegin{анализ очередной введенной литеры!if литера in Ca,e,c,h3 then чисбк:=чисбк+1;read(литера)-;end;{печать общего числа вхождений заданных букв}writeln ( ' 0БЫ.ЕЕ _ЧИСЛ0 _ВХОЖДЕНИЙ _РАВН0чисбк)end .В этом примере показано использование постоянных множественныхзначений.
Следующий пример демонстрирует использование переменныхмножественного типа.П р и м е р 11.2. Найти и напечатать в порядке убывания все простыечисла из диапазона 2. .201.210Для решения этой задачи воспользуемся известным методом, называемым "решето Эратосфена", в следующем его варианте. Введем в употребление два множества: Ч — множество анализируемых чисел, П — множествопростых чисел. Начальное значение Ч — это все числа от 2 до 201, а П —пустое множество:Ч = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11,..., 201]П=[]Берем первое число — 2. Оно простое, поэтому заносим его в П (в результате получим П = [ 2 ] ) , из множества Ч удаляем число 2 и все кратныеему числа (в итоге получим Ч = [3, 5, 7, 9, 11,..., 201]).Теперь берем в множестве Ч наименьшее число — в данном случае это 3.Оно простое и потому добавляем его в множество П (в результате получимП = [2, 3]), а из множества Ч удаляем число 3 и все кратные ему числа(в итоге получим Ч = [5, 7, 11,..., 201]).Далее поступаем аналогичным образом.
Очевидно, что в конце концовиз множества Ч будут удалены все элементы, а в множестве П окажутся всепростые числа. Теперь остается просмотреть множество П и напечатать входящие в него простые числа в порядке убывания.Прежде чем выписать программу на паскале, отметим две детали нашегоалгоритма. Во-первых, как удалить из множества Ч некоторое число к?Это реализуется одним оператором: Ч: = Ч — [к]. Аналогично, добавлениечисла к в множество П реализуется одним оператором П: = П + [к]. Во-вторых, как узнать, что из множества Ч удалены все числа? Очевидно, чтов этом случае множество Ч окажется просто пустым, т.е. достаточно выяснить значение отношения Ч = [ ].
Если оно равно true, то множество Чдействительно пусто, и мы выделили все простые числа из заданного диапазона; в противном случае необходимо продолжить выделение простыхчисел.{Пример 11.2. Павлов Б.М.Ф-т ВМиК МГУ2.5.87г.Печать в обратном порядке простых чиселиз диапазона 2..201}{Использование множественного типа}programпростыечисла(output);constN=201;typeMH04HC=set o-f 2 . . N ;varП,Ч:мночис;p,k:2..N;begin{присваиваниеначальныхзначении}Ч : 1 2 . . N Л ; П:=С '.1:{первоепростоечислодиапазона2..N3р : ~14*211repeat{выбор в Ч наименьшего числа)while not(р in Ч> do р:=р+1;{занесение найденного числа в П}П:=П+СрЗ;{удаление из Ч числа р и всех кратных ему чисел}к: =р;repeat Ч:=Ч-Ск3;к:=к+р untilk>N;until Ч=С 3;{печать простых чисел в обратном порядке}•for k:=N downto 2 doif k in П then write(k);wri telnend.ГЛАВА12ФАЙЛОВЫЕ ТИПЫСущественной особенностью всех рассмотренных до сих пор значенийпроизводных типов является наличие в них конечного, наперед заданногочисла компонент.
Так, в значении регулярного типа это число можно определить, зная количество компонент по каждому измерению, а в значениикомбинированного типа это число определяется количеством и типомполей записи. Таким образом заранее, еще до выполнения программы,по этому описанию можно выделить необходимый объем памяти.машиныдля хранения значений переменных этих типов. Но существует определенный класс задач и определенные ситуации, когда количество компонент(пусть даже одного и того же любого из уже известных нам типов) заранее определить невозможно, оно выясняется только в процессе решениязадачи, т.е.