True false false

Пример. Составить программу выделения следующих множеств из множества целых чисел от 1 до 30:

- множества чисел, кратных 2;

- множества чисел, кратных 3;

- множества чисел, кратных 6;

- множества чисел, кратных 2 или 3;

Вопросы для обсуждения:

1. Сколько множеств надо описать? (Каков тип их элементов? (четыре множества с элементами типа Byte).

2. Каково начальное значение множеств? (начальное значение множеств - пустое множество).

3. Как формируются множества? (Первые два формируются перебором всех чисел данного промежутка и отбором подходящих, а третье и четвертое получаются из первых двух путем применения операции пересечения или объединения).

4. Как осуществить вывод сформированных множеств? (Вывод множеств производится ТОЛЬКО поэлементно, поэтому удобно составить процедуру и передавать в нее множество, элементы которого и будут выводить на экран. Для этого в разделе типов надо создать соответствующий тип и использовать его в дальнейшем).

Program mnog;

const n=30;

type mn=Set Of 1..n;

var n2, n3, n6, n23: mn;

k: integer;

procedure print(m: mn);

var i: integer;

Begin

for i:=1 to n do if i In m then write(i:3);

writeln;

end;

BEGIN

n2=[ ]; n3=[ ];

for k:=1 to n do

Begin

{если число делится на 2, то заносим его в n2 }

if k Mod 2 = 0 Then n2:=n2+[k];

{если число делится на 3, то заносим его в n3 }

if k Mod 3 = 0 Then n3:=n3+[k];

end;

{ числа, кратные 6, - это те, которые кратны и 2 и 3, поэтому это пересечение двух множеств, а числа, кратные 2 или 3, - это объединение этих же множеств }

n6:=n2*n3; n23:=n2+n3;

writeln(‘числа, кратные 2’); print(n2);

writeln(‘числа, кратные 3’); print(n3);

writeln(‘числа, кратные 6’); print(n6);

writeln(‘числа, кратные 2 или 3’); print(n23);

END.

Пример 2. Если взять то общее, что есть у боба с ложкой, добавить кота и поместить в тепло, то получится муравей. Так ли это?

program bob;

var y1, y2, y3, y4, x: Set Of Char;

s: Char;

BEGIN

y1:=[‘б’, ‘о’, ‘б’]; y2:=[‘л’, ‘о’, ‘ж’, ‘к’, ‘а’];

y3:=[‘к’, ‘о’, ‘т’]; y4:=[‘т’, ‘е’, ‘п’, ‘л’, ‘о’];

x:=(y1*y2) + y3 - y4;

writeln(‘множество х’);

for s:=’a’ to ‘я’ do if s In x then write(s); writeln;

{проверка: состоит ли муравей из кота}

if y3<=x then write(‘муравей состоит из кота’)

else write(‘муравей не состоит из кота’);

END.

Пример 3. Дан ребус МУХА + МУХА = СЛОН

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

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

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

Program myxa;

type mn=Set Of 0..9;

var m, y, x, a: 0..9; {цифры числа МУХА}

n1, n2: integer; {числа МУХА и СЛОН}

a1, a2, a3, a4: 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 y:=0 to 9 do {если это цифра не была еще взята, то добавляем ее во множество цифр числа МУХА и выбираем цифру для следующей буквы }

if Not (y In s1)

then begin s1:=s1+[y];

for x:=0 to 9 do

if Not (x In s1)

then begin s1:=s1+x;

for a:=1 to 9 do

if Not (a In s1)

then begin s1:=s1+[a];

n1:=1000*m+100*y+10*x+a;

n2:=2*n1;

a1:=n2 div 1000;

a2:=n2 div 100 mod 10;

a3:=n2 div 10 mod 10;

a4:=n2 mod 10;

s2:=[a1,a2,a3,a4];

if (s1*s2=[]) and ([a1]*[a2]*[a3]*a[4]=[])

then Print(n1,n2);

s1:=s1-[a];

end;

s1:=s1-[x];

end;

s1:=s1-[y];

end;

s1:=s1-[m];

end;

END.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: