Advertisement
VladSmirN

lab_C#_3.1

Mar 11th, 2022
909
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.87 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text.RegularExpressions;
  5. using System.IO;
  6.  
  7. namespace SYATP2
  8. {
  9.     class BeyondBordersException : Exception
  10.     {
  11.         public BeyondBordersException()
  12.         {
  13.              
  14.             Console.WriteLine("Выход за пределы множества");
  15.         }
  16.     }
  17.  
  18.     abstract class Set
  19.     {
  20.         public int UpperItem;
  21.        
  22.         public abstract void AddItem(int item);
  23.         public abstract void DeleteItem(int item);
  24.         public abstract bool CheckItem(int item);
  25.          
  26.         public void validateItem(int item)
  27.         {
  28.             if (item > UpperItem) throw new BeyondBordersException();
  29.         }
  30.         public void Fill(string rowString)
  31.         {
  32.             int[] rowMassive = rowString.Split(' ').Select(x => int.Parse(x)).ToArray();
  33.             Fill(rowMassive);
  34.         }
  35.         public void Fill(int[] rowMassive)
  36.         {
  37.             foreach (int rowItem in rowMassive) AddItem(rowItem);
  38.         }
  39.        
  40.         public void Show()
  41.         {
  42.             for (int i = 0; i <= UpperItem; i++)
  43.                 if (CheckItem(i)) Console.Write(i + " ");
  44.             Console.WriteLine();
  45.         }
  46.  
  47.     }
  48.     class SimpleSet : Set
  49.     {
  50.        
  51.         bool[] setItems;
  52.    
  53.         public override void AddItem(int item)
  54.         {
  55.             validateItem(item);
  56.             setItems[item] = true;
  57.         }
  58.         public override void DeleteItem(int item)
  59.         {
  60.  
  61.             validateItem(item);
  62.  
  63.             setItems[item] = false;
  64.         }
  65.         public override bool CheckItem(int item)
  66.         {
  67.             validateItem(item);
  68.             return (setItems[item]);
  69.         }
  70.         public SimpleSet(int max)
  71.         {
  72.             UpperItem = max;
  73.             setItems = new bool[UpperItem + 1];
  74.         }
  75.         public static SimpleSet operator +(SimpleSet a, SimpleSet b)
  76.         {
  77.             SimpleSet c = new SimpleSet(Math.Max(a.UpperItem, b.UpperItem));
  78.  
  79.             for (int i = 1; i <= a.UpperItem; i++) c.setItems[i] = a.setItems[i];
  80.             for (int i = 1; i <= b.UpperItem; i++) c.setItems[i] = b.setItems[i] || c.setItems[i];
  81.  
  82.             return c;
  83.         }
  84.         public static SimpleSet operator *(SimpleSet a, SimpleSet b)
  85.         {
  86.             SimpleSet c = new SimpleSet(Math.Max(a.UpperItem, b.UpperItem));
  87.  
  88.             for (int i = 1; i <= c.UpperItem; i++) c.setItems[i] = a.setItems[i] && b.setItems[i];
  89.  
  90.             return c;
  91.         }
  92.     }
  93.     class BitSet : Set
  94.     {
  95.    
  96.         int[] setItems;
  97.         int mask = 0;
  98.  
  99.         public override void AddItem(int item)
  100.         {
  101.             validateItem(item);
  102.  
  103.             int idx = item / 32;
  104.             int n = item % 32;
  105.             mask = 1 << n;
  106.             setItems[idx] = (setItems[idx] | mask);
  107.             mask = 0;
  108.  
  109.         }
  110.         public override void DeleteItem( int item)
  111.         {
  112.  
  113.             validateItem(item);
  114.  
  115.             int idx = item / 32;
  116.             int n = item % 32;
  117.             mask = 1 << n;
  118.             mask = ~mask;
  119.             setItems[idx] = setItems[idx] & mask;
  120.  
  121.         }
  122.         public override bool CheckItem(int item)
  123.         {
  124.  
  125.             validateItem(item);
  126.  
  127.             int idx = item / 32;
  128.             int n = item % 32;
  129.             mask = 1 << n;
  130.             return ((setItems[idx] & mask) != 0);
  131.  
  132.         }
  133.         public BitSet(int max)
  134.         {
  135.             UpperItem = max;
  136.             setItems = new int[(max / 32) + 1];
  137.         }
  138.         public static BitSet operator +(BitSet a, BitSet b)
  139.         {
  140.  
  141.             BitSet c = new BitSet(Math.Max(a.UpperItem, b.UpperItem));
  142.             for (int i = 0; i < c.setItems.Length; i++)
  143.                 if(i > a.setItems.Length) c.setItems[i] = b.setItems[i];
  144.                    else
  145.                     if (i > b.setItems.Length) c.setItems[i] = b.setItems[i];
  146.                         else
  147.                             c.setItems[i] = a.setItems[i] | b.setItems[i];
  148.             return c;
  149.  
  150.         }
  151.         public static BitSet operator *(BitSet a, BitSet b)
  152.         {
  153.            
  154.             BitSet c = new BitSet(Math.Min(a.UpperItem, b.UpperItem)  );
  155.             for (int i = 0; i < c.setItems.Length; i++) c.setItems[i] = a.setItems[i] & b.setItems[i];
  156.  
  157.             return c;
  158.         }
  159.  
  160.     }
  161.     class MultiSet : Set
  162.     {
  163.         int[] setItems;
  164.    
  165.         public override void AddItem(int item)
  166.         {
  167.             validateItem(item);
  168.             setItems[item]++;
  169.         }
  170.         public override void DeleteItem(int item)
  171.         {
  172.  
  173.             validateItem(item);
  174.             if (setItems[item] != 0) setItems[item]--;
  175.  
  176.         }
  177.         public override bool CheckItem(int item)
  178.         {
  179.             validateItem(item);
  180.             return (setItems[item] > 0);
  181.         }
  182.         public MultiSet(int max)
  183.         {
  184.             UpperItem = max;
  185.             setItems = new int[UpperItem + 1];
  186.         }
  187.  
  188.     }
  189.  
  190.     class Program
  191.     {
  192.  
  193.         static void Test()
  194.         {
  195.             Console.WriteLine("Введите первое множество");
  196.             string buf1 = Console.ReadLine();
  197.  
  198.             Console.WriteLine("Введите второе множество");
  199.             string buf2 = Console.ReadLine();
  200.             SimpleSet A = new SimpleSet(50);
  201.             A.Fill(buf1);
  202.             SimpleSet B = new SimpleSet(50);
  203.             B.Fill(buf2);
  204.             SimpleSet C = new SimpleSet(50);
  205.             C = A * B;
  206.             SimpleSet D = new SimpleSet(50);
  207.             D = A + B;
  208.             C.Show();
  209.             D.Show();
  210.             BitSet A_ = new BitSet(50);
  211.             A_.Fill(buf1);
  212.             BitSet B_ = new BitSet(50);
  213.             B_.Fill(buf2);
  214.             BitSet C_ = new BitSet(50);
  215.             C_ = A_ * B_;
  216.             BitSet D_ = new BitSet(50);
  217.             D_ = A_ + B_;
  218.             C_.Show();
  219.             D_.Show();
  220.         }
  221.         static void Main(string[] args)
  222.         {
  223.             Set set = new SimpleSet(1);
  224.             Console.WriteLine("Выберете тип множества:\n1-логический массив\n2-битовый массив\n3-мультимножество");
  225.  
  226.             string buf = Console.ReadLine();
  227.             int typeSet = Int32.Parse(buf);
  228.  
  229.            
  230.  
  231.             switch (typeSet)
  232.             {
  233.                 case 1:set = new SimpleSet(100);break;
  234.                 case 2:set = new BitSet(100);break;
  235.                 case 3:set = new MultiSet(100);break;
  236.             }
  237.  
  238.             while (true)
  239.             {
  240.                 try
  241.                 {
  242.                     Console.WriteLine("Введите строку с элементами");
  243.                     string rowItemsStr = Console.ReadLine();
  244.                     set.Fill(rowItemsStr);
  245.                     break;
  246.                 }
  247.                 catch (BeyondBordersException e)
  248.                 {
  249.                     Console.WriteLine(e.Message);
  250.                      
  251.                 }
  252.             }
  253.  
  254.             int typeOperation = 0;
  255.             while (typeOperation != 4)
  256.             {
  257.  
  258.                 try
  259.                 {
  260.                 set.Show();
  261.                 Console.WriteLine("\n1-добавить в множество элемент\n2-исключить элемент из множества\n3-проверить наличие элемента\n4-выход");
  262.                 buf = Console.ReadLine();
  263.                 typeOperation = Int32.Parse(buf);
  264.                 int item;
  265.                 switch (typeOperation)
  266.                 {
  267.                     case 1:
  268.  
  269.                             Console.WriteLine("Введите элемент");
  270.                             buf = Console.ReadLine();
  271.                             item = Int32.Parse(buf);
  272.                             set.AddItem(item);
  273.  
  274.                         break;
  275.  
  276.                     case 2:
  277.                         Console.WriteLine("Введите элемент");
  278.                         buf = Console.ReadLine();
  279.                         item = Int32.Parse(buf);
  280.                         set.DeleteItem(item);
  281.  
  282.                         break;
  283.                     case 3:
  284.                         Console.WriteLine("Введите элемент");
  285.                         buf = Console.ReadLine();
  286.                         item = Int32.Parse(buf);
  287.                         if (set.CheckItem(item)) Console.WriteLine("Элемент присутствует");
  288.                         else Console.WriteLine("Элемент отсутствует");
  289.  
  290.                         break;
  291.  
  292.                 }
  293.                 }
  294.                 catch (BeyondBordersException e)
  295.                 {
  296.                     Console.WriteLine(e.Message);
  297.                 }
  298.  
  299.  
  300.             }
  301.             Test();
  302.         }
  303.     }
  304. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement