ЛР2. Множества и массивы

Задания

  1. Разработать функции для управления множествами, с преодолением ограничения на 256 элементов, обеспечивающие создание и уничтожение множеств, реализующие операции in, +, -, *, аналоги функций include, exclude. Функции должны обрабатывать динамический массив, каждый элемент которого содержит байтовое множество. Таким образом, массив из двух элементов позволит обрабатывать 512 элементов множества, из четырех - 1024 элемента и т.д.
     { тип множества }
    type 
        TSingleSet=set of byte;
        TLongSet=array of TSingleSet;
    
     { создание множества на count элементов
       реальное кол-во элементов всегда будет выравнено по границе, кратной 256
       пример: createSet(3) создаст множество на 256 элементов, 
       createSet(321) - на 512 элементов }
    function createSet(count:integer):TLongSet;
    
     { изменение размера множества
       множество может как увеличено, так и уменьшено
       в последнем случае возможна утеря элементов }
    procedure setSize(var dstSet:TLongSet; newCount:integer);
    
     { получение размера множества (кратно 256) }
    function getSize(bSet:TLongSet): integer;
    
     { уничтожение множества }
    procedure destroySet(var dstSet:TLongSet);
    
     { аналог операции in }
    function inSet(bSet:TLongSet; e:integer):boolean;
    
     { аналог операции +, возвращает новое множество минимально необходимого размера}
    function sumSet(set1,set2:TLongSet):TLongSet; 
    
     { аналог операции -, возвращает новое множество минимально необходимого размера}
    function subSet(set1,set2:TLongSet):TLongSet; 
    
     { аналог операции *, возвращает новое множество минимально необходимого размера}
    function mulSet(set1,set2:TLongSet):TLongSet; 
    
     { аналог функции include, изменяет переданное множество
       при необходимости увеличивает его размер }
    procedure includeSet(var dstSet:TLongSet; e:integer);
    
     { аналог функции exclude, изменяет переданное множество  }
    procedure excludeSet(var dstSet:TLongSet; e:integer);
    

    Проверить работу функций.

  2. Разработать функции для управления множествами, с преодолением ограничения на 256 элементов, обеспечивающие создание и уничтожение множеств, реализующие операции in, +, -, *, аналоги функций include, exclude. Функции должны обрабатывать указатель на битупакованный массив, каждый элемент которого содержит один элемент множества. Количество элементов во множестве кратно 8. Для получения информации об объеме выделенной ранее под указатель памяти можно использовать функцию MemSize. Следует учитывать, что объем действительно выделенной памяти часто превышает на несколько байт (десятков байт) запрошенный объем. Это не является ошибкой и весь возвращенный объем может быть использован для хранения множества.
     { тип множества }
    type 
        TLongSet=bitpacked array[0..high(longint)] of boolean;
        PLongSet=^TLongSet;
    
     { создание множества на count элементов }
    function createSet(count:integer):PLongSet;
    
     { изменение размера множества
       множество может как увеличено, так и уменьшено
       в последнем случае возможна утеря элементов }
    procedure setSize(var dstSet:PLongSet; newCount:integer);
    
     { получение размера множества }
    function getSize(bSet:PLongSet): integer;
    
     { уничтожение множества }
    procedure destroySet(var dstSet:PLongSet);
    
     { аналог операции in }
    function inSet(PSet:TLongSet; e:integer):boolean;
    
     { аналог операции +, возвращает новое множество минимально необходимого размера}
    function sumSet(set1,set2:PLongSet):PLongSet; 
    
     { аналог операции -, возвращает новое множество минимально необходимого размера}
    function subSet(set1,set2:PLongSet):PLongSet; 
    
     { аналог операции *, возвращает новое множество минимально необходимого размера}
    function mulSet(set1,set2:PLongSet):PLongSet; 
    
     { аналог функции include, изменяет переданное множество
       при необходимости увеличивает его размер }
    procedure includeSet(var dstSet:PLongSet; e:integer);
    
     { аналог функции exclude, изменяет переданное множество  }
    procedure excludeSet(var dstSet:PLongSet; e:integer);
    

    Проверить работу функций.

Дополнительные задания для прогульщиков (2024-11-13): обеспечить поддержку вычисления симметричной разности множеств (20 баллов), стоимость блоков снижается с 40 до 30 баллов.