Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Модуль для работы с множествами

Автор: *alt 3.10.2008 12:12

Реализовать Модуль для работы с множествами целых чисел, число элементов в котором больше, чем 256. Модуль должен содержать процедуры инициализации множества, включения, исключения элемента, проверки принадлежности элемента множеству; объединения, пересечения и разности множеств. Написать программу, иллюстрирующую работу данного модуля/
Множество должно удовлетворять


const
maxDigit = 10000;
ArraySize = maxDigit div (high (byte) + 1);
type
TSet = set of byte;
PSet = ^TSet;
TBigSet = array [0..ArraySize] of PSet;



Автор: volvo 3.10.2008 12:54

Здесь был: http://volvo71.narod.ru/faq_folder/set_type.htm#set_bigger ?

Автор: *alt 7.10.2008 14:51

Цитата(volvo @ 3.10.2008 9:54) *

Здесь был: http://volvo71.narod.ru/faq_folder/set_type.htm#set_bigger ?

Спасибо, сейчас попробую разобраться.

Автор: *alt 16.10.2008 15:26

Цитата(volvo @ 3.10.2008 9:54) *

Здесь был: http://volvo71.narod.ru/faq_folder/set_type.htm#set_bigger ?

Что-то как-то я не понял, как под данное условие переделать dry.gif

Автор: volvo 16.10.2008 16:33

Что переделать? Сделать указатели вместо собственно Set-ов?

	TSet = array[0 .. pred(amount)] of T;

написать
	TSet = array[0 .. pred(amount)] of ^T;

(ну, и в остальных местах вместо s[ i ] поставить s[ i ]^, где нужно. Компилятор знает, где нужно)

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

... { тут все предыдушие описания }
procedure CreateSet(var s: TSet);
var i: integer;
begin
for i := 0 to pred(amount) do begin
new(s[i]); s[i]^ := [];
end;
end;

procedure PlusSet(var left: TSet; right: TSet);
var i: integer;
begin
for i := 0 to pred(amount) do
left[i]^ := left[i]^ + right[i]^;
end;

{ А теперь - собственно программа: }
var
first, second: TSet;
begin
CreateSet(first); { Как видишь, удобство использования сведено к нулю }
for i := 2 to 20 do include(first, i);
CreateSet(second);
for i := 12 to 30 do include(second, i);

PlusSet(first, second);
print_set(first);
end.

Операции
Цитата
объединения, пересечения и разности множеств
аналогичны по своей сути, меняются только знаки, так что остальные допишешь сам...

Автор: *alt 10.12.2008 21:39

unit ofset;

interface
const
maxDigit = 10000;
ArraySize = maxDigit div (high (byte) + 1);
type
TSet = set of byte;
PSet = ^TSet;
TBigSet = array [0..ArraySize] of PSet;

procedure CreateSet(var s: TBigSet);

procedure include(var s: TBigSet; i: Integer);

procedure exclude(var s: TBigSet; i: Integer);

function is_empty(const s: TBigSet): boolean;

function in_set(const s: TBigSet; i: Integer): boolean;

procedure print_set(s: TBigSet);

procedure PlusSet(const A,B: TBigSet; var C: TBigSet);


implementation

{------------------------------------------------------------------------}

procedure NewSet (var PS:Pset; S:Tset);
begin
new (PS);
PS^:=S;
end;

function GetIndex (i: integer):integer;
begin
result := i div 256
end;

function Number (i: integer): integer;
begin
result := i mod 256;
end;

function FullNumber (index: integer; i_mod: integer): integer;
begin
result := index*256 + i_mod
end;

{------------------------------------------------------------------------}

procedure CreateSet(var s: TBigSet);
var i: integer;
begin
for i := 0 to ArraySize do S[i]:=nil;
end;

{------------------------------------------------------------------------}

procedure PlusSet(const A,B: TBigSet; var C: TBigSet);
var i: integer;
begin
for i := 0 to ArraySize do
if (A[i]=nil) and (B[i]=nil) then
C[i]:=nil
else
if (A[i]=nil) and (B[i]<>nil) then
newset (c[i], b[i]^)
else
if (A[i]<>nil) and (B[i]=nil) then
newset (c[i], a[i]^)
else
if (a[i]<>nil) and (b[i]<>nil) then
newset (c[i], b[i]^+a[i]^)
end;
А как с таким описанием дописать этот модуль?

Автор: volvo 10.12.2008 21:52

Ты бы нормально вопрос ставил, глядишь ,и ответили бы тебе... Что значит "с таким описанием дописать"? Реализуй все, что у тебя недореализовано... Что конкретно не получается - спрашивай... А то даешь кусок кода, и зачем он мне? Что, кто-то должен это протестировать? Сорри, но для этого надо ДОПИСАТЬ твой модуль, а если это лень делать тебе - то другим это и подавно не надо...

Есть какие-то конкретные проблемы? Несовместимости типов, отказ компилироваться по непонятной причине - спрашивай... За те почти два месяца, которые прошли с момента предыдущего ответа, уж как минимум сформулировать вопрос нормально можно было...