constk

Тема 7, обобщения для Антона

Oct 13th, 2021
904
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2. using System.Text;
  3.  
  4. namespace Task1
  5. {
  6.     public class DynamicArray<T> where T : new()
  7.     {
  8.         private T[] _arr;
  9.         private int _length;
  10.  
  11.         public int Length
  12.         {
  13.             get => _length;
  14.             private set
  15.             {
  16.                 if (value < 0)
  17.                     throw new ArgumentException("Длина не может быть меньше 0!");
  18.  
  19.                 _length = value;
  20.             }
  21.         }
  22.         public int Capacity { get => _arr.Length; }
  23.  
  24.         public DynamicArray(int size)
  25.         {
  26.             if (size <= 0)
  27.                 throw new ArgumentException("Нельзя создать массив длиной меньше 1!");
  28.  
  29.             _arr = new T[size];
  30.             Length = 0;
  31.         }
  32.  
  33.         public DynamicArray() : this(8) { }
  34.  
  35.         public DynamicArray(T[] arr) : this(arr.Length)
  36.         {
  37.             if (arr == null)
  38.                 throw new ArgumentNullException("Нельзя создать null-массив!");
  39.  
  40.             Array.Copy(arr, _arr, Capacity);
  41.             Length = arr.Length;
  42.         }
  43.  
  44.  
  45.         public void Add(T element)
  46.         {
  47.             if (Length == Capacity)
  48.                 IncreaseMemory(Capacity);
  49.  
  50.             _arr[Length++] = element;
  51.         }
  52.  
  53.         public void AddRange(T[] arr)
  54.         {
  55.             if (arr == null)
  56.                 throw new ArgumentNullException("Нельзя добавить null-массив!");
  57.  
  58.             int memoryToAdd = Length + arr.Length - Capacity;
  59.             IncreaseMemory(memoryToAdd);
  60.  
  61.             Array.Copy(arr, 0, _arr, Length, arr.Length);
  62.  
  63.             Length += arr.Length;
  64.         }
  65.  
  66.         public bool Remove(T element)
  67.         {
  68.             if (Length == 0)
  69.                 return false;
  70.  
  71.             int indexToRemove = Array.IndexOf(_arr, element);
  72.             if (indexToRemove == -1)
  73.                 return false;
  74.  
  75.             Array.Copy(_arr, indexToRemove + 1, _arr, indexToRemove, Length - indexToRemove - 1);
  76.             --Length;
  77.  
  78.             return true;
  79.         }
  80.  
  81.         public void Insert(T element, int position)
  82.         {
  83.             if (position < 0 || position >= Length)
  84.                 throw new ArgumentOutOfRangeException("Нельзя вставить элемент в эту позицию!");
  85.  
  86.             ++Length;
  87.             Array.Copy(_arr, position, _arr, position + 1, Length - position);
  88.             _arr[position] = element;
  89.         }
  90.  
  91.         public T this[int i]
  92.         {
  93.             get
  94.             {
  95.                 if (i < 0 || i >= Length)
  96.                     throw new ArgumentOutOfRangeException("Нельзя вставить элемент в эту позицию!");
  97.                 return _arr[i];
  98.             }
  99.             set
  100.             {
  101.                 if (i < 0 || i >= Length)
  102.                     throw new ArgumentOutOfRangeException("Нельзя вставить элемент в эту позицию!");
  103.                 _arr[i] = value;
  104.             }
  105.         }
  106.  
  107.         public override string ToString()
  108.         {
  109.             StringBuilder sb = new StringBuilder("Массив ёмкостью " + Capacity + " из " + Length + " элементов: " + Environment.NewLine);
  110.             for (int i = 0; i < Length; ++i)
  111.                 sb.Append(_arr[i] + " ");
  112.  
  113.             return sb.ToString();
  114.         }
  115.  
  116.         private void IncreaseMemory(int memory)
  117.         {
  118.             T[] tmp = _arr;
  119.             _arr = new T[tmp.Length + memory];
  120.             Array.Copy(tmp, _arr, Length);
  121.         }
  122.     }
  123.  
  124.     class Program
  125.     {
  126.         static void Main(string[] args)
  127.         {
  128.             Console.WriteLine("Привет! Это программа для работы с " +
  129.                 "обобщённым динамическим массивом. Развлекайтесь!");
  130.  
  131.             Console.WriteLine("Создание массива...");
  132.             int[] intArr = { 1, 2, 3, 4, 5 };
  133.             DynamicArray<int> dynamicArr = new DynamicArray<int>(intArr);
  134.  
  135.             Console.WriteLine(dynamicArr + Environment.NewLine);
  136.  
  137.             Console.WriteLine("Добавление элементов...");
  138.             for (int i = 6; i < 30; ++i)
  139.                 dynamicArr.Add(i);
  140.  
  141.             Console.WriteLine(dynamicArr + Environment.NewLine);
  142.  
  143.             Console.WriteLine("Удаление элемента 25...");
  144.             dynamicArr.Remove(25);
  145.  
  146.             Console.WriteLine(dynamicArr + Environment.NewLine);
  147.  
  148.             Console.WriteLine("Пересоздание массива...");
  149.             dynamicArr = new DynamicArray<int>(4);
  150.  
  151.             Console.WriteLine("Добавление массива...");
  152.             for (int i = 0; i < 5; ++i)
  153.                 dynamicArr.AddRange(new int[] { -1, -1, i });
  154.  
  155.             Console.WriteLine(dynamicArr + Environment.NewLine);
  156.  
  157.             Console.WriteLine("Удаление элементов...");
  158.             while (dynamicArr.Remove(-1)) { }
  159.  
  160.             Console.WriteLine(dynamicArr + Environment.NewLine);
  161.  
  162.             Console.WriteLine("Вставка элемента 55 по индексу 2...");
  163.             dynamicArr.Insert(55, 2);
  164.  
  165.             Console.WriteLine(dynamicArr + Environment.NewLine);
  166.  
  167.             Console.WriteLine("Задание элементов массива через индексаторы...");
  168.             for (int i = 0; i < dynamicArr.Length; ++i)
  169.                 dynamicArr[i] = i * 2;
  170.  
  171.             Console.WriteLine(dynamicArr + Environment.NewLine);
  172.         }
  173.     }
  174. }
  175.  
RAW Paste Data