WriteLn(' Str_1=',Str_1,' Str_2=',Str_2,' Str_3=',Str_3);
End.
Практические задания.
1. Исправить текст программы из примера 3 п.9.2 таким образом, чтобы соседние буквы во введенном слове разделялись не пробелами, а запятыми и только в том случае, когда они различны. Одинаковые буквы не должны разделяться. Отладить код программы.
2. Разработать и отладить код программы, в которой с клавиатуры вводятся два слова, а затем из первого слова исключаются все буквы, входящие в первое. Результат вывести на экран. Если в первом слове не осталось букв, вывести сообщение “empty word ” (пустое слово).
Множества
В основу понятия множества в Паскале положено математическое определение конечного множества как ограниченного набора объектов (элементов), обладающих некоторыми общими свойствами. В качестве элементов множества можно использовать только перечисляемый или интервальный тип данных. Этот тип называют базовым для множества. Также используется понятие подмножества (в том числе и пустого), как набора элементов, входящих в базовое множество.
Формально определение множества схоже с определением массива. Отличия от массивов заключаются в следующем:
1) у множества ограничен тип элементов,
2) в математическом плане номер элемента в массиве не фиксирован, в массиве каждый элемент имеет свой фиксированный номер,
3) в массиве может быть любое количество элементов с одинаковыми значениями, в множестве такой элемент только один (т.е. включение в состав множества элементов 'a', 'c', 'a', 'b', 'c' даст в итоге множество вида [ 'a', 'b', 'c' ]).
9.3.1. Описание и инициализация множеств
Как и в случае других типов данных, множества могут быть описаны:
1) при помощи специального типа или
2) непосредственным описанием соответствующей им переменной.
Синтаксис описания множественного типа:
type M = Set of B;
где M - множественный тип, Set,of - служебные слова, B - базовый тип.
Базовый тип может быть задан пользователем или взят из стандартных типов.
Пример 1. Описание множественного типа, содержащего все строчные буквы латинского алфавита, а также переменной данного типа:
type LAT = Set of 'a'..'z';
var B: LAT;
Пример 2. Описание множественного типа, содержащего все символы (в качестве базового используется стандартный тип данных):
type CH = Set of char;
var SYM: CH;
Синтаксис непосредственного описания переменной множественного типа похож на синтаксис описания типа:
var M: Set of B;
Пример 3. Непосредственное описание переменной множественного типа, совпадающего с типом из примера 1:
var B: Set of 'a'..'z';
Постоянные значения (константы) множественного типа записывают в виде заключенной в квадратные скобки последовательности одиночных элементов или элементов-интервалов базового типа, разделенных запятыми. Константа вида [ ] означает пустое подмножество. Константы могут использоваться для задания базового типа, перечисление и задание интервалов могут сочетаться, например:
var B:Set of ['a','b','c']; С:Set of [0,2,7,13]; D:Set of [1,10..20,5];
Как и у массивов, инициализация величины множественного типа может производиться с помощью типизированных констант:
const B0: Set of LAT= []; {задание пустого подмножества множества LAT}
const digits: Set of char= [‘0’.. ‘9’]; {задание константы символьного типа}
Порядок перечисления элементов базового типа в константах безразличен.
Во внутреннем представлении элементы множества нумеруются, начиная с нуля. Количество базовых элементов в одном множестве не должно превышать 256. Поэтому, в частности, стандартные типы ShortInt, Word, Integer, LongInt, несмотря на то, что являются перечислимыми, базовыми для множеств быть не могут.
Базовые элементы задают основное множество, из которого могут в виде значений переменной данного типа формироваться отдельные экземпляры – подмножества.
Пример 4. Рассмотрим описание переменной множественного типа, содержащего две буквы a и b:
var v_ab: Set of 'a'..'b';
Переменная v_ab может принимать значения только из следующего набора подмножеств множества, задающего тип: [ ] [a] [b] [a b].
За счет того, что все базовые элементы множества один раз указываются в его объявлении, во внутреннем представлении каждой переменной такого множества присутствие или отсутствие каждого базового элемента отмечается в одном бите (1 - если такой элемент в множестве присутствует, 0 - иначе). Такое битовое представление используется для выполнения операций над множествами.
Пример 5. Битовое представление всех возможных подмножеств базового множества, заданного в типе переменной v_ab из примера 4:
1) [ ] – 00 (в пустое множество не входят оба базовых элемента);
2) [a] – 10 (входит первый элемент a, второй b - не входит);
3) [b] – 01 (a не входит, b входит);
4) [a b] – 11 (оба элемента входят).
Пример 6. Формирование значений величины множественного типа, содержащего базовые элементы 'a','b','с':
Const
B_1='a'; B_2='b';
Var
BB1,BB2: Set of 'a'..'c';
B: char;
Begin
B:= 'с';
BB1:=[B_1, 'b', B];
BB2:=['a', B_2];
End.
При присваивании значений переменным множественного типа в качестве элементов в них могут засылаться не только константы и переменные базового типа, но также и выражения, у которых тип результата совпадает с базовым типом множества.
Пример 7. Рассмотрим формирование множеств байтового типа:
Const
Bt_1=45; Bt_2=123;
Var
B: byte;
BB1, BB2: Set of byte;
Begin
x:=36;
BB1:=[1,11, Bt_1, Bt_2];
BB2:=[x,x+1, x+2, Bt_1*2, Bt_2-12];
End.
9.3.2. Предметные операции с множествами
Допустим, некоторые множества А,В,С уже заданы, например, перечислением их элементов. Используя предметные операции, из данных простых множеств можно получить составные множества F(А,В,С), у которых автоматически будут определены составляющие их элементы. Предметными являются следующие операции.
1. Объединение. Операция обозначается (+). В результирующее множество входят все элементы из объединяемых множеств, например:
[0,2,4]+[1,3] равно [0,1,2,3,4]
['a','b'] + ['b','c','d'] равно ['a','b','c','d']
2. Пересечение. Операция обозначается (*). В результирующее множество входят только те элементы, которые присутствуют в каждом из пересекаемых множеств, например:
[0,2,4] * [1,3] равно []
['a','b'] * ['b','c','d'] равно ['b']
3. Вычитание. Если из множества А вычитается множество В, то в результирующее множество входят только те элементы, которые присутствуют в А, но отсутствуют в В (операция обозначается (-)), например:
[0,2,4] - [1,3] равно [0,2,4]
['a','b'] - ['b','c','d'] равно [' a ']
9.3.3. Операции сравнения над множествами
Если некоторые множества А,В,С уже заданы, то задачей операций сравнения является проверка выполнения ряда их свойств. Итогом выполнения данных операция всегда является логическое значение – Истина (True) или Ложь (False). В Паскале используются следующие операции сравнения множеств, в записи которых всегда входит левое и правое множество, разделенные знаком соответствующей операции.
1. Тождественность (=). Результат является истиной, если оба множества равны друг другу, т.е. состоят из одинаковых элементов, иначе – ложный результат, например:
[0,2,4] = [1,3] равно False
['a','b'] = ['b','a'] равно True
2. Нетождественность (<>). Результат является истиной, если множества не равны друг другу, иначе – ложный результат, например:
[0,2,4] = [1,3] равно True
['a','b'] = ['b','a'] равно False
3. Содержится в (<=). Результат - истина, если левое множество содержится в правом, иначе – ложь, например:
[0,2,4] <= [1,3] равно False
['a','b'] <= ['b','a','с'] равно True
4. Содержит (>=). Результат - истина, если левое множество содержит правое, иначе – ложь, например:
['a','b','с'] >= ['b','a'] равно False
['a','b','с'] >= ['b','a'] равно True
Помимо операций между множествами в Паскале есть операция in, применяемая к паре “элемент-множество ”, проверяющая принадлежность элемента базового типа (стоящего в левой части выражения) заданному множеству (правая часть), например:
0 in [1,3] равно False
'a' in ['b','a'] равно True
9.3.4. Цикл типа For..in. Вывод множеств и их элементов.
Переменные множественного типа являются подмножествами базового множества. В Паскале нет возможности обращаться к их элементам так же, как к отдельным символам строковых величин или элементам массива. Для осуществления действий, требующих перебора элементов множества проще всего использовать цикл типа For...in. Данный цикл применяется в тех случаях, когда необходимо выполнить фиксированное число вычислений для переменной цикла, которая принимает значения из перечислимого либо другого порядкового типа. Free Pascal поддерживает данный тип цикла, начиная с версии 2.4.2. Рассмотрим вначале синтаксис цикла и его применение к различным порядковым типам на примере перечисляемого типа week из примера 1 п. 9.1.
Цикл For...in имеет следующий синтаксис:
For переменная in тип do оператор
где For,in,do – служебные слова,
переменная – идентификатор языка Паскаль,
тип – порядковый тип языка Паскаль, все значения которого в заданном порядке должна пройти переменная,
оператор – оператор языка Паскаль (если требуется выполнить несколько действий, применить составной оператор).
Тип, применяемый в цикле For...in, должен быть упорядоченным и ограниченным. Рассмотрим простейший пример, в котором используется перечисляемый тип week из примера 1 п. 9.1.
Пример 8. Код программы, которая распечатывает все дни недели с новой строки:
type week = ( Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday);
var d: week;
Begin