Множества в B.Pascal

Andrey M
Администратор
Администратор
Аватара
Andrey M
Администратор
Администратор
Репутация: 0
Сообщения: 2345
С нами: 6 лет 9 месяцев
Откуда: Воронеж
ICQ Сайт Skype

Сообщение #21 Andrey » 25.02.2013, 20:30

Исправил вашу версию, сейчас проверю и если ошибок нет выложу.

Добавлено спустя 19 минут 9 секунд:
Как-то так
Код
program P1;
uses crt;
var x:byte;


type Complex = object
{private}
a:set of byte;

public
constructor Init;
destructor destroy;
procedure Incl(x:byte);
function prov(x:byte):boolean;
procedure Sum(b,c:Complex);
procedure Min(b,c:Complex);
procedure Per(b,c:Complex);
procedure Vivod;
end;

constructor Complex.Init;
begin

(* type a=array[1..5] of integer;
var b:a; i: byte;
begin
writeln("Vvedite znecenie elementov massiva: ");
for i:=1 to 5 do begin *)
a:=[1];

end;

procedure Complex.Incl( x:byte);
begin
a:=a+[x];
end;

function Complex.prov(x:byte):boolean;
begin
if x in a then
prov:=true
else
prov:=false;
end;

procedure Complex.Sum(b,c:Complex);
var i:byte;
begin

for i:=low(byte) to high(byte) do
if (b.prov(i) or c.prov(i)) {and (prov(i)=false)} then
a := a + [i];
end;

procedure Complex.Min(b,c:Complex);
var i:byte;
begin
for i:=low(byte) to high(byte) do
{if (i in b) and (not(i in c)) and (not(i in a)) then}
if (b.prov(i)=true) and (c.prov(i)=false) {and (prov(i)=false) }then
a := a + [i];
end;

procedure Complex.Per(b,c:Complex);
var i:byte;
begin

for i:=low(byte) to high(byte) do
{if (i in b) and (i in c) and (not(i in a)) then}
if (b.prov(i)) and (c.prov(i)) {and (prov(i)=false)} then
a := a + [i];
end;

destructor Complex.destroy;
begin
a:=[];
end;

procedure Complex.Vivod;
var i:byte;
begin

for i:=low(byte) to high(byte) do
if i in a then
writeln(i);
end;


var
b,c,m1,m2,m3,m4,m5: Complex;
begin
m1.Init;
m1.Incl(6);
m1.Incl(4);
m1.Incl(9);
m2.Init;
m2.Incl(5);
m2.Incl(4);
writeln("Sum");
m3.Sum(m1,m2);
m3.Vivod;
m3.Destroy;
writeln("Min");
m3.Min(m1,m2);
m3.Vivod;
m3.Destroy;
writeln("Per");
m3.Per(m1,m2);
m3.Vivod;
m3.Destroy;
readkey;

end.

Добавлено спустя 12 минут 32 секунды:
Сегодня я наверно уже не отвечу. Поэтому если есть ошибки, то завтра исправлю.
У меня теперь появилась идея как сделать без set of. Если нужно, то просьба напомнить завтра после 5 часов вечера.
Последний раз редактировалось Andrey 25.02.2013, 20:30, всего редактировалось 4 раза.
Причина: Подкорректировано форматирование кода

alextard
Автор темы
Аватара
alextard
Автор темы
Репутация: 0
Сообщения: 12
С нами: 5 лет 9 месяцев

Сообщение #22 alextard » 26.02.2013, 21:33

Вечер добрый. Всё работает. ну почти, начал ругаться на writeln('Sum'); синтаксис. Можете объяснить что вы хотели тут вывести? я поставил writeln(39) но я понимаю , что это не правильно)))
А вот что выводит сама программа
39
1
4
5
6
9
39
6
9
39
1
4

Добавлено спустя 3 минуты 51 секунду:
и ещё вопрос. if-ы , которые в фигурных скобках, вы закоментили или нет??

Andrey M
Администратор
Администратор
Аватара
Andrey M
Администратор
Администратор
Репутация: 0
Сообщения: 2345
С нами: 6 лет 9 месяцев
Откуда: Воронеж
ICQ Сайт Skype

Сообщение #23 Andrey » 26.02.2013, 21:39

Это блок демонстрации работы.
' - кавычка, просто при вставке кода на форум возникли проблемы с форматированием.
Если это исправить, то программа выведет следующее:

Код: Выделить всё

Sum
1
4
5
6
9
Min
6
9
Per
1
4

То есть сначала результат сложения, потом результат вычитания и в конце результат пересечения (названия операций и переменных оставил как было у вас, менять не стал). Вроде бы правильно, можете проверить на других данных.

Добавлено спустя 1 минуту 46 секунд:
Форматирование кода исправил, теперь должно быть правильно.

Добавлено спустя 1 минуту 43 секунды:
Andrey писал(а):и ещё вопрос. if-ы , которые в фигурных скобках, вы закоментили или нет??
Да, это можно убрать.

alextard
Автор темы
Аватара
alextard
Автор темы
Репутация: 0
Сообщения: 12
С нами: 5 лет 9 месяцев

Сообщение #24 alextard » 26.02.2013, 21:54

Всё работает. я только сейчас понял , что он делает, точнее как он складывает) я думал , что нужно по эл. каждый с каждым. А потом вспомнил, что это обычное множество и если суммирует , то выведет все элементы. :-)
Я вот тогда думаю, нужен ли мне конструктор Init - инициализации множества а ?? если я его не использую? ну в том плане что я же обращаюсь к числам которые вставляю в begin-e... а этот Init a:=[1] весит просто...
да и последний вопрос, можете сказать что за механизм low(byte ) and high(byte)

Andrey M
Администратор
Администратор
Аватара
Andrey M
Администратор
Администратор
Репутация: 0
Сообщения: 2345
С нами: 6 лет 9 месяцев
Откуда: Воронеж
ICQ Сайт Skype

Сообщение #25 Andrey » 27.02.2013, 08:36

alextard писал(а):я думал , что нужно по эл. каждый с каждым. А потом вспомнил, что это обычное множество и если суммирует , то выведет все элементы.
Сумма - все элементы (без повторений); разность - элементы из первого, которых нет во втором; пересечение - одинаковые элементы.
alextard писал(а):нужен ли мне конструктор Init - инициализации множества а ??
Он у вас по заданию есть, но его можно просто не вызывать. Или же переделать так, чтобы он просил ввести числа. Это просто.
alextard писал(а):можете сказать что за механизм low(byte ) and high(byte)
Множества устроены таким образом, что просто перебрать все его элементы в цикле невозможно, а приходится проверять наличие всех возможных элементов (именно поэтому набор возможных типов элементов сильно ограничен).
low(byte) - выводит наименьшее значение для типа byte (в данном случае 0), high(byte) - наибольшее для данного типа (в данном случае 255).
low и high можно использовать и с другими типами.

alextard
Автор темы
Аватара
alextard
Автор темы
Репутация: 0
Сообщения: 12
С нами: 5 лет 9 месяцев

Сообщение #26 alextard » 27.02.2013, 21:48

Спасибо большое!


Вернуться в «Delphi/Pascal»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 4 гостя