Скачиваний:
12
Добавлен:
01.05.2014
Размер:
5.01 Кб
Скачать
// Авторы студенты группы 2382: Щербинская О. Ю., Мирошникова Н. Л., Костыгова Д. М.


//Процедуры, дающие возможность представления множества
//натуральных чисел в виде длинной строки (AnsiString)



unit Umsc_StrSetUtils;


{=}INTERFACE


const StrSeparator = '.';
StartIterator = 2;


type TStrSetElement = Word;
type TStrSetIterator = Word;


procedure InitStrSet( var i_Set: string );
procedure InitStrSetIterator( var i_Iterator: TStrSetIterator );

function GetNextElement( const i_Set: string; var i_Iterator: TStrSetIterator ): TStrSetElement;
function HasMoreElements( const i_Set: string; const i_Iterator: TStrSetIterator ): boolean;
function HasElement( const i_Set: string; const i_Element: TStrSetElement ): boolean;
function IsEmpty( const i_Set: string ): boolean;

function AddElement( var i_Set: string; const i_NewEl: TStrSetElement ): boolean;
function RemElement( var i_Set: string; const i_RemEl: TStrSetElement ): boolean;

function MergeSet( var i_Reciever: string; const i_Source: string ): boolean;
function IntersectSet( var i_Reciever: string; const i_Source: string ): boolean;


{=}IMPLEMENTATION


uses SysUtils;



//Инициализирует множество начальным строковым разделителем
procedure InitStrSet( var i_Set: string );
begin
i_Set := StrSeparator;
end;



//Устанавливает итератор на первый элемент множества
procedure InitStrSetIterator( var i_Iterator: TStrSetIterator );
begin
i_Iterator := StartIterator;
end;


(* Пусть итератор указывает на первый символ, с которого начинается запись
нового элемента.
После обработки процедуры элемент будет прочитан, а итератор -
установлен на начало следующего элемента, либо конец множества
*)

function GetNextElement( const i_Set: string; var i_Iterator: TStrSetIterator ): TStrSetElement;
var Buffer: string;
begin
Buffer := '';
while ( i_Set[ i_Iterator ] <> StrSeparator ) do
begin
Buffer := Buffer + i_Set[i_Iterator];
inc( i_Iterator );
end;
inc( i_Iterator );
Result := StrToInt( Buffer );
end;


(*
Проверка
можно ли выполнить ещё одну операцию GetNextElement
*)
function HasMoreElements( const i_Set: string; const i_Iterator: TStrSetIterator ): boolean;
begin
Result := not( i_Iterator > Length( i_Set ) );
end;



//Проверить, есть ли заданный элемент во множестве
function HasElement( const i_Set: string; const i_Element: TStrSetElement ): boolean;
var SrchStr: string;
begin
SrchStr := StrSeparator + IntToStr( i_Element ) + StrSeparator;
Result := Pos( SrchStr, i_Set ) <> 0;
end;



//Проверить множество на пустоту
function IsEmpty( const i_Set: string ): boolean;
begin
Result := i_Set = StrSeparator;
end;


(*
Добавлить элемент во множество
TRUE, если элемент добавлен
FALSE, если элемент УЖЕ содержался во множестве
*)
function AddElement( var i_Set: string; const i_NewEl: TStrSetElement ): boolean;
var Iterator, InsertPos: TStrSetIterator; LastItem: TStrSetElement;
begin
if HasElement( i_Set , i_NewEl ) then
begin
Result := FALSE; Exit;
end;

InitStrSetIterator( Iterator ); InitStrSetIterator( InsertPos ); LastItem := 0;
while ( HasMoreElements(i_Set,Iterator) ) and ( LastItem < i_NewEl ) do
begin
InsertPos := Iterator;
LastItem := GetNextElement( i_Set, Iterator );
end;

if LastItem < i_NewEl then InsertPos := Iterator;
Insert( IntToStr( i_NewEl ) + '.', i_Set, InsertPos );
Result := TRUE;
end;


(*
Удалить элемент из множества
TRUE, ели элемент удалён
FALSE, если элемента ВОВСЕ небыло
*)
function RemElement( var i_Set: string; const i_RemEl: TStrSetElement ): boolean;
begin
if not HasElement( i_Set , i_RemEl ) then
begin
Result := FALSE; Exit;
end;

i_Set := StringReplace( i_Set, StrSeparator + IntToStr(i_RemEl) + StrSeparator, StrSeparator, [] );
Result := TRUE;
end;


(*
Вычислить пересечение множеств i_Reciever и i_Source, и заносит результат
в i_Reciever
TRUE, если результирующее множество было изменено
*)
function MergeSet( var i_Reciever: string; const i_Source: string ): boolean;
var Iterator: TStrSetIterator;
begin
Result := FALSE;
InitStrSetIterator( Iterator );
while HasMoreElements( i_Source, Iterator ) do
Result := AddElement( i_Reciever, GetNextElement( i_Source, Iterator )) or Result;
end;


(*
Вычислить разность множеств i_Reciever и i_Source, и заносит результат
в i_Reciever
TRUE, если результирующее множество было изменено
*)
function IntersectSet( var i_Reciever: string; const i_Source: string ): boolean;
var Iterator: TStrSetIterator;
begin
Result := FALSE;
InitStrSetIterator( Iterator );
while HasMoreElements( i_Source, Iterator ) do
Result := RemElement( i_Reciever, GetNextElement( i_Source, Iterator )) or Result;
end;

end.
Соседние файлы в папке SLR_Grammar