Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб4_множества_студ.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
64 Кб
Скачать
☆

Примеры

Пример 1. Дана символьная строка. Подсчитать в ней количество знаков препинания (. - , ; : ! * ?).

Program P1;

Var S: String; I,K: Byte;

Begin

ReadLn(S); K:=0;

For I:=1 To Length(S) Do

If S[I] In ['.','-',',',';',':', '!', '*','?']

Then K:=K+1;

WriteLn('Число знаков препинания равно',К)

End.

Пример 2. Дана строка. Сохранить в ней только первые вхождения символов, удалив все остальные.

program ex_set_3;

var m : set of char;

s : string; i : byte;

begin

write('Введите строку: ');

readln(s);

m :=[];

i := 1;

while i <= length(s) do

if s[i] in m then delete(s, i, 1)

else begin m:=m+[s[i]]; i := i + 1 end;

writeln(‘результат: ’,s)

end.

Пример 3. Дан текст на русском языке. Найти количество согласных букв в последнем слове.

Program mn_7;

uses crt;

type let=' а'..'я';

var sogl:set of let;

s:string;

I,k:byte;

begin

writeln('введите текст, заканчивающийся точкой');

readln(s);

if s[length(s)]<>'.' then s:=s+'.';

sogl :=['п','ф','х','т','с','к','ч','ш','щ','ц', 'б','в','г','д','ж','з','л','м','н','р'];

i:= length(s);

while s[i]<>' ' do begin if s[i] in sogl then k:=k+1; i:=i-1;end;

writeln(k);

end.

Пример 4. В городе имеется n высших учебных заведений, которые производят закупку компьютерной техники. Есть шесть компьютерных фирм: «Диалог», «Avicom», «Нэта», «Сервер», «Декада», «Dega.ru». Ответить на следующие вопросы:

1) в каких фирмах закупка производилась каждым из вузов?

2) в каких фирмах закупка производилась хотя бы одним из вузов?

3) в каких фирмах ни один из вузов не закупал компьютеры?

Решим задачу с использованием множеств. Для удобства дальнейших манипуляций в порядке следования занумеруем компьютерные фирмы, начиная с единицы. Занесём информации о месте закупок компьютеров каждым из вузов в отдельное множество.

Ответ на первый вопрос можно получить, выполнив пересечение всех таких множеств.

Ответ на второй вопрос – результат объединения множеств.

И, наконец, на последний – разность множества всех фирм и множества фирм, где хотя бы один вуз делал покупки.

program ex_set_1;

type firma = set of 1..6;

v = array[0..20] of firma;

const f: array [1..6] of string[10] = ('Диалог', 'Avicom', 'Нэта', 'Сервер', 'Декада', 'Dega.ru');

{процедура ввода информации о закупке компьютеров в очередной фирме}

procedure vvod(var a: firma);

var i: byte; ans: 0..1;

begin

a:= [];

for i := 1 to 6 do

begin

Write('Вуз покупал компьютеры в фирме ', f[i], ' (1 - да, 0 - нет)? '); ReadLn(ans);

if ans = 1 then a:=a+[i]

end;

end;

{процедура вывода элементов массива, номера которых содержатся в множестве}

procedure Print(a : firma);

var i: byte;

begin

for i := 1 to 6 do if i in a then write(f[i]:10);

writeln

end;

{Процедура, дающая ответ на первый вопрос}

procedure Rez1(a: v; n : byte; var b : firma);

var i : byte;

begin

b := [1..6];

for i := 0 to n-1 do b := b * a[i];

end;

{Процедура, дающая ответ на второй вопрос}

procedure Rez2(a: v; n : byte; var b : firma);

var i : byte;

begin

b := [];

for i := 0 to n-1 do b := b + a[i];

end;

var a: v; n, i : byte; c : firma;

begin

write('Сколько вузов делали закупку? '); readln(n);

for i := 0 to n-1 do vvod(a[i]);

Rez1(a, n, c);

writeln('Каждый из вузов закупил компьютеры в фирмах: '); Print(c);

Rez2(a, n, c);

writeln('Хотя бы один из вузов закупил компьютеры в фирмах: '); Print(c);

writeln('Ни один из вузов не закупил компьютеры в фирмах: '); Print([1..6]-c);

end.

Пример 5. Из множества целых чисел 1..20 выделить: множество чисел, делящихся без остатка на 6; множество чисел, делящихся без остатка или на 2, или на 3.

program mnog2;

const n=20;

var n2,n3,n6,n23: SET OF 1..N;

k:1..N;

begin

n2:=[ ]; n3:=[ ];

for k:=2 to n do

begin

if (k mod 2)=0 then n2:=n2+[k];

if (k mod 3)=0 then n3:=n3+[k];

end;

n6:=n2*n3;

n23:=n2+n3;

writeln('на 6 делятся числа:');

for k:=1 to n do

if k in n6 then write(k:3);

writeln;

writeln('на 2 или на 3 делятся числа:');

for k:=1 to n do

if k in n23 then write(k:3);

writeln

end.

Пример 6. Разгадывание ребусов.

+ МУХА

МУХА

СЛОН

Каждая буква - это цифра, разным буквам соответствуют разные цифры. Необходимо заменить буквы цифрами так, чтобы получилось верное равенство. Найти все решения. Для решения этой задачи используется метод перебора с возвратом. Используем множество S1 для хранения цифр слова МУХА, причем будем вносить в него цифры последовательно, учитывая уже внесенные цифры. Начальное значение S1 - пустое множество. после выбора всех цифр первого слова создаем его числовой эквивалент и числовой образ слова СЛОН. Выделяем цифры СЛОНа (множество S2)и если слова состоят из разных цифр (то есть пересечение S1 и S2 пустое) и все цифры СЛОНа разные (то есть пересечение множеств цифр тоже пустое), то выводим решение на экран. Если же нет, то идет возврат - удаляем из множества S1 последнюю внесенную цифру и пытаемся выбрать еще одно значение. Таким образом, мы перебираем все возможные варианты и выводим на экран только те, которые удовлетворяют равенству.

Заметим, что значение буквы М в слове МУХА может иметь значения от 1 до 4, а буква А в этом же слове не может быть равна 0.

Program Rebus;

Type

MN = set of 0..9;

Var

m, u, h, a : 0..9;

n1, n2 : Integer;

s, l, o, n : 0..9;

S1, S2 : MN;

Procedure Print(x, y : Integer);

Begin

writeln(x:5);

writeln('+');

writeln(x:5);

writeln(' ');

writeln(y:5);

End;

Begin

S1 := [ ];

S2 := [ ];

for m := 1 to 4 do

begin

S1 := S1+[m];

for u := 0 to 9 do

if Not(u in S1)

then

begin

S1 := S1+[u];

for h := 0 to 9 do

if Not (h in S1)

then

begin

S1 := S1+[h];

for a := 1 to 9 do

if Not (a in S1)

then

begin

S1 := S1+[a];

n1 := 1000*m+100*u+10*h+a;

n2 := 2*n1;

s := n2 div 1000;

l :=n2 div 100 mod 10;

o := n2 div 10 mod 10;

n := n2 mod 10;

S2 := [s, l, o, n];

if (S1*S2=[ ]) and ([s]*[l]*[o]*[n]=[ ])

then

Print (n1, n2);

S1 := S1-[a];

end;

S1 := S1-[h];

end;

S1 := S1-[u];

end;

S1 := S1-[m];

end;

End.