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

Аватара пользователя
Andrey
Администратор
Администратор
Сообщения: 2345
Зарегистрирован: 02 фев 2012, 11:42
Откуда: Воронеж
Контактная информация:

Сообщение Andrey » 25 фев 2013, 20:30

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

Добавлено спустя 19 минут 9 секунд:
Как-то так
[spoiler="Код"]
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.
[/spoiler]

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

Аватара пользователя
alextard
Сообщения: 12
Зарегистрирован: 21 фев 2013, 17:15

Сообщение alextard » 26 фев 2013, 21:33

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

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

Аватара пользователя
Andrey
Администратор
Администратор
Сообщения: 2345
Зарегистрирован: 02 фев 2012, 11:42
Откуда: Воронеж
Контактная информация:

Сообщение Andrey » 26 фев 2013, 21:39

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

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

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

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

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

Аватара пользователя
alextard
Сообщения: 12
Зарегистрирован: 21 фев 2013, 17:15

Сообщение alextard » 26 фев 2013, 21:54

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

Аватара пользователя
Andrey
Администратор
Администратор
Сообщения: 2345
Зарегистрирован: 02 фев 2012, 11:42
Откуда: Воронеж
Контактная информация:

Сообщение Andrey » 27 фев 2013, 08:36

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

Аватара пользователя
alextard
Сообщения: 12
Зарегистрирован: 21 фев 2013, 17:15

Сообщение alextard » 27 фев 2013, 21:48

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

Ответить