Advertisement
Lucky_Dummy

CSharp Sets of natural numbers

Feb 11th, 2023 (edited)
998
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.71 KB | Source Code | 0 0
  1. namespace MyApp // Note: actual namespace depends on the project name.
  2. {
  3.   internal class OutOfRangeException : Exception
  4.   {
  5.     public OutOfRangeException()
  6.     { }
  7.  
  8.     public OutOfRangeException(string msg) : base(msg) { }
  9.  
  10.     public OutOfRangeException(string msg, Exception inner)
  11.     : base(msg, inner) { }
  12.   }
  13.  
  14.   abstract class Set
  15.   {
  16.     protected int maxElem_;
  17.  
  18.     public abstract void Add(int elem);
  19.     public abstract void Remove(int elem);
  20.     public abstract bool Check(int elem);
  21.  
  22.     public void Fill(string str)
  23.     {
  24.       string[] elems = str.Split(' ');
  25.       foreach (var elem in elems)
  26.       {
  27.         Add(int.Parse(elem));
  28.       }
  29.     }
  30.  
  31.     public void Fill(int[] elems)
  32.     {
  33.       foreach (var elem in elems)
  34.       {
  35.         Add(elem);
  36.       }
  37.     }
  38.  
  39.     public override string ToString()
  40.     {
  41.       string res = "";
  42.       for (int i = 0; i <= maxElem_; ++i)
  43.       {
  44.         if (Check(i))
  45.         {
  46.           res += i.ToString() + " ";
  47.         }
  48.       }
  49.       res.TrimEnd();
  50.       if (res == "")
  51.       {
  52.         return "∅";
  53.       }
  54.       return res;
  55.     }
  56.  
  57.     protected void CheckRange(int elem)
  58.     {
  59.       if (elem > maxElem_)
  60.       {
  61.         throw new OutOfRangeException();
  62.       }
  63.     }
  64.   }
  65.  
  66.   class SimpleSet : Set
  67.   {
  68.     private bool[] data_;
  69.  
  70.     public SimpleSet(int maxElem)
  71.     {
  72.       maxElem_ = maxElem;
  73.       data_ = new bool[maxElem_ + 1];
  74.     }
  75.  
  76.     public override void Add(int elem)
  77.     {
  78.       CheckRange(elem);
  79.       data_[elem] = true;
  80.     }
  81.     public override void Remove(int elem)
  82.     {
  83.       if (elem <= maxElem_)
  84.       {
  85.         data_[elem] = false;
  86.       }
  87.     }
  88.     public override bool Check(int elem)
  89.     {
  90.       return (elem <= maxElem_) && data_[elem];
  91.     }
  92.  
  93.     public static SimpleSet operator +(SimpleSet lSet, SimpleSet rSet)
  94.     {
  95.       int maxElem;
  96.       int lowerMax;
  97.       SimpleSet set;
  98.       if (lSet.maxElem_ > rSet.maxElem_)
  99.       {
  100.         maxElem = lSet.maxElem_;
  101.         lowerMax = rSet.maxElem_;
  102.         set = new(maxElem);
  103.         Array.Copy(lSet.data_, set.data_, maxElem + 1);
  104.       }
  105.       else
  106.       {
  107.         maxElem = rSet.maxElem_;
  108.         lowerMax = lSet.maxElem_;
  109.         set = new(maxElem);
  110.         Array.Copy(rSet.data_, set.data_, maxElem + 1);
  111.       }
  112.       for (int i = 0; i <= lowerMax; ++i)
  113.       {
  114.         set.data_[i] = lSet.data_[i] || rSet.data_[i];
  115.       }
  116.       return set;
  117.     }
  118.  
  119.     public static SimpleSet operator *(SimpleSet lSet, SimpleSet rSet)
  120.     {
  121.       int maxElem = (lSet.maxElem_ > rSet.maxElem_) ? rSet.maxElem_ : lSet.maxElem_;
  122.       SimpleSet set = new(maxElem);
  123.       for (int i = 0; i <= maxElem; ++i)
  124.       {
  125.         set.data_[i] = lSet.data_[i] && rSet.data_[i];
  126.       }
  127.       return set;
  128.     }
  129.   }
  130.  
  131.   class BitSet : Set
  132.   {
  133.     private const int BSize = 32;
  134.     private int[] data_;
  135.  
  136.     public BitSet(int maxElem)
  137.     {
  138.       maxElem_ = maxElem;
  139.       data_ = new int[maxElem_ / BSize + 1];
  140.     }
  141.  
  142.     public override void Add(int elem)
  143.     {
  144.       CheckRange(elem);
  145.       data_[elem / BSize] |= GetMask(elem);
  146.     }
  147.     public override void Remove(int elem)
  148.     {
  149.       if (elem <= maxElem_)
  150.       {
  151.         data_[elem / BSize] &= ~GetMask(elem);
  152.       }
  153.     }
  154.  
  155.     public override bool Check(int elem)
  156.     {
  157.       return (elem <= maxElem_) && ((data_[elem / BSize] & GetMask(elem)) != 0);
  158.     }
  159.  
  160.     public static BitSet operator +(BitSet lSet, BitSet rSet)
  161.     {
  162.       int maxElem;
  163.       int length;
  164.       BitSet set;
  165.       if (lSet.maxElem_ > rSet.maxElem_)
  166.       {
  167.         maxElem = lSet.maxElem_;
  168.         length = rSet.data_.Length;
  169.         set = new(maxElem);
  170.         Array.Copy(lSet.data_, set.data_, length);
  171.       }
  172.       else
  173.       {
  174.         maxElem = rSet.maxElem_;
  175.         length = lSet.data_.Length;
  176.         set = new(maxElem);
  177.         Array.Copy(rSet.data_, set.data_, length);
  178.       }
  179.       for (int i = 0; i < length; ++i)
  180.       {
  181.         set.data_[i] = lSet.data_[i] | rSet.data_[i];
  182.       }
  183.       return set;
  184.     }
  185.  
  186.     public static BitSet operator *(BitSet lSet, BitSet rSet)
  187.     {
  188.       int maxElem = (lSet.maxElem_ > rSet.maxElem_) ? rSet.maxElem_ : lSet.maxElem_;
  189.       int length = (lSet.data_.Length > rSet.data_.Length) ? rSet.data_.Length : lSet.data_.Length;
  190.       BitSet set = new(maxElem);
  191.       for (int i = 0; i < length; ++i)
  192.       {
  193.         set.data_[i] = lSet.data_[i] & rSet.data_[i];
  194.       }
  195.       return set;
  196.     }
  197.  
  198.     private int GetMask(int elem)
  199.     {
  200.       return 1 << (BSize - elem % BSize);
  201.     }
  202.   }
  203.  
  204.   class MultiSet : Set
  205.   {
  206.     int[] data_;
  207.  
  208.     public MultiSet(int maxElem)
  209.     {
  210.       maxElem_ = maxElem;
  211.       data_ = new int[maxElem_ + 1];
  212.     }
  213.  
  214.     public override void Add(int elem)
  215.     {
  216.       CheckRange(elem);
  217.       ++data_[elem];
  218.     }
  219.  
  220.     public override void Remove(int elem)
  221.     {
  222.       if (elem <= maxElem_ && data_[elem] > 0)
  223.       {
  224.         --data_[elem];
  225.       }
  226.     }
  227.  
  228.     public override bool Check(int elem)
  229.     {
  230.       return (elem <= maxElem_) && (data_[elem] != 0);
  231.     }
  232.   }
  233.  
  234.   internal class Program
  235.   {
  236.     static int[] ReadFromFile(string fileName)
  237.     {
  238.       List<int> res = new();
  239.       string[] lines = File.ReadAllLines(Directory.GetCurrentDirectory() + "/" + fileName);
  240.       foreach (var line in lines)
  241.       {
  242.         res.Add(int.Parse(line));
  243.       }
  244.       return res.ToArray();
  245.     }
  246.  
  247.     static int Max(string str)
  248.     {
  249.       int maxElem = 0;
  250.       string[] nums = str.Split(' ');
  251.       foreach (var num in nums)
  252.       {
  253.         maxElem = (int.Parse(num) > maxElem) ? int.Parse(num) : maxElem;
  254.       }
  255.       return maxElem;
  256.     }
  257.  
  258.     static void DefaultTest()
  259.     {
  260.       const string inputWelcome =
  261.           "Введите:\n" +
  262.           "\tДобавить n - для включения элемента n в множество\n" +
  263.           "\tУдалить n - для исключения элемента n из множества\n" +
  264.           "\tПроверить n - для проверки наличия n в множестве\n" +
  265.           "\tВыход - для завершения программы";
  266.  
  267.       Console.WriteLine("Выберите способ представления:\n1.SimpleSet\n2.BitSet\n3.MultiSet");
  268.       string type = Console.ReadLine();
  269.       Console.WriteLine("Выберите способ ввода множества\n1.Файл\n2.Консоль");
  270.       string inputType = Console.ReadLine();
  271.       string cInput = "";
  272.       int[] fInput = new int[0];
  273.       int maxElem = 0;
  274.  
  275.       switch (inputType)
  276.       {
  277.         case "1":
  278.           Console.WriteLine("Введите имя файла");
  279.           fInput = ReadFromFile(Console.ReadLine());
  280.           maxElem = fInput.Max();
  281.           break;
  282.         case "2":
  283.           Console.WriteLine("Введите список элементов множества");
  284.           cInput = Console.ReadLine();
  285.           maxElem = Max(cInput);
  286.           break;
  287.         default:
  288.           Console.WriteLine("Некорректный ввод");
  289.           return;
  290.       }
  291.  
  292.       Set set;
  293.       switch (type)
  294.       {
  295.         case "1":
  296.           set = new SimpleSet(maxElem);
  297.           break;
  298.         case "2":
  299.           set = new BitSet(maxElem);
  300.           break;
  301.         case "3":
  302.           set = new MultiSet(maxElem);
  303.           break;
  304.         default:
  305.           Console.WriteLine($"{type} - неизвестный тип множества!");
  306.           return;
  307.       }
  308.  
  309.       switch (inputType)
  310.       {
  311.         case "1":
  312.           set.Fill(fInput);
  313.           break;
  314.         case "2":
  315.           set.Fill(cInput);
  316.           break;
  317.       }
  318.  
  319.       Console.WriteLine("Множество:\n" + set.ToString());
  320.  
  321.       Console.WriteLine(inputWelcome);
  322.       while (true)
  323.       {
  324.         string[] input = Console.ReadLine().Split(' ');
  325.         if (input.Length == 0)
  326.         {
  327.           return;
  328.         }
  329.         string cmd = input[0];
  330.         switch (cmd)
  331.         {
  332.           case "Добавить":
  333.             if (input.Length > 1)
  334.             {
  335.               set.Add(int.Parse(input[1]));
  336.               Console.WriteLine(set.ToString());
  337.             }
  338.             else
  339.             {
  340.               Console.WriteLine("Некорректный ввод");
  341.             }
  342.             break;
  343.           case "Удалить":
  344.             if (input.Length > 1)
  345.             {
  346.               set.Remove(int.Parse(input[1]));
  347.               Console.WriteLine(set.ToString());
  348.             }
  349.             else
  350.             {
  351.               Console.WriteLine("Некорректный ввод");
  352.             }
  353.             break;
  354.           case "Проверить":
  355.             if (input.Length > 1)
  356.             {
  357.               string tmp = set.Check(int.Parse(input[1])) ? "присутствует" : "отсутствует";
  358.               Console.WriteLine($"Элемент {tmp} в множестве");
  359.             }
  360.             else
  361.             {
  362.               Console.WriteLine("Некорректный ввод");
  363.             }
  364.             break;
  365.           case "Выход":
  366.             Console.WriteLine("Множество:\n" + set.ToString());
  367.             return;
  368.           default:
  369.             Console.WriteLine(inputWelcome);
  370.             break;
  371.         }
  372.       }
  373.     }
  374.  
  375.     static void OperatorTest()
  376.     {
  377.       string aInput = "", bInput = "";
  378.       Console.WriteLine("Введите множество A");
  379.       aInput = Console.ReadLine();
  380.       Console.WriteLine("Введите множество B");
  381.       bInput = Console.ReadLine();
  382.       int aMax = Max(aInput), bMax = Max(bInput);
  383.       SimpleSet sSetA = new(aMax), sSetB = new(bMax);
  384.       sSetA.Fill(aInput);
  385.       sSetB.Fill(bInput);
  386.       BitSet bSetA = new(aMax), bSetB = new(bMax);
  387.       bSetA.Fill(aInput);
  388.       bSetB.Fill(bInput);
  389.       Console.WriteLine();
  390.  
  391.       SimpleSet sSetC = sSetA + sSetB;
  392.       Console.WriteLine("Множество C для логического представления:\n" + sSetC.ToString());
  393.       SimpleSet sSetD = sSetA * sSetB;
  394.       Console.WriteLine("Множество D для логического представления:\n" + sSetD.ToString());
  395.  
  396.       Console.WriteLine();
  397.  
  398.       BitSet bSetC = bSetA + bSetB;
  399.       Console.WriteLine("Множество C для битового представления:\n" + sSetC.ToString());
  400.       BitSet bSetD = bSetA * bSetB;
  401.       Console.WriteLine("Множество D для битового представления:\n" + sSetD.ToString());
  402.     }
  403.  
  404.     static void Main(string[] args)
  405.     {
  406.       //DefaultTest();
  407.       //Console.WriteLine();
  408.       OperatorTest();
  409.     }
  410.   }
  411. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement