Скачиваний:
13
Добавлен:
01.05.2014
Размер:
5 Кб
Скачать
//  Авторы студенты группы 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