Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Курсовая работа2 / SLR_Grammar / Umsc_StrSetUtils
.pas // Авторы студенты группы 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.
//Процедуры, дающие возможность представления множества
//натуральных чисел в виде длинной строки (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