Лабораторная 6. Низкоуровневое управление множествами

  1. Разработать функции для низкоуровневого управления байтовыми множествами, реализующие операции in, +, -, * и фунции include, exclude средствами прямого доступа к оперативной памяти множества.
     { тип множества }
    type ByteSet=set of byte;
    
     { аналог операции in }
    function inSet(e:byte; bset:ByteSet):boolean;
    
     { аналог операции + }
    function addSet(b1set,b2set:ByteSet):ByteSet; 
    
     { аналог операции - }
    function subSet(b1set,b2set:ByteSet):ByteSet; 
    
     { аналог операции * }
    function mulSet(b1set,b2set:ByteSet):ByteSet; 
    
     { аналог функции include }
    function includeSet(e:byte; bset:ByteSet):ByteSet;
    
     { аналог функции exclude }
    function excludeSet(e:byte; bset:ByteSet):ByteSet;
    
    Проверить работу функций.

  2. *Разработать структуру для хранения множеств произвольного размера (от 1 элемента до high(dword) элементов). Обязательное требование к структуре: элементы множества должны быть расположены максимально плотно в оперативной памяти (по 1 биту на элемент, по 8 элементов на байт). Разработать функции обработки таких множеств.
     { тип для множества - указатель на разработанную структуру }
    type SuperSet=pointer;
    
     { создает множество, выделяя для него оперативную память в соотвествии с переданным 
       максимально возможным количеством элементов maxCount }
    function createSet(maxCount:dword):SuperSet;
    
     { уничтожает множество, освобождая выделенную для него оперативную память }
    procedure destroySet(sset:SuperSet);
    
     { возвращает копию переданного множества }
    function copySet(sset:SuperSet):SuperSet;
    
     { аналог операции in }
    function inSet(e:dword; sset:SuperSet):boolean;
    
     { объединяет множества s1set и s2set
       Если iscopy=true, то для хранения результата создается 
       новое множество в оперативной памяти и функция возвращает новое множество
       Если iscopy=false, то результат размещается в s1set и функция возвращает s1set}
    function addSet(s1set,s2set:SuperSet; iscopy:boolean=false):SuperSet; 
    
     { вычитает из множества s1set множество s2set
       Если iscopy=true, то для хранения результата создается 
       новое множество в оперативной памяти и функция возвращает новое множество
       Если iscopy=false, то результат размещается в s1set и функция возвращает s1set}
    function subSet(s1set,s2set:SuperSet; iscopy:boolean=false):SuperSet; 
    
     { вычисляет пересечение множеств s1set и s2set
       Если iscopy=true, то для хранения результата создается 
       новое множество в оперативной памяти и функция возвращает новое множество
       Если iscopy=false, то результат размещается в s1set и функция возвращает s1set}
    function mulSet(s1set,s2set:SuperSet; iscopy:boolean=false):SuperSet; 
    
     { включает e в sset
       Если iscopy=true, то для хранения результата создается 
       новое множество в оперативной памяти и функция возвращает новое множество
       Если iscopy=false, то результат размещается в sset и функция возвращает sset}
    function includeSet(e:dword; sset:SuperSet; iscopy:boolean=false):SuperSet; 
    
     { исключает e из sset
       Если iscopy=true, то для хранения результата создается 
       новое множество в оперативной памяти и функция возвращает новое множество
       Если iscopy=false, то результат размещается в sset и функция возвращает sset}
    function excludeSet(e:dword; sset:SuperSet; iscopy:boolean=false):SuperSet; 
    
    Если операции выполняются над множествами различного размера, то результат зависит 
    от значения iscopy. Если iscopy=true, то новое множество будет равно по размеру множеству
    с большим количеством элементов. Если iscopy=false и размер s1set меньше размера s2set, то
    лишние элементы s2set игнорируются.
    
    Проверить работу функций.