Помощь - Поиск - Пользователи - Календарь
Полная версия: Модуль для работы с множествами
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
*alt
Реализовать Модуль для работы с множествами целых чисел, число элементов в котором больше, чем 256. Модуль должен содержать процедуры инициализации множества, включения, исключения элемента, проверки принадлежности элемента множеству; объединения, пересечения и разности множеств. Написать программу, иллюстрирующую работу данного модуля/
Множество должно удовлетворять

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


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

Спасибо, сейчас попробую разобраться.
*alt
Цитата(volvo @ 3.10.2008 9:54) *

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

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