Задача 21. Организовать ввод элементов множества и определить, существуют ли общие элементы у введенного множества с множеством, заданным константой.
Данная программа продемонстрирует, как можно задать множество. Переменные типа “множество” могут быть типизированными константами.
Переменную v зададим начальными значениями при описании констант. Переменная s является подмножеством множества символов кода ASCII.
Программа:
program vvod;
const v: set of char = [‘a’, ‘d’, ‘f’, ‘n’, ‘r’];
var
s: set of char;
c: char;
begin
s:= []; c:= #0;
while c <> ‘.’ do
begin
readln(c);
s:= s + [c]
end;
s:= s – [‘.’];
if v * s <> [] then writeln(‘ Имеются общие элементы!’)
end.
В цикле множество s пополняется вводимым с клавиатуры значением переменной с. Сигналом к окончанию ввода служит точка. Цикл продолжается до тех пор, пока с <> ‘.’. По окончании цикла точку вычитаем из множества. Если в двух множествах нет общих элементов, то результатом их пересечения будет пустое множество.
Задача 22. Заданы два множества. Вывести на экран результат объединения, разности и пересечения этих множеств.
В задаче 21 показано, как ввести множество. Теперь продемонстрируем, как записываются операции над множествами и как организовать вывод элементов множества. При выводе элементов множества приходится проверять наличие каждого возможного элемента на предмет вхождения данного элемента в выводимое множество. Если множество определено как с: set of 1..10, то это означает, что элементами множества могут быть числа 1, 2, 3, 4, 5, 6, 7, 8, 9, 10. В цикле для всех i от 1 до 10 необходимо провести проверку вхождения числа i в выводимое множество с.
for i:= 1 to 10 do if i in c then write(i:3);
Программа:
program operation;
type
menge = set of 1..10; {Задан новый тип - множество}
var
a,b,c: menge; {Описаны переменные множественного типа menge}
i, n: integer;
begin
writeln (‘Введите элементы множества a. Конец ввода – 0’);
a:= [];
repeat {Цикл для ввода множества а}
readln(i);
if i in [1..10] then a:= a + [i];
until i = 0;
writeln (‘Введите элементы множества b. Конец ввода – 0’);
b:= [];
repeat {Цикл для ввода множества b}
readln(i);
if i in [1..10] then b:= b + [i];
until i = 0;
c:= a * b; {Операция – пересечение множеств}
writeln (‘Пересечение множеств’);
for i:= 1 to 10 do if i in c then write(i:3);
writeln;
c:= a + b; {Операция – объединение множеств}
writeln (‘Объединение множеств’);
for i:= 1 to 10 do if i in c then write(i:3);
writeln;
c:= a – b; {Операция – разность множеств}
writeln (‘Разность множеств’);
for i:= 1 to 10 do if i in c then write(i:3);
writeln;
{Проверка на подмножество}
if a <= b then writeln(‘ а содержится в b’)
else writeln(‘ а не содержится в b’)
end.
Задача 23. Написать программу генерирования чисел спортлото “6 из 49”.
Задача 2 имела ту же формулировку, но решение ее с использованием диапазонного типа имело тот недостаток, что не все шесть выпавших чисел были различными. Используя тип данных “множество” устраним этот недостаток.
Программа:
program lotto1;
uses crt;
const
n = 6;
type
lotto = set of 1..49;
var
L: lotto;
k: integer;
i: 1..n;
z: 1..49;
ok: boolean;
begin
randomize;
L:= []; {Инициализация множества}
for i:= 1 to n do
{Цикл выполняется 6 раз – количество цифр в результате}
begin
repeat
z:= random(49) + 1; {Генерация случайных чисел}
if z in L then ok:= false {Определение вхождения}
{сгенерированного числа в множество}
else
begin {Присоединение нового числа}
L:= L + [z];
ok:= true
end;
until ok; {Цикл repeat повторяется до тех пор, пока ok имеет}
end; {значение false}
clrscr;
{Вывод шести различных случайных чисел из 49}
for k:= 1 to 49 do if k in L then write(k:4);
end.
В программе производится проверка генерируемого числа на предмет вхождения в формируемое множество. Если новое число z уже существует в множестве L, то оно игнорируется и происходит генерирование следующего случайного числа.
КРИТЕРИИ КАЧЕСТВА ПРОГРАММ. ДИАЛОГОВЫЕ ПРОГРАММЫ. ДРУЖЕСТВЕННОСТЬ