- •Глава 7. Структурированные типы данных
- •7.1. Массивы
- •7.1.1. Одномерный массив Объявление массива.Перед использованием массив, как и любая переменная, должен быть объявлен в разделе объявления переменных. В общем виде объявление массива выглядит так:
- •Вывод массива. Под выводом массива понимается вывод на экран значений элементов массива. Вывод элементов одномерного массива на экран.
- •1 9 5
- •6 9 7
- •Ввод двумерного массива
- •Описание типа множество
- •Операции над множествами
- •3.4. Адресный тип данных
Описание типа множество
Понятие множества в языке Pascalосновывается на математическом представлении о множествах как ограниченной совокупности различных элементов. Для построения конкретного множественного типа используется перечисляемый или интервальный тип данных. Тип элементов, составляющих множество, называется базовым типом. Область значений типа множество – набор всевозможных подмножеств, составленных из элементов базового типа. На языкеPascalзначения элементов множества указываются в квадратных скобках: [1,2,3,4], [1..10], ['a','b','c','d'], ['a'..'z'].
если множество не имеет не имеет элементов, оно называется пустым и обозначается как []. Количество элементов множества называется его мощностью.
Множественный тип описывается с помощью служебных слов Set of
(множество из …).
Формат записи множественных типов имеет вид:
type
<имя типа >= setof<элемент1,…, элементN>;
var
<идентификатор,…>:<имя типа>;
Пример Описание переменной множественного типа:
type
М = set of 'A'..'D';
var
MS: M;
Принадлежность переменных к множественному типу может быть определена прямо в разделе описания переменных:
var
c:setof0..7;
Константы множественного типа записываются в виде заключенной в квадратные скобки последовательности элементов или интервалов базового типа, разделенных запятыми, например:
['A', 'C'] [0, 2, 7] [3, 7, 11..14].
Константа вида [ ] означает пустое подмножество.
Множество включает в себя набор элементов базового типа, все подмножества данного множества, а также пустое подмножество. Если базовый тип, на котором строится множество, имеет К элементов, то число
подмножеств, входящих в это множество, равно 2 в степени К.
Пусть имеется переменная Р интервального типа:
var
P: 1..3;
Эта переменная может принимать три различных значения - либо 1, либо 2, либо 3. Переменная Т множественного типа
var
T:Setof1..3;
может принимать восемь различных значений:
[ ] [1,2]
[1] [1,3]
[2] [2,3]
[3] [1,2,3]
Порядок перечисления элементов базового типа в константах безразличен.
Значение переменной множественного типа может быть задано конструкцией вида [T], где T - переменная базового типа.
Операции над множествами
К множественным величинам применимы операции отношения: тождественность (=), нетождественность (<>), содержится в (<=), содержит (>=). Результат выполнения этих операций имеет логический тип, например trueилиfalse.
При работе с множествами допускается использование операций объединения(+), пересечения(*) и разности(-) и операции in
Операция "равно"(=). Два множества А и В считаются равными, если они состоят из одних и тех же элементов. Порядок следования элементов в сравниваемых множествах значения не имеет.
Например:
-
Значение А
Значение В
Выражение
Результат
[1,2,3]
['a','b','c']
['a'..'z'
[1,2,3]
['c','a']
['z'..'a']
A=B
A=B
A=B
true
false
true
Операция "не равно" (<>). Два множества А и В считаются не равными, если они отличаются по мощности или по значению хотя бы одного элемента.
Например:
-
Значение А
Значение В
Выражение
Результат
[1,2,3]
['a',..,'z']
['a'..'z'
[1,2,3,4]
['b','x']
['z'..'a']
A<>B
A<>B
A<>B
true
true
false
Операция "больше или равно" (>=).операция "больше или равно" используется для определения принадлежности множеств. Результат операцииA>= В равенtrue, если все элементы множества В содержатся в множестве А. противном случае результат равенfalse.
Например:
-
Значение А
Значение В
Выражение
Результат
[1,2,3,4]
['a',..,'z']
['a','b','z'
[1,2,3]
['b','t']
['z'..'a']
A>=B
A>=B
A>=B
true
true
true
Операция "меньше или равно"( <=). Результат выражения А <= В равенTrue, если все элементы множества А содержатся в множестве В.
В противном случае результат равен false.
Например:
-
Значение А
Значение В
Выражение
Результат
[1,2,3]
['a',..,'c']
['a','x']
[1,2,3,4]
['z',..,'a']
['a','x','y']
A<=B
A<=B
A<=B
true
true
true
Операция in.Операцияinиспользуется для проверки принадлежности кг либо значения указанному множеству. Обычно применяется в условных операторax.
-
Значение А
Выражение
Результат
2
'y'
z1
if a [1,2,3] then …
if a in ['a','f'] then …
if a in [x1,x2,y1,y2] theh
true
false
true
При использовании операции inпроверяемое на принадлежим значение и множество в квадратных скобках не обязательно предварительно описывать в деле описаний. Операцияinпозволяет эффективно и наглядно производить сложные проверки условий, заменяя иногда десятки других операций. Например, выражение
if(x=l)or(x=2)or(x=3)then...
можно заменить более коротким выражением
ifxin[ 1. .3]then ...
Иногда операцию inпытаются записать с отрицанием:
Xnot inM.
Такая запись является ошибочной, так как две операции следуют подряд; правильная инструкция имеет вид
not (XinM) .
Объединение множеств(+). Объединением двух множеств является ретье множество, содержащее элементы обоих множеств. Няппимеп"
Например:
-
Значение А
Значение В
Выражение
Результат
[1,2,3,4]
['a',..,'c']
[]
[4,5,6]
['d',..,'k']
[]
A+B
A+B
A+B
[1,2,3,4,5,6]
['a'..'k']
[]
Пересечение множеств(*). Пересечением двух множеств является третье множество, которое содержит элементы, входящие одновременно в оба множества.
Например:
-
Значение А
Значение В
Выражение
Результат
[1,2,3]
['a',..,'c']
[]
[1,3,4]
['b',..,'l']
[]
A*B
A*B
A*B
[1,3]
[b]
[]
Разность множеств( - ). Разностью двух множеств является третье множество, которое содержит элементы первого множества, не входящие во второе множество. - |
Например:
-
Значение А
Значение В
Выражение
Результат
[1,2,3,4]
['a',..,'z']
[a1,a2,a3,a4]
[4,2,1]
['e',..,'z']
[a3,a4]
A-B
A-B
A-B
[2]
['a'..'d']
[a1,a2]
Результат операций над двумя множествами можно наглядно представить с помощью закрашенных частей двух кругов.
Использование в программе данных множественного типа предоставляет ряд преимуществ:
упрощаются сложные операторы if,
увеличивается наглядность программы и алгоритма решения задачи,
экономятся память, время компиляции и выполнения.
Отрицательным моментом является то что в языке Pascalотсутствуют средства ввода-вывода элементов множества, поэтому программист сам должен писать соответствующие процедуры.
При использовании в программах данных множественного типа выполнение операций происходит над битовыми строками данных. Каждому значению множественного типа в памяти ЭВМ соответствует один двоичный разряд. Например, множество
['A','B','C','D']
представлено в памяти ЭВМ битовой строкой
1 1 1 1.
Подмножества этого множества представлены строками:
['A','B','D'] 1 1 0 1
['B','C'] 0 1 1 0
['D'] 0 0 0 1
Величины множественного типа не могут быть элементами списка ввода - вывода.
В языке Pascalколичество элементов базового типа, на котором строится множество, ограничено и не превышает 256.
Инициализация величин множественного типа производится с помощью типизированных констант:
const
ret: set of 'a'..'z'= [];
.
Проиллюстрируем применение данных множественного типа на примерах.
Пример . Программа описания множеств и операций над ними, в которой описаны множества чиселD,Dl,D2,D3. Затем они заполнены следующим образом: множествоDl— четными числами 2,4,6,8; множество D2 — числами 0,1,2,3,5; множество D3 — нечетными числами 1,3,5,7,9. После этого над множествами выполнены операции объединения, разности и пересечения.
program Pr ;{Демонстрация операций над множествами}
type
Digits = set of 0..9;
var
Dl, D2, D3, D : Digits;
begin
D1:=[2,4,6,8]; {Заполнение множеств}
D2:=[0..3,5];
D3:=[1,3,5,7,9];
D:=D1 + D2;{Объединение множествDlи D2}
D:=D- D2;{Разность множеств D и D2}
D:==D* Dl;{Пересечение множеств D и Dl}
{Вывод элементов множества}
f or i:=1 to 9 do
begin
if i in D then write (i,' ');
end;
end.
В программе сначала описан тип Digits=set of0..9, затем описаны переменныеD1,D2,D3,Dэтого типа. В первой части программы осуществляется заполнение множеств, а затем над множествами выполняются операции объединения, пересечения, разности.
Пример Программа заполнения множества.
Опишите множество М (1..50). Сделайте его пустым, вводя целые числа с клавиатуры. Заполните множество 10 элементами.
В разделе описания опишем множество целых чисел от 1 до 50, переменную Х целого типа будем использовать для считывания числа-кандидата в множество, целую переменную I используем для подсчета количества введенных чисел. В начале программы применим операцию инициализации множества М:= [], так как оно не имеет элементов и является пустым.
Заполнение множества элементами произведем с использованием оператора цикла for, параметр которого будет указывать порядковый номер вводимого элемента. Операцию заполнения множества запишем оператором присваивания М:=М+[Х]. Контроль заполнения множества запишем с использованием операции проверки принадлежности. Если условия ХinMвыполняется, выведем сообщение о том, что число Х помещено в множество.
programPr;
Uses WinCrt;
var
M : set of 1. . 50;
x, i : integer;
begin
M:= []; {M - пустое множество}
for i:= 1 to 10 do
begin
Write('Введите ',i,' - й элемент множества: ');
Readin(x);
if not (x in M) then{Если число не входит в множество М}
begin
Writeln(x, ' помещен в множество 1..50');
М:= М+[x];
end;
end;
Writeln;
{Вывод элементов множества}
f or i:=1 to 50 do
begin
if i in M then write (i,' ');
end;
end.
Пример .Программа и вывода на экран дисплея наборов случайных чисел для игры в "Спортлото 5 из 36". Для заполнения каждой карточки спортлото необходимо получить набор из пяти псевдослучайных чисел. К этим числам предъявляются два требования:
- числа должны находиться в диапазоне 1..36;
- числа не должны повторяться.
Program Lotto;
Uses WinCrt;
var
nb, k: set of 1..36;
kol, l, i, n: Integer;
begin
Randomize;
WriteLn('Введите число наборов');
ReadLn(kol);
nb:=[1..36];
for i:=1 to kol do
begin
k:=[];
for l:=1 to 5 do
begin
repeat
n:=Random(36)
until (n in nb) and not (n in k);
k:=k+[n];
Write(n:4)
end;
WriteLn
end;
end.
Пример . Программа ввода фамилии, имени отчества на русском языке.
В разделе описания переменных опишем множество Lit, включающее в себя всевозможные символы, переменнуюNameдля хранения Ф.И.0.,Chдля посимвольного ввода.
Переменная логического типа Rusбудет указывать, принадлежит ли очередной вводимый символ множеству букв русского языка. Для ввода символов используется стандартная функцииReadKeyчтения кода нажатой клавиши. Текст программы имеет следующий вид:
program FIORus; {Ввод Ф.И.0. только на русском языке)
usesCrt;
var
Lit : set of char;
Name : string ;
Ch : char ;
Rus : boolean;
begin
Lit:=[' ','А' .. 'п','р' .. 'я'];
Write('Введите фамилию, имя, отчество ');
repeat {Считать всю строкуName}
repeat (Считать один символ}
Ch:=ReadKey; {Считать код нажатой клавиши}
if Ch<>#13 then
begin
Rus:=Ch in Lit;
ifrus{Если символ входит в множествоLit}Then
begin
Name:=Name+Ch;{Добавление символа кName}
Write(Ch); {Вывод символа в строке ввода} ;
end;
else{Код клавиши не входит в множествоLit}
begin
Writeln('Переключитесь в русский регистр');
Write('и введите Ваше имя ');
end;
end;
untilRus;{Завершить ввод символа на русском языке}
untilCh=#13; {Завершить ввод строки нажатием клавишиEnter}
Writein;
Writeln('Здравствуйте, ',Name) ;
end.
Вопросы для самопроверки
1. Тип данных множество. Элементы множества.
2. Как задается множественный тип данных.
3. Что такое пустое множество и как оно обозначается?
4. Какие операции допустимы над множествами?
6. Какие множества считаются равными, неравными?
7. Для чего применяются операции отношения ">=", "<=".
8. Для чего применяется операция in? Особенности ее применения.
9.Что называется объединением, пересечением и разностью множеств?