IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Модуль для работы с множествами
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 47
Пол: Мужской

Репутация: -  0  +


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

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


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Что переделать? Сделать указатели вместо собственно 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.

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


Новичок
*

Группа: Пользователи
Сообщений: 47
Пол: Мужской

Репутация: -  0  +


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;
А как с таким описанием дописать этот модуль?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 16.05.2024 14:13
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name